diff --git a/deps/icu-small/LICENSE b/deps/icu-small/LICENSE index 5a2eda629500..fec99457b941 100644 --- a/deps/icu-small/LICENSE +++ b/deps/icu-small/LICENSE @@ -2,7 +2,7 @@ UNICODE LICENSE V3 COPYRIGHT AND PERMISSION NOTICE -Copyright © 2016-2025 Unicode, Inc. +Copyright © 1991-2026 Unicode, Inc. NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR diff --git a/deps/icu-small/README-FULL-ICU.txt b/deps/icu-small/README-FULL-ICU.txt index 882e0f28b624..c7ecb26f30a9 100644 --- a/deps/icu-small/README-FULL-ICU.txt +++ b/deps/icu-small/README-FULL-ICU.txt @@ -1,8 +1,8 @@ ICU sources - auto generated by shrink-icu-src.py This directory contains the ICU subset used by --with-intl=full-icu -It is a strict subset of ICU 78 source files with the following exception(s): -* deps/icu-small/source/data/in/icudt78l.dat.bz2 : compressed data file +It is a strict subset of ICU 79 source files with the following exception(s): +* deps/icu-small/source/data/in/icudt79l.dat.bz2 : compressed data file To rebuild this directory, see ../../tools/icu/README.md diff --git a/deps/icu-small/source/.clang-format b/deps/icu-small/source/.clang-format index 83cbf646a43d..a45d0fc26ffb 100644 --- a/deps/icu-small/source/.clang-format +++ b/deps/icu-small/source/.clang-format @@ -5,7 +5,7 @@ Language: Cpp BasedOnStyle: LLVM IndentWidth: 4 -ColumnLimit: 105 +ColumnLimit: 100 AllowShortBlocksOnASingleLine: false AllowShortIfStatementsOnASingleLine: true ... diff --git a/deps/icu-small/source/common/BUILD.bazel b/deps/icu-small/source/common/BUILD.bazel index e894ed907e6e..959e20da994b 100644 --- a/deps/icu-small/source/common/BUILD.bazel +++ b/deps/icu-small/source/common/BUILD.bazel @@ -36,6 +36,9 @@ cc_library( # Bazel workspace: # https://stackoverflow.com/a/65635893/2077918 includes = ["."], + defines = [ + "U_DEBUG", # enable U_ASSERT() + ], local_defines = [ "U_COMMON_IMPLEMENTATION", ], diff --git a/deps/icu-small/source/common/appendable.cpp b/deps/icu-small/source/common/appendable.cpp index de18148fe6d6..c59d02298828 100644 --- a/deps/icu-small/source/common/appendable.cpp +++ b/deps/icu-small/source/common/appendable.cpp @@ -56,11 +56,12 @@ Appendable::reserveAppendCapacity(int32_t /*appendCapacity*/) { return true; } -char16_t * +char16_t* Appendable::getAppendBuffer(int32_t minCapacity, int32_t /*desiredCapacityHint*/, - char16_t *scratch, int32_t scratchCapacity, - int32_t *resultCapacity) { + char16_t* scratch U_LIFETIME_BOUND, + int32_t scratchCapacity, + int32_t* resultCapacity) U_LIFETIME_BOUND { if(minCapacity<1 || scratchCapacitykMaxBranchLinearSubNodeLength) { ++pos; // ignore the comparison byte if(nullptr==findUniqueValueFromBranch(jumpByDelta(pos), length>>1, haveUniqueValue, uniqueValue)) { diff --git a/deps/icu-small/source/common/bytestriebuilder.cpp b/deps/icu-small/source/common/bytestriebuilder.cpp index 03bbc28e6577..c11aaad5fd50 100644 --- a/deps/icu-small/source/common/bytestriebuilder.cpp +++ b/deps/icu-small/source/common/bytestriebuilder.cpp @@ -39,7 +39,7 @@ class BytesTrieElement : public UMemory { void setTo(StringPiece s, int32_t val, CharString &strings, UErrorCode &errorCode); - StringPiece getString(const CharString &strings) const { + StringPiece getString(const CharString& strings U_LIFETIME_BOUND) const { int32_t offset=stringOffset; int32_t length; if(offset>=0) { @@ -68,7 +68,7 @@ class BytesTrieElement : public UMemory { int32_t compareStringTo(const BytesTrieElement &o, const CharString &strings) const; private: - const char *data(const CharString &strings) const { + const char* data(const CharString& strings U_LIFETIME_BOUND) const { int32_t offset=stringOffset; if(offset>=0) { ++offset; @@ -144,8 +144,8 @@ BytesTrieBuilder::~BytesTrieBuilder() { uprv_free(bytes); } -BytesTrieBuilder & -BytesTrieBuilder::add(StringPiece s, int32_t value, UErrorCode &errorCode) { +BytesTrieBuilder& +BytesTrieBuilder::add(StringPiece s, int32_t value, UErrorCode& errorCode) U_LIFETIME_BOUND { if(U_FAILURE(errorCode)) { return *this; } @@ -206,7 +206,8 @@ BytesTrieBuilder::build(UStringTrieBuildOption buildOption, UErrorCode &errorCod } StringPiece -BytesTrieBuilder::buildStringPiece(UStringTrieBuildOption buildOption, UErrorCode &errorCode) { +BytesTrieBuilder::buildStringPiece(UStringTrieBuildOption buildOption, + UErrorCode& errorCode) U_LIFETIME_BOUND { buildBytes(buildOption, errorCode); StringPiece result; if(U_SUCCESS(errorCode)) { @@ -269,8 +270,8 @@ BytesTrieBuilder::buildBytes(UStringTrieBuildOption buildOption, UErrorCode &err } } -BytesTrieBuilder & -BytesTrieBuilder::clear() { +BytesTrieBuilder& +BytesTrieBuilder::clear() U_LIFETIME_BOUND { strings->clear(); elementsLength=0; bytesLength=0; diff --git a/deps/icu-small/source/common/bytestrieiterator.cpp b/deps/icu-small/source/common/bytestrieiterator.cpp index b60806f1f357..35747c6458d1 100644 --- a/deps/icu-small/source/common/bytestrieiterator.cpp +++ b/deps/icu-small/source/common/bytestrieiterator.cpp @@ -22,8 +22,9 @@ U_NAMESPACE_BEGIN -BytesTrie::Iterator::Iterator(const void *trieBytes, int32_t maxStringLength, - UErrorCode &errorCode) +BytesTrie::Iterator::Iterator(const void* trieBytes U_LIFETIME_BOUND, + int32_t maxStringLength, + UErrorCode& errorCode) : bytes_(static_cast(trieBytes)), pos_(bytes_), initialPos_(bytes_), remainingMatchLength_(-1), initialRemainingMatchLength_(-1), @@ -80,8 +81,8 @@ BytesTrie::Iterator::~Iterator() { delete stack_; } -BytesTrie::Iterator & -BytesTrie::Iterator::reset() { +BytesTrie::Iterator& +BytesTrie::Iterator::reset() U_LIFETIME_BOUND { pos_=initialPos_; remainingMatchLength_=initialRemainingMatchLength_; int32_t length=remainingMatchLength_+1; // Remaining match length. @@ -169,7 +170,7 @@ BytesTrie::Iterator::next(UErrorCode &errorCode) { } StringPiece -BytesTrie::Iterator::getString() const { +BytesTrie::Iterator::getString() const U_LIFETIME_BOUND { return str_ == nullptr ? StringPiece() : str_->toStringPiece(); } @@ -181,8 +182,10 @@ BytesTrie::Iterator::truncateAndStop() { } // Branch node, needs to take the first outbound edge and push state for the rest. -const uint8_t * -BytesTrie::Iterator::branchNext(const uint8_t *pos, int32_t length, UErrorCode &errorCode) { +const uint8_t* +BytesTrie::Iterator::branchNext(const uint8_t* pos U_LIFETIME_BOUND, + int32_t length, + UErrorCode& errorCode) { while(length>kMaxBranchLinearSubNodeLength) { ++pos; // ignore the comparison byte // Push state for the greater-or-equal edge. diff --git a/deps/icu-small/source/common/caniter.cpp b/deps/icu-small/source/common/caniter.cpp index 1b2bc2ada0c9..fd9640df2cda 100644 --- a/deps/icu-small/source/common/caniter.cpp +++ b/deps/icu-small/source/common/caniter.cpp @@ -440,8 +440,10 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i return finalResult; } -Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const char16_t *segment, int32_t segLen, UErrorCode &status) { - +Hashtable* CanonicalIterator::getEquivalents2(Hashtable* fillinResult U_LIFETIME_BOUND, + const char16_t* segment, + int32_t segLen, + UErrorCode& status) { if (U_FAILURE(status)) { return nullptr; } @@ -518,7 +520,12 @@ Hashtable *CanonicalIterator::getEquivalents2(Hashtable *fillinResult, const cha * (with canonical rearrangement!) * If so, take the remainder, and return the equivalents */ -Hashtable *CanonicalIterator::extract(Hashtable *fillinResult, UChar32 comp, const char16_t *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status) { +Hashtable* CanonicalIterator::extract(Hashtable* fillinResult U_LIFETIME_BOUND, + UChar32 comp, + const char16_t* segment, + int32_t segLen, + int32_t segmentPos, + UErrorCode& status) { //Hashtable *CanonicalIterator::extract(UChar32 comp, const UnicodeString &segment, int32_t segLen, int32_t segmentPos, UErrorCode &status) { //if (PROGRESS) printf(" extract: %s, ", UToS(Tr(UnicodeString(comp)))); //if (PROGRESS) printf("%s, %i\n", UToS(Tr(segment)), segmentPos); diff --git a/deps/icu-small/source/common/chariter.cpp b/deps/icu-small/source/common/chariter.cpp index 16f3b1e14d0b..565ce69cf28c 100644 --- a/deps/icu-small/source/common/chariter.cpp +++ b/deps/icu-small/source/common/chariter.cpp @@ -73,8 +73,8 @@ textLength(that.textLength), pos(that.pos), begin(that.begin), end(that.end) { } -CharacterIterator & -CharacterIterator::operator=(const CharacterIterator &that) { +CharacterIterator& +CharacterIterator::operator=(const CharacterIterator& that) U_LIFETIME_BOUND { ForwardCharacterIterator::operator=(that); textLength = that.textLength; pos = that.pos; diff --git a/deps/icu-small/source/common/charstr.cpp b/deps/icu-small/source/common/charstr.cpp index dadc829b0b56..f956c419d84e 100644 --- a/deps/icu-small/source/common/charstr.cpp +++ b/deps/icu-small/source/common/charstr.cpp @@ -21,6 +21,7 @@ #include "charstr.h" #include "cmemory.h" #include "cstring.h" +#include "putilimp.h" #include "uinvchar.h" #include "ustr_imp.h" @@ -111,7 +112,15 @@ CharString &CharString::truncate(int32_t newLength) { } CharString &CharString::append(char c, UErrorCode &errorCode) { - if(ensureCapacity(len+2, 0, errorCode)) { + if(U_FAILURE(errorCode)) { + return *this; + } + int32_t newCapacity; + if (uprv_add32_overflow(len, 2, &newCapacity)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if(ensureCapacity(newCapacity, 0, errorCode)) { buffer[len++]=c; buffer[len]=0; } @@ -138,15 +147,21 @@ CharString &CharString::append(const char *s, int32_t sLength, UErrorCode &error } else { buffer[len+=sLength]=0; } - } else if(buffer.getAlias()<=s && s<(buffer.getAlias()+len) && - sLength>=(buffer.getCapacity()-len) - ) { - // (Part of) this string is appended to itself which requires reallocation, - // so we have to make a copy of the substring and append that. - return append(CharString(s, sLength, errorCode), errorCode); - } else if(ensureCapacity(len+sLength+1, 0, errorCode)) { - uprv_memcpy(buffer.getAlias()+len, s, sLength); - buffer[len+=sLength]=0; + } else { + int32_t newCapacity; + if(uprv_add32_overflow(len, sLength, &newCapacity) || + uprv_add32_overflow(newCapacity, 1, &newCapacity)) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + } else if(buffer.getAlias()<=s && s<(buffer.getAlias()+len) && + newCapacity>buffer.getCapacity() + ) { + // (Part of) this string is appended to itself which requires reallocation, + // so we have to make a copy of the substring and append that. + return append(CharString(s, sLength, errorCode), errorCode); + } else if(ensureCapacity(newCapacity, 0, errorCode)) { + uprv_memcpy(buffer.getAlias()+len, s, sLength); + buffer[len+=sLength]=0; + } } } return *this; @@ -192,12 +207,30 @@ char *CharString::getAppendBuffer(int32_t minCapacity, resultCapacity=0; return nullptr; } + if(minCapacity<0 || desiredCapacityHint<0) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + resultCapacity=0; + return nullptr; + } int32_t appendCapacity=buffer.getCapacity()-len-1; // -1 for NUL if(appendCapacity>=minCapacity) { resultCapacity=appendCapacity; return buffer.getAlias()+len; } - if(ensureCapacity(len+minCapacity+1, len+desiredCapacityHint+1, errorCode)) { + int32_t newCapacity; + if(uprv_add32_overflow(len, minCapacity, &newCapacity) || + uprv_add32_overflow(newCapacity, 1, &newCapacity)) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + resultCapacity=0; + return nullptr; + } + int32_t newDesiredCapacity = 0; + if(desiredCapacityHint > 0 && + (uprv_add32_overflow(len, desiredCapacityHint, &newDesiredCapacity) || + uprv_add32_overflow(newDesiredCapacity, 1, &newDesiredCapacity))) { + newDesiredCapacity = 0; + } + if(ensureCapacity(newCapacity, newDesiredCapacity, errorCode)) { resultCapacity=buffer.getCapacity()-len-1; return buffer.getAlias()+len; } @@ -213,11 +246,21 @@ CharString &CharString::appendInvariantChars(const char16_t* uchars, int32_t uch if(U_FAILURE(errorCode)) { return *this; } + if(ucharsLen < 0 || (uchars == nullptr && ucharsLen != 0)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } if (!uprv_isInvariantUString(uchars, ucharsLen)) { errorCode = U_INVARIANT_CONVERSION_ERROR; return *this; } - if(ensureCapacity(len+ucharsLen+1, 0, errorCode)) { + int32_t newCapacity; + if (uprv_add32_overflow(len, ucharsLen, &newCapacity) || + uprv_add32_overflow(newCapacity, 1, &newCapacity)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return *this; + } + if(ensureCapacity(newCapacity, 0, errorCode)) { u_UCharsToChars(uchars, buffer.getAlias()+len, ucharsLen); len += ucharsLen; buffer[len] = 0; @@ -231,9 +274,17 @@ UBool CharString::ensureCapacity(int32_t capacity, if(U_FAILURE(errorCode)) { return false; } + if(capacity<0) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + return false; + } if(capacity>buffer.getCapacity()) { if(desiredCapacityHint==0) { - desiredCapacityHint=capacity+buffer.getCapacity(); + // Default growth heuristic. If it overflows, skip the extra headroom + // and allocate exactly the requested capacity, which is still valid. + if(uprv_add32_overflow(capacity, buffer.getCapacity(), &desiredCapacityHint)) { + desiredCapacityHint=0; + } } if( (desiredCapacityHint<=capacity || buffer.resize(desiredCapacityHint, len+1)==nullptr) && buffer.resize(capacity, len+1)==nullptr diff --git a/deps/icu-small/source/common/cmemory.h b/deps/icu-small/source/common/cmemory.h index e31c54aac709..fc0276fec58f 100644 --- a/deps/icu-small/source/common/cmemory.h +++ b/deps/icu-small/source/common/cmemory.h @@ -28,6 +28,7 @@ #include "unicode/utypes.h" +#include #include #include #include "unicode/localpointer.h" @@ -171,17 +172,23 @@ uprv_deleteUObject(void *obj); #ifdef __cplusplus +#include #include +#include #include "unicode/uobject.h" U_NAMESPACE_BEGIN /** * "Smart pointer" class, deletes memory via uprv_free(). + * ICU 79+: Use prv::make_unique & prv::make_unique_for_overwrite instead. + * * For most methods see the LocalPointerBase base class. * Adds operator[] for array item access. * * @see LocalPointerBase + * @see prv::make_unique + * @deprecated use prv::make_unique & prv::make_unique_for_overwrite */ template class LocalMemory : public LocalPointerBase { @@ -212,7 +219,7 @@ class LocalMemory : public LocalPointerBase { * @param src source smart pointer * @return *this */ - LocalMemory &operator=(LocalMemory &&src) noexcept { + LocalMemory& operator=(LocalMemory&& src) noexcept U_LIFETIME_BOUND { uprv_free(LocalPointerBase::ptr); LocalPointerBase::ptr=src.ptr; src.ptr=nullptr; @@ -252,7 +259,7 @@ class LocalMemory : public LocalPointerBase { * @param newCapacity must be >0 * @return the allocated array pointer, or nullptr if the allocation failed */ - inline T *allocateInsteadAndReset(int32_t newCapacity=1); + inline T* allocateInsteadAndReset(int32_t newCapacity = 1) U_LIFETIME_BOUND; /** * Deletes the array it owns and allocates a new one, copying length T items. * Returns the new array pointer. @@ -264,18 +271,18 @@ class LocalMemory : public LocalPointerBase { * which the caller must track because the LocalMemory does not track it * @return the allocated array pointer, or nullptr if the allocation failed */ - inline T *allocateInsteadAndCopy(int32_t newCapacity=1, int32_t length=0); + inline T* allocateInsteadAndCopy(int32_t newCapacity = 1, int32_t length = 0) U_LIFETIME_BOUND; /** * Array item access (writable). * No index bounds check. * @param i array index * @return reference to the array item */ - T &operator[](ptrdiff_t i) const { return LocalPointerBase::ptr[i]; } + T& operator[](ptrdiff_t i) const U_LIFETIME_BOUND { return LocalPointerBase::ptr[i]; } }; -template -inline T *LocalMemory::allocateInsteadAndReset(int32_t newCapacity) { +template +inline T* LocalMemory::allocateInsteadAndReset(int32_t newCapacity) U_LIFETIME_BOUND { if(newCapacity>0) { T *p=(T *)uprv_malloc(newCapacity*sizeof(T)); if(p!=nullptr) { @@ -289,9 +296,9 @@ inline T *LocalMemory::allocateInsteadAndReset(int32_t newCapacity) { } } - -template -inline T *LocalMemory::allocateInsteadAndCopy(int32_t newCapacity, int32_t length) { +template +inline T* LocalMemory::allocateInsteadAndCopy(int32_t newCapacity, + int32_t length) U_LIFETIME_BOUND { if(newCapacity>0) { T *p=(T *)uprv_malloc(newCapacity*sizeof(T)); if(p!=nullptr) { @@ -366,7 +373,8 @@ class MaybeStackArray { /** * Move assignment: transfers ownership or copies the stack array. */ - MaybeStackArray &operator=(MaybeStackArray &&src) noexcept; + MaybeStackArray& + operator=(MaybeStackArray&& src) noexcept U_LIFETIME_BOUND; /** * Returns the array capacity (number of T items). * @return array capacity @@ -376,12 +384,12 @@ class MaybeStackArray { * Access without ownership change. * @return the array pointer */ - T *getAlias() const { return ptr; } + T* getAlias() const U_LIFETIME_BOUND { return ptr; } /** * Returns the array limit. Simple convenience method. * @return getAlias()+getCapacity() */ - T *getArrayLimit() const { return getAlias()+capacity; } + T* getArrayLimit() const U_LIFETIME_BOUND { return getAlias() + capacity; } // No "operator T *() const" because that can make // expressions like mbs[index] ambiguous for some compilers. /** @@ -390,14 +398,14 @@ class MaybeStackArray { * @param i array index * @return reference to the array item */ - const T &operator[](ptrdiff_t i) const { return ptr[i]; } + const T& operator[](ptrdiff_t i) const U_LIFETIME_BOUND { return ptr[i]; } /** * Array item access (writable). * No index bounds check. * @param i array index * @return reference to the array item */ - T &operator[](ptrdiff_t i) { return ptr[i]; } + T& operator[](ptrdiff_t i) U_LIFETIME_BOUND { return ptr[i]; } /** * Deletes the array (if owned) and aliases another one, no transfer of ownership. * If the arguments are illegal, then the current array is unchanged. @@ -422,7 +430,7 @@ class MaybeStackArray { * @param length number of T items to be copied from the old array to the new one * @return the allocated array pointer, or nullptr if the allocation failed */ - inline T *resize(int32_t newCapacity, int32_t length=0); + inline T* resize(int32_t newCapacity, int32_t length = 0) U_LIFETIME_BOUND; /** * Gives up ownership of the array if owned, or else clones it, * copying length T items; resets itself to the internal stack array. @@ -483,9 +491,9 @@ icu::MaybeStackArray::MaybeStackArray( } } -template -inline MaybeStackArray & -MaybeStackArray::operator=(MaybeStackArray && src) noexcept { +template +inline MaybeStackArray& MaybeStackArray::operator=( + MaybeStackArray&& src) noexcept U_LIFETIME_BOUND { releaseArray(); // in case this instance had its own memory allocated capacity = src.capacity; needToRelease = src.needToRelease; @@ -499,8 +507,9 @@ MaybeStackArray::operator=(MaybeStackArray & return *this; } -template -inline T *MaybeStackArray::resize(int32_t newCapacity, int32_t length) { +template +inline T* MaybeStackArray::resize(int32_t newCapacity, + int32_t length) U_LIFETIME_BOUND { if(newCapacity>0) { #if U_DEBUG && defined(UPRV_MALLOC_COUNT) ::fprintf(::stderr, "MaybeStackArray (resize) alloc %d * %lu\n", newCapacity, sizeof(T)); @@ -587,30 +596,30 @@ class MaybeStackHeaderAndArray { * Access without ownership change. * @return the header pointer */ - H *getAlias() const { return ptr; } + H* getAlias() const U_LIFETIME_BOUND { return ptr; } /** * Returns the array start. * @return array start, same address as getAlias()+1 */ - T *getArrayStart() const { return reinterpret_cast(getAlias()+1); } + T* getArrayStart() const U_LIFETIME_BOUND { return reinterpret_cast(getAlias() + 1); } /** * Returns the array limit. * @return array limit */ - T *getArrayLimit() const { return getArrayStart()+capacity; } + T* getArrayLimit() const U_LIFETIME_BOUND { return getArrayStart() + capacity; } /** * Access without ownership change. Same as getAlias(). * A class instance can be used directly in expressions that take a T *. * @return the header pointer */ - operator H *() const { return ptr; } + operator H*() const U_LIFETIME_BOUND { return ptr; } /** * Array item access (writable). * No index bounds check. * @param i array index * @return reference to the array item */ - T &operator[](ptrdiff_t i) { return getArrayStart()[i]; } + T& operator[](ptrdiff_t i) U_LIFETIME_BOUND { return getArrayStart()[i]; } /** * Deletes the memory block (if owned) and aliases another one, no transfer of ownership. * If the arguments are illegal, then the current memory is unchanged. @@ -636,7 +645,7 @@ class MaybeStackHeaderAndArray { * @param length number of T items to be copied from the old array to the new one * @return the allocated pointer, or nullptr if the allocation failed */ - inline H *resize(int32_t newCapacity, int32_t length=0); + inline H* resize(int32_t newCapacity, int32_t length = 0) U_LIFETIME_BOUND; /** * Gives up ownership of the memory if owned, or else clones it, * copying the header and length T array items; resets itself to the internal memory. @@ -668,9 +677,9 @@ class MaybeStackHeaderAndArray { void operator=(const MaybeStackHeaderAndArray & /*other*/) {} }; -template -inline H *MaybeStackHeaderAndArray::resize(int32_t newCapacity, - int32_t length) { +template +inline H* MaybeStackHeaderAndArray::resize(int32_t newCapacity, + int32_t length) U_LIFETIME_BOUND { if(newCapacity>=0) { #if U_DEBUG && defined(UPRV_MALLOC_COUNT) ::fprintf(::stderr,"MaybeStackHeaderAndArray alloc %d + %d * %ul\n", sizeof(H),newCapacity,sizeof(T)); @@ -769,7 +778,7 @@ class MemoryPool : public UMemory { other.fCount = 0; } - MemoryPool& operator=(MemoryPool&& other) noexcept { + MemoryPool& operator=(MemoryPool&& other) noexcept U_LIFETIME_BOUND { // Since `this` may contain instances that need to be deleted, we can't // just throw them away and replace them with `other`. The normal way of // dealing with this in C++ is to swap `this` and `other`, rather than @@ -788,8 +797,8 @@ class MemoryPool : public UMemory { * @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) { + template + T* create(Args&&... args) U_LIFETIME_BOUND { int32_t capacity = fPool.getCapacity(); if (fCount == capacity && fPool.resize(capacity == stackCapacity ? 4 * capacity : 2 * capacity, @@ -800,7 +809,7 @@ class MemoryPool : public UMemory { } template - T* createAndCheckErrorCode(UErrorCode &status, Args &&... args) { + T* createAndCheckErrorCode(UErrorCode& status, Args&&... args) U_LIFETIME_BOUND { if (U_FAILURE(status)) { return nullptr; } @@ -846,13 +855,13 @@ class MemoryPool : public UMemory { template class MaybeStackVector : protected MemoryPool { public: - template - T* emplaceBack(Args&&... args) { + template + T* emplaceBack(Args&&... args) U_LIFETIME_BOUND { return this->create(args...); } template - T *emplaceBackAndCheckErrorCode(UErrorCode &status, Args &&... args) { + T* emplaceBackAndCheckErrorCode(UErrorCode& status, Args&&... args) U_LIFETIME_BOUND { return this->createAndCheckErrorCode(status, args...); } @@ -860,11 +869,11 @@ class MaybeStackVector : protected MemoryPool { return this->fCount; } - T** getAlias() { + T** getAlias() U_LIFETIME_BOUND { return this->fPool.getAlias(); } - const T *const *getAlias() const { + const T* const* getAlias() const U_LIFETIME_BOUND { return this->fPool.getAlias(); } @@ -874,7 +883,7 @@ class MaybeStackVector : protected MemoryPool { * @param i array index * @return reference to the array item */ - const T* operator[](ptrdiff_t i) const { + const T* operator[](ptrdiff_t i) const U_LIFETIME_BOUND { return this->fPool[i]; } @@ -884,11 +893,270 @@ class MaybeStackVector : protected MemoryPool { * @param i array index * @return reference to the array item */ - T* operator[](ptrdiff_t i) { + T* operator[](ptrdiff_t i) U_LIFETIME_BOUND { return this->fPool[i]; } }; +namespace prv { + +#if U_OVERRIDE_CXX_ALLOCATION + +/** + * A deleter (as used by std::unique_ptr) that deallocates using `deallocate`. + * @internal + */ +template class Deleter { + public: + Deleter() = default; + void operator()(T *const ptr) const { + if constexpr (!std::is_trivially_destructible_v) { + ptr->~T(); + } + deallocate(ptr); + } +}; + +/** + * A deleter (as used by std::unique_ptr) that deallocates using `deallocate`: specialization for + * arrays of trivially destructible objects, e.g., int32_t[]. + * @internal + */ +template +class Deleter>> { + public: + Deleter() = default; + void operator()(T *const ptr) const { deallocate(ptr); } +}; + +/** + * A deleter (as used by std::unique_ptr) that deallocates using `deallocate`: specialization for + * arrays of nontrivially destructible objects, e.g., UnicodeString[]. + * @internal + */ +template +class Deleter>> { + public: + Deleter(const std::size_t size) : size_(size) {} + void operator()(T *const ptr) const { + for (std::ptrdiff_t i = static_cast(size_) - 1; i >= 0; --i) { + ptr[i]->~T(); + } + deallocate(ptr); + } + private: + const std::size_t size_; +}; + +/** + * An std::unique_ptr that deallocates using uprv_free. + * @internal + */ +template using unique_ptr = std::unique_ptr>; + +#else + +using std::unique_ptr; + +#endif + +/** + * Helper for make_unique; forwards all but the last of args to the constructor of + * T, uses the last of args as the error code for allocation errors. + * + * As usual, does nothing if the incoming UErrorCode already is U_FAILURE. + * + * @internal + */ +template +unique_ptr make_unique_impl(std::tuple args, + std::index_sequence constructor_arg_indices) { + static_assert(std::is_same_v>); + auto &&error = std::get(args); + static_assert(std::is_same_v); + if (U_FAILURE(error)) { + return nullptr; + } +#if U_OVERRIDE_CXX_ALLOCATION + void *const buffer = uprv_malloc(sizeof(T)); + if (buffer == nullptr) { + error = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return unique_ptr(new (buffer) T(std::get(args)...)); +#else + return std::make_unique(std::get(args)...); +#endif +} + +/** + * A version of std::make_unique that is compatible with ICU allocation error handling. + * If U_OVERRIDE_CXX_ALLOCATION, allocates using uprv_malloc, and sets a UErrorCode on failure. + * Otherwise, equivalent to std::make_unique. + * prv::make_unique(Args... args, UErrorCode& status) + * corresponds to + * std::make_unique(Args... args) + * and + * new T(Args... args). + * + * As usual, does nothing if the incoming UErrorCode already is U_FAILURE. + * + * With empty args, this corresponds to new T(), and the allocated object is value-initialized; in + * particular, scalar types are zero-initialized; cf. make_unique_for_overwrite which + * corresponds to new T. + * + * @internal + */ +template >> +unique_ptr make_unique(Args &&...args) { + return make_unique_impl(std::forward_as_tuple(args...), + std::make_index_sequence()); +} + +/** + * A version of std::make_unique that is compatible with ICU allocation error handling. + * If U_OVERRIDE_CXX_ALLOCATION, allocates using uprv_malloc, and sets a UErrorCode on failure. + * Otherwise, equivalent to std::make_unique. + * prv::make_unique(std::size_t n, UErrorCode& status) + * corresponds to + * std::make_unique(std::size_t n) + * and + * new T[std::size_t n](). + * + * As usual, does nothing if the incoming UErrorCode already is U_FAILURE. + * + * The allocated objects are value-initialized; in particular, scalar types are zero-initialized; + * cf. make_unique_for_overwrite which corresponds to new T[n]. + * + * @internal + */ +template . + typename = std::enable_if_t[], T>>> +unique_ptr make_unique(const std::size_t n, UErrorCode &error) { + if (U_FAILURE(error)) { + return nullptr; + } + // In C23/C++26, we could use ckd_mul. + constexpr std::size_t maxSize = SIZE_MAX / sizeof(std::remove_extent_t); + if (n > maxSize) { + error = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } +#if U_OVERRIDE_CXX_ALLOCATION + void *const buffer = uprv_malloc(sizeof(std::remove_extent_t) * n); + if (buffer == nullptr) { + error = U_MEMORY_ALLOCATION_ERROR; + if constexpr (std::is_trivially_destructible_v>) { + return nullptr; + } else { + return unique_ptr(nullptr, Deleter(0)); + } + } + if constexpr (std::is_trivially_destructible_v>) { + return unique_ptr(new (buffer) std::remove_extent_t[n]()); + } else { + return unique_ptr(new (buffer) std::remove_extent_t[n](), Deleter(n)); + } +#else + return std::make_unique(n); +#endif +} + +/** + * A version of std::make_unique_for_overwrite that is compatible with ICU allocation error + * handling. + * If U_OVERRIDE_CXX_ALLOCATION, allocates using uprv_malloc, and sets a UErrorCode on failure. + * Otherwise, equivalent to std::make_unique_for_overwrite. + * prv::make_unique_for_overwrite(UErrorCode& status) + * corresponds to + * std::make_unique_for_overwrite() + * and + * new T. + * + * As usual, does nothing if the incoming UErrorCode already is U_FAILURE. + * + * The allocated object is default-initialized. For some types, e.g., scalar types, this means it + * has an indeterminate value, or an erroneous value since C++26 (in plain English, the memory is + * uninitialized). + * + * @internal + */ +template >> +unique_ptr make_unique_for_overwrite(UErrorCode &error) { + if (U_FAILURE(error)) { + return nullptr; + } +#if U_OVERRIDE_CXX_ALLOCATION + void *const buffer = uprv_malloc(sizeof(T)); + if (buffer == nullptr) { + error = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return unique_ptr(new (buffer) T); +#elif U_CPLUSPLUS_VERSION >= 20 + return std::make_unique_for_overwrite(); +#else + return unique_ptr(new T); +#endif +} + +/** + * A version of std::make_unique_for_overwrite that is compatible with ICU allocation error + * handling. + * If U_OVERRIDE_CXX_ALLOCATION, allocates using uprv_malloc, and sets a UErrorCode on failure. + * Otherwise, equivalent to std::make_unique_for_overwrite. + * prv::make_unique_for_overwrite(std::size_t n, UErrorCode& status) + * corresponds to + * std::make_unique_for_overwrite(std::size_t n) + * and + * new T[std::size_t n]. + * + * As usual, does nothing if the incoming UErrorCode already is U_FAILURE. + * + * The allocated objects are default-initialized. For some types, e.g., scalar types, this means + * they have indeterminate values, or erroneous values since C++26 (in plain English, the memory is + * uninitialized). + * + * @internal + */ +template . + typename = std::enable_if_t[], T>>> +unique_ptr make_unique_for_overwrite(const std::size_t n, UErrorCode &error) { + if (U_FAILURE(error)) { + return nullptr; + } + // In C23/C++26, we could use ckd_mul. + constexpr std::size_t maxSize = SIZE_MAX / sizeof(std::remove_extent_t); + if (n > maxSize) { + error = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } +#if U_OVERRIDE_CXX_ALLOCATION + void *const buffer = uprv_malloc(sizeof(std::remove_extent_t) * n); + if (buffer == nullptr) { + error = U_MEMORY_ALLOCATION_ERROR; + if constexpr (std::is_trivially_destructible_v>) { + return nullptr; + } else { + return unique_ptr(nullptr, Deleter(0)); + } + } + if constexpr (std::is_trivially_destructible_v>) { + return unique_ptr(new (buffer) std::remove_extent_t[n]); + } else { + return unique_ptr(new (buffer) std::remove_extent_t[n], Deleter(n)); + } +#elif U_CPLUSPLUS_VERSION >= 20 + return std::make_unique_for_overwrite(n); +#else + return unique_ptr(new std::remove_extent_t[n]); +#endif +} + +} // namespace prv U_NAMESPACE_END diff --git a/deps/icu-small/source/common/dtintrv.cpp b/deps/icu-small/source/common/dtintrv.cpp index 011ad8136f3b..d15e57e11f03 100644 --- a/deps/icu-small/source/common/dtintrv.cpp +++ b/deps/icu-small/source/common/dtintrv.cpp @@ -38,7 +38,7 @@ DateInterval::DateInterval(const DateInterval& other) DateInterval& -DateInterval::operator=(const DateInterval& other) { +DateInterval::operator=(const DateInterval& other) U_LIFETIME_BOUND { if ( this != &other ) { fromDate = other.fromDate; toDate = other.toDate; diff --git a/deps/icu-small/source/common/edits.cpp b/deps/icu-small/source/common/edits.cpp index 82055e5e543b..be100b005eb0 100644 --- a/deps/icu-small/source/common/edits.cpp +++ b/deps/icu-small/source/common/edits.cpp @@ -41,7 +41,7 @@ void Edits::releaseArray() noexcept { } } -Edits &Edits::copyArray(const Edits &other) { +Edits& Edits::copyArray(const Edits& other) U_LIFETIME_BOUND { if (U_FAILURE(errorCode_)) { length = delta = numChanges = 0; return *this; @@ -63,7 +63,7 @@ Edits &Edits::copyArray(const Edits &other) { return *this; } -Edits &Edits::moveArray(Edits &src) noexcept { +Edits& Edits::moveArray(Edits& src) noexcept U_LIFETIME_BOUND { if (U_FAILURE(errorCode_)) { length = delta = numChanges = 0; return *this; @@ -85,7 +85,7 @@ Edits &Edits::moveArray(Edits &src) noexcept { return *this; } -Edits &Edits::operator=(const Edits &other) { +Edits& Edits::operator=(const Edits& other) U_LIFETIME_BOUND { if (this == &other) { return *this; } // self-assignment: no-op length = other.length; delta = other.delta; @@ -94,7 +94,7 @@ Edits &Edits::operator=(const Edits &other) { return copyArray(other); } -Edits &Edits::operator=(Edits &&src) noexcept { +Edits& Edits::operator=(Edits&& src) noexcept U_LIFETIME_BOUND { length = src.length; delta = src.delta; numChanges = src.numChanges; @@ -251,7 +251,9 @@ UBool Edits::copyErrorTo(UErrorCode &outErrorCode) const { return true; } -Edits &Edits::mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &errorCode) { +Edits& Edits::mergeAndAppend(const Edits& ab, + const Edits& bc, + UErrorCode& errorCode) U_LIFETIME_BOUND { if (copyErrorTo(errorCode)) { return *this; } // Picture string a --(Edits ab)--> string b --(Edits bc)--> string c. // Parallel iteration over both Edits. @@ -397,7 +399,7 @@ Edits &Edits::mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &error return *this; } -Edits::Iterator::Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs) : +Edits::Iterator::Iterator(const uint16_t* a U_LIFETIME_BOUND, int32_t len, UBool oc, UBool crs) : array(a), index(0), length(len), remaining(0), onlyChanges_(oc), coarse(crs), dir(0), changed(false), oldLength_(0), newLength_(0), @@ -776,7 +778,7 @@ int32_t Edits::Iterator::sourceIndexFromDestinationIndex(int32_t i, UErrorCode & } } -UnicodeString& Edits::Iterator::toString(UnicodeString& sb) const { +UnicodeString& Edits::Iterator::toString(UnicodeString& sb U_LIFETIME_BOUND) const { sb.append(u"{ src[", -1); ICU_Utility::appendNumber(sb, srcIndex); sb.append(u"..", -1); diff --git a/deps/icu-small/source/common/filteredbrk.cpp b/deps/icu-small/source/common/filteredbrk.cpp index 29b02dd38424..c30f4e6009ef 100644 --- a/deps/icu-small/source/common/filteredbrk.cpp +++ b/deps/icu-small/source/common/filteredbrk.cpp @@ -75,7 +75,7 @@ class UStringSet : public UVector { /** * Return the ith UnicodeString alias */ - inline const UnicodeString* getStringAt(int32_t i) const { + inline const UnicodeString* getStringAt(int32_t i) const U_LIFETIME_BOUND { return static_cast(elementAt(i)); } /** @@ -139,7 +139,7 @@ class SimpleFilteredSentenceBreakData : public UMemory { public: SimpleFilteredSentenceBreakData(UCharsTrie *forwards, UCharsTrie *backwards ) : fForwardsPartialTrie(forwards), fBackwardsTrie(backwards), refcount(1) { } - SimpleFilteredSentenceBreakData *incr() { + SimpleFilteredSentenceBreakData* incr() U_LIFETIME_BOUND { umtx_atomic_inc(&refcount); return this; } @@ -154,8 +154,10 @@ class SimpleFilteredSentenceBreakData : public UMemory { bool hasForwardsPartialTrie() const { return fForwardsPartialTrie.isValid(); } bool hasBackwardsTrie() const { return fBackwardsTrie.isValid(); } - const UCharsTrie &getForwardsPartialTrie() const { return *fForwardsPartialTrie; } - const UCharsTrie &getBackwardsTrie() const { return *fBackwardsTrie; } + const UCharsTrie& getForwardsPartialTrie() const U_LIFETIME_BOUND { + return *fForwardsPartialTrie; + } + const UCharsTrie& getBackwardsTrie() const U_LIFETIME_BOUND { return *fBackwardsTrie; } private: // These tries own their data arrays. @@ -196,13 +198,21 @@ class SimpleFilteredSentenceBreakIterator : public BreakIterator { /* -- text modifying -- */ virtual void setText(UText *text, UErrorCode &status) override { fDelegate->setText(text,status); } - virtual BreakIterator &refreshInputText(UText *input, UErrorCode &status) override { fDelegate->refreshInputText(input,status); return *this; } + virtual BreakIterator& refreshInputText(UText* input, + UErrorCode& status) U_LIFETIME_BOUND override { + fDelegate->refreshInputText(input, status); + return *this; + } virtual void adoptText(CharacterIterator* it) override { fDelegate->adoptText(it); } virtual void setText(const UnicodeString &text) override { fDelegate->setText(text); } /* -- other functions that are just delegated -- */ - virtual UText *getUText(UText *fillIn, UErrorCode &status) const override { return fDelegate->getUText(fillIn,status); } - virtual CharacterIterator& getText() const override { return fDelegate->getText(); } + virtual UText* getUText(UText* fillIn U_LIFETIME_BOUND, UErrorCode& status) const override { + return fDelegate->getUText(fillIn, status); + } + virtual CharacterIterator& getText() const U_LIFETIME_BOUND override { + return fDelegate->getText(); + } /* -- ITERATION -- */ virtual int32_t first() override; diff --git a/deps/icu-small/source/common/filterednormalizer2.cpp b/deps/icu-small/source/common/filterednormalizer2.cpp index 5eafcb6d78f6..cdda0a534d12 100644 --- a/deps/icu-small/source/common/filterednormalizer2.cpp +++ b/deps/icu-small/source/common/filterednormalizer2.cpp @@ -32,10 +32,10 @@ U_NAMESPACE_BEGIN FilteredNormalizer2::~FilteredNormalizer2() {} -UnicodeString & -FilteredNormalizer2::normalize(const UnicodeString &src, - UnicodeString &dest, - UErrorCode &errorCode) const { +UnicodeString& +FilteredNormalizer2::normalize(const UnicodeString& src, + UnicodeString& dest U_LIFETIME_BOUND, + UErrorCode& errorCode) const { uprv_checkCanGetBuffer(src, errorCode); if(U_FAILURE(errorCode)) { dest.setToBogus(); @@ -56,11 +56,11 @@ FilteredNormalizer2::normalize(const UnicodeString &src, // USET_SPAN_SIMPLE should be passed in for the start of src // and USET_SPAN_NOT_CONTAINED should be passed in if we continue after // an in-filter prefix. -UnicodeString & -FilteredNormalizer2::normalize(const UnicodeString &src, - UnicodeString &dest, +UnicodeString& +FilteredNormalizer2::normalize(const UnicodeString& src, + UnicodeString& dest U_LIFETIME_BOUND, USetSpanCondition spanCondition, - UErrorCode &errorCode) const { + UErrorCode& errorCode) const { UnicodeString tempDest; // Don't throw away destination buffer between iterations. for(int32_t prevSpanLimit=0; prevSpanLimitname; } -U_CAPI const char * U_EXPORT2 -uplug_getSymbolName(UPlugData *data) { +U_CAPI const char* U_EXPORT2 +uplug_getSymbolName(UPlugData* data U_LIFETIME_BOUND) { return data->sym; } -U_CAPI const char * U_EXPORT2 -uplug_getLibraryName(UPlugData *data, UErrorCode *status) { +U_CAPI const char* U_EXPORT2 +uplug_getLibraryName(UPlugData* data U_LIFETIME_BOUND, UErrorCode* status) { if(data->libName[0]) { return data->libName; } else { @@ -503,7 +503,7 @@ uplug_setContext(UPlugData *data, void *context) { } U_CAPI const char* U_EXPORT2 -uplug_getConfiguration(UPlugData *data) { +uplug_getConfiguration(UPlugData* data U_LIFETIME_BOUND) { return data->config; } diff --git a/deps/icu-small/source/common/localebuilder.cpp b/deps/icu-small/source/common/localebuilder.cpp index 3ba735530689..8af7bf80b028 100644 --- a/deps/icu-small/source/common/localebuilder.cpp +++ b/deps/icu-small/source/common/localebuilder.cpp @@ -51,7 +51,7 @@ LocaleBuilder::~LocaleBuilder() delete extensions_; } -LocaleBuilder& LocaleBuilder::setLocale(const Locale& locale) +LocaleBuilder& LocaleBuilder::setLocale(const Locale& locale) U_LIFETIME_BOUND { clear(); setLanguage(locale.getLanguage()); @@ -65,7 +65,7 @@ LocaleBuilder& LocaleBuilder::setLocale(const Locale& locale) return *this; } -LocaleBuilder& LocaleBuilder::setLanguageTag(StringPiece tag) +LocaleBuilder& LocaleBuilder::setLanguageTag(StringPiece tag) U_LIFETIME_BOUND { Locale l = Locale::forLanguageTag(tag, status_); if (U_FAILURE(status_)) { return *this; } @@ -92,19 +92,19 @@ void setField(StringPiece input, char* dest, UErrorCode& errorCode, } // namespace -LocaleBuilder& LocaleBuilder::setLanguage(StringPiece language) +LocaleBuilder& LocaleBuilder::setLanguage(StringPiece language) U_LIFETIME_BOUND { setField(language, language_, status_, &ultag_isLanguageSubtag); return *this; } -LocaleBuilder& LocaleBuilder::setScript(StringPiece script) +LocaleBuilder& LocaleBuilder::setScript(StringPiece script) U_LIFETIME_BOUND { setField(script, script_, status_, &ultag_isScriptSubtag); return *this; } -LocaleBuilder& LocaleBuilder::setRegion(StringPiece region) +LocaleBuilder& LocaleBuilder::setRegion(StringPiece region) U_LIFETIME_BOUND { setField(region, region_, status_, &ultag_isRegionSubtag); return *this; @@ -124,7 +124,7 @@ void transform(char* data, int32_t len) { } // namespace -LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant) +LocaleBuilder& LocaleBuilder::setVariant(StringPiece variant) U_LIFETIME_BOUND { if (U_FAILURE(status_)) { return *this; } if (variant.empty()) { @@ -233,7 +233,7 @@ _setUnicodeExtensions(Locale& locale, const CharString& value, UErrorCode& error } // namespace -LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value) +LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value) U_LIFETIME_BOUND { if (U_FAILURE(status_)) { return *this; } if (!UPRV_ISALPHANUM(key)) { @@ -269,8 +269,8 @@ LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value) return *this; } -LocaleBuilder& LocaleBuilder::setUnicodeLocaleKeyword( - StringPiece key, StringPiece type) +LocaleBuilder& LocaleBuilder::setUnicodeLocaleKeyword(StringPiece key, + StringPiece type) U_LIFETIME_BOUND { if (U_FAILURE(status_)) { return *this; } if (!ultag_isUnicodeLocaleKey(key.data(), key.length()) || @@ -290,8 +290,7 @@ LocaleBuilder& LocaleBuilder::setUnicodeLocaleKeyword( return *this; } -LocaleBuilder& LocaleBuilder::addUnicodeLocaleAttribute( - StringPiece value) +LocaleBuilder& LocaleBuilder::addUnicodeLocaleAttribute(StringPiece value) U_LIFETIME_BOUND { CharString value_str(value, status_); if (U_FAILURE(status_)) { return *this; } @@ -351,8 +350,7 @@ LocaleBuilder& LocaleBuilder::addUnicodeLocaleAttribute( return *this; } -LocaleBuilder& LocaleBuilder::removeUnicodeLocaleAttribute( - StringPiece value) +LocaleBuilder& LocaleBuilder::removeUnicodeLocaleAttribute(StringPiece value) U_LIFETIME_BOUND { CharString value_str(value, status_); if (U_FAILURE(status_)) { return *this; } @@ -398,7 +396,7 @@ LocaleBuilder& LocaleBuilder::removeUnicodeLocaleAttribute( return *this; } -LocaleBuilder& LocaleBuilder::clear() +LocaleBuilder& LocaleBuilder::clear() U_LIFETIME_BOUND { status_ = U_ZERO_ERROR; language_[0] = 0; @@ -410,7 +408,7 @@ LocaleBuilder& LocaleBuilder::clear() return *this; } -LocaleBuilder& LocaleBuilder::clearExtensions() +LocaleBuilder& LocaleBuilder::clearExtensions() U_LIFETIME_BOUND { delete extensions_; extensions_ = nullptr; diff --git a/deps/icu-small/source/common/localefallback_data.h b/deps/icu-small/source/common/localefallback_data.h index 338bfa3595ba..08295e5ac1e0 100644 --- a/deps/icu-small/source/common/localefallback_data.h +++ b/deps/icu-small/source/common/localefallback_data.h @@ -3,25 +3,25 @@ // // Internal static data tables used by uresbund.cpp // WARNING: This file is mechanically generated by the CLDR-to-ICU tool -// (see tools/cldr/cldr-to-icu/src/main/java/org/unicode/tool/cldrtoicu/generator/ResourcFallbackCodeGenerator.java). +// (see tools/cldr/cldr-to-icu/src/main/java/org/unicode/icu/tool/cldrtoicu/generator/ResourceFallbackCodeGenerator.java). // DO NOT HAND EDIT!!! #ifdef INCLUDED_FROM_URESBUND_CPP -//====================================================================== +// ====================================================================== // Default script table const char scriptCodeChars[] = "Aghb\0Ahom\0Arab\0Armi\0Armn\0Avst\0Bali\0Bamu\0Batk\0Beng\0Bopo\0" "Brah\0Cakm\0Cans\0Cari\0Cham\0Cher\0Chrs\0Copt\0Cprt\0Cyrl\0Deva\0" - "Egyp\0Elym\0Ethi\0Geor\0Gong\0Gonm\0Goth\0Gran\0Grek\0Gujr\0Guru\0" - "Hang\0Hani\0Hans\0Hant\0Hebr\0Hluw\0Hmnp\0Ital\0Java\0Jpan\0Kali\0" + "Egyp\0Elym\0Ethi\0Geor\0Gonm\0Goth\0Gran\0Grek\0Gujr\0Guru\0Hang\0" + "Hani\0Hans\0Hant\0Hebr\0Hluw\0Hmnp\0Ital\0Java\0Jpan\0Jurc\0Kali\0" "Kana\0Khar\0Khmr\0Kits\0Knda\0Kore\0Lana\0Laoo\0Latf\0Latg\0Lepc\0" "Lina\0Linb\0Lisu\0Lyci\0Lydi\0Mand\0Mani\0Marc\0Medf\0Merc\0Mlym\0" "Modi\0Mong\0Mroo\0Mtei\0Mymr\0Narb\0Newa\0Nkoo\0Ogam\0Olck\0Orkh\0" "Orya\0Osge\0Ougr\0Pauc\0Phli\0Phnx\0Plrd\0Prti\0Rjng\0Rohg\0Runr\0" - "Samr\0Sarb\0Saur\0Sgnw\0Sidt\0Sinh\0Sogd\0Sora\0Soyo\0Syrc\0Tagb\0" - "Takr\0Tale\0Talu\0Taml\0Tang\0Tavt\0Telu\0Tfng\0Thaa\0Thai\0Tibt\0" - "Tnsa\0Toto\0Ugar\0Vaii\0Wcho\0Xpeo\0Xsux\0Yiii\0"; + "Samr\0Sarb\0Saur\0Seal\0Sgnw\0Sidt\0Sinh\0Sogd\0Sora\0Soyo\0Syrc\0" + "Tagb\0Takr\0Tale\0Talu\0Taml\0Tang\0Tavt\0Telu\0Tfng\0Thaa\0Thai\0" + "Tibt\0Tnsa\0Toto\0Ugar\0Vaii\0Wcho\0Xpeo\0Xsux\0Yiii\0"; const char dsLocaleIDChars[] = "aaf\0aao\0aat\0ab\0abh\0abl\0abq\0abv\0acm\0acq\0acw\0acx\0adf\0" @@ -38,81 +38,83 @@ const char dsLocaleIDChars[] = "brw\0brx\0bsh\0bsk\0bst\0btd\0btm\0btv\0bua\0bwe\0bxm\0bxu\0byh\0" "byn\0byw\0bzi\0cbn\0ccp\0cde\0cdh\0cdi\0cdj\0cdm\0cdn\0cdo\0cdz\0" "ce\0cgk\0chg\0chm\0chr\0chx\0cih\0cja\0cji\0cjm\0cjy\0ckb\0ckt\0" - "clh\0clw\0cmg\0cna\0cnp\0cog\0cop\0cpg\0cr\0crh\0crj\0crk\0crl\0" - "crm\0csh\0csp\0csw\0ctd\0ctg\0ctn\0ctt\0cty\0cu\0cuu\0cv\0czh\0" - "czk\0daq\0dar\0dcc\0ddo\0def\0deh\0der\0dgl\0dhi\0dhn\0dho\0dhw\0" - "dka\0dlg\0dmf\0dmk\0dml\0dng\0dnu\0dnv\0doi\0dox\0dre\0drq\0drs\0" - "dry\0dso\0dty\0dub\0duh\0dus\0dv\0dwk\0dwz\0dz\0dzl\0ecr\0ecy\0" - "egy\0eky\0el\0emg\0emu\0enf\0enh\0era\0esg\0esh\0ett\0eve\0evn\0" - "fa\0fay\0faz\0fia\0fmu\0fub\0gan\0gaq\0gas\0gau\0gbj\0gbk\0gbl\0" - "gbm\0gbz\0gdb\0gdo\0gdx\0gez\0ggg\0gha\0ghe\0gho\0ghr\0ght\0gig\0" - "gin\0gjk\0gju\0gld\0glh\0glk\0gml\0gmv\0gmy\0goe\0gof\0goj\0gok\0" - "gon\0got\0gra\0grc\0grr\0grt\0gru\0gu\0gvr\0gwc\0gwf\0gwt\0gyo\0" - "gzi\0ha_CM\0ha_SD\0hac\0hak\0hak_TW\0har\0haz\0hbo\0hdy\0he\0" - "hi\0hif\0hii\0hit\0hkh\0hlb\0hlu\0hmd\0hmj\0hmq\0hnd\0hne\0hnj\0" - "hnm\0hno\0hoc\0hoh\0hoj\0how\0hoy\0hpo\0hrt\0hrz\0hsn\0hss\0htx\0" - "hut\0huy\0huz\0hy\0hyw\0ii\0imy\0inh\0int\0ior\0iru\0isk\0itk\0" - "itl\0iu\0iw\0ja\0jad\0jat\0jbe\0jbn\0jct\0jda\0jdg\0jdt\0jee\0" - "jge\0ji\0jje\0jkm\0jml\0jna\0jnd\0jnl\0jns\0jog\0jpa\0jpr\0jrb\0" - "jul\0jun\0juy\0jya\0jye\0ka\0kaa\0kap\0kaw\0kbd\0kbg\0kbu\0kby\0" - "kca\0kcy\0kdq\0kdt\0ket\0kev\0kex\0key\0kfa\0kfb\0kfc\0kfd\0kfe\0" - "kfg\0kfh\0kfi\0kfk\0kfm\0kfp\0kfq\0kfr\0kfs\0kfu\0kfx\0kfy\0kgj\0" - "kgy\0khb\0khf\0khg\0khn\0kho\0kht\0khv\0khw\0kif\0kim\0kip\0kjg\0" - "kjh\0kjl\0kjo\0kjp\0kjt\0kjz\0kk\0kk_AF\0kk_CN\0kk_IR\0kk_MN\0" - "kkf\0kkh\0kkt\0kle\0klj\0klr\0km\0kmj\0kmz\0kn\0knn\0ko\0koi\0" - "kok\0kpt\0kpy\0kqd\0kqy\0kra\0krc\0krk\0krr\0kru\0krv\0ks\0ksu\0" - "ksw\0ksz\0ktb\0kte\0ktl\0ktp\0ku_AM\0ku_AZ\0ku_GE\0ku_IQ\0ku_IR\0" - "ku_LB\0ku_TM\0kuf\0kum\0kv\0kva\0kvq\0kvt\0kvx\0kvy\0kwx\0kxf\0" - "kxk\0kxm\0kxp\0ky\0ky_CN\0kyu\0kyv\0kyw\0lab\0lad\0lae\0lah\0" - "lbe\0lbf\0lbj\0lbm\0lbo\0lbr\0lcp\0lep\0lez\0lhm\0lhs\0lif\0lis\0" - "lkh\0lki\0lmh\0lmn\0lo\0loy\0lpo\0lrc\0lrk\0lrl\0lsa\0lsd\0lss\0" - "ltc\0luh\0luk\0luu\0luv\0luz\0lwl\0lwm\0lya\0lzh\0lzz_GE\0mag\0" - "mai\0mby\0mde\0mdf\0mdx\0mdy\0mey\0mfa\0mfi\0mga\0mgp\0mhj\0mid\0" - "mjl\0mjq\0mjr\0mjt\0mju\0mjv\0mjz\0mk\0mkb\0mke\0mki\0mkm\0ml\0" - "mlf\0mn\0mn_CN\0mnc\0mni\0mnj\0mns\0mnw\0mpz\0mr\0mra\0mrd\0mrj\0" - "mro\0mrr\0ms_CC\0mtm\0mtr\0mud\0muk\0mut\0muv\0muz\0mve\0mvf\0" - "mvy\0mvz\0mwr\0mwt\0mww\0my\0mym\0myv\0myz\0mzb\0mzn\0nan\0nan_MO\0" - "nan_TW\0nao\0ncd\0ncq\0ndf\0ne\0neg\0neh\0nei\0new\0ngt\0nio\0" - "nit\0niv\0nli\0nlm\0nlx\0nmm\0nnp\0nod\0noe\0nog\0noi\0non\0nos\0" - "npb\0nqo\0nrn\0nsd\0nsf\0nsk\0nst\0nsv\0nty\0ntz\0nwc\0nwx\0nyl\0" - "nyq\0nyw\0oaa\0oac\0oar\0oav\0obm\0obr\0odk\0oht\0oj\0ojs\0okm\0" - "oko\0okz\0ola\0ole\0omk\0omp\0omr\0omx\0oon\0or\0ort\0oru\0orv\0" - "os\0osa\0osc\0osi\0ota\0otb\0otk\0oty\0oui\0oyb\0pa\0pa_PK\0pal\0" - "paq\0pbt\0pcb\0pce\0pcf\0pcg\0pch\0pci\0pcj\0peg\0peo\0pgd\0pgg\0" - "pgl\0pgn\0phd\0phk\0phl\0phn\0pho\0phr\0pht\0phu\0phv\0phw\0pi_IN\0" - "pi_LK\0pi_MM\0pi_TH\0pka\0pkr\0plk\0pll\0pmh\0pnt\0pnt_RU\0prc\0" - "prd\0prt\0prx\0ps\0psh\0psi\0pst\0psu\0pum\0pwo\0pwr\0pww\0pyx\0" - "qxq\0raa\0rab\0raf\0rah\0raj\0rav\0rbb\0rdb\0rei\0rhg\0rji\0rjs\0" - "rka\0rki\0rkt\0rmi\0rmt\0rmz\0rsk\0rtw\0ru\0rue\0rut\0rwr\0ryu\0" - "sa\0sah\0sam\0sat\0saz\0sbn\0sbu\0sck\0scl\0scp\0sct\0scu\0scx\0" - "sd\0sd_IN\0sdb\0sdf\0sdg\0sdh\0sdr\0sds\0sel\0sfm\0sgh\0sgj\0" - "sgr\0sgt\0sgw\0sgy\0shd\0shi\0shm\0shn\0shu\0shv\0si\0sia\0sip\0" - "siy\0siz\0sjc\0sjd\0sjp\0sjt\0skb\0skj\0skr\0smh\0smp\0smu\0smy\0" - "soa\0sog\0soi\0sou\0spt\0spv\0sqo\0sqq\0sqt\0sr\0srb\0srh\0srx\0" - "srz\0ssh\0sss\0sts\0stu\0stu_CN\0stv\0sty\0suz\0sva\0swb\0swi\0" - "swv\0sxu\0syc\0syl\0syn\0syr\0syw\0ta\0tab\0taj\0tbk\0tcn\0tco\0" - "tcx\0tcy\0tda\0tdb\0tdd\0tdg\0tdh\0te\0tes\0tg\0tg_PK\0tge\0tgf\0" - "th\0the\0thf\0thi\0thl\0thm\0thq\0thr\0ths\0ti\0tig\0tij\0tin\0" - "tjl\0tjo\0tkb\0tks\0tkt\0tmr\0tnv\0tov\0tpu\0tra\0trg\0trm\0trw\0" - "tsd\0tsj\0tt\0tth\0tto\0tts\0ttz\0tvn\0twm\0txg\0txo\0tyr\0tyv\0" - "ude\0udg\0udi\0udm\0ug\0ug_KZ\0ug_MN\0uga\0ugh\0ugo\0uk\0uki\0" - "ulc\0unr\0unr_NP\0unx\0ur\0urk\0ush\0uum\0uz_AF\0uz_CN\0uzs\0" - "vaa\0vaf\0vah\0vai\0vas\0vav\0vay\0vgr\0vjk\0vmd\0vmh\0wal\0wbk\0" - "wbq\0wbr\0wle\0wlo\0wme\0wne\0wni\0wsg\0wsv\0wtm\0wuu\0xag\0xal\0" - "xan\0xas\0xco\0xcr\0xdq\0xhe\0xhm\0xis\0xka\0xkc\0xkf\0xkj\0xkp\0" - "xlc\0xld\0xly\0xmf\0xmn\0xmr\0xna\0xnr\0xpg\0xpi\0xpm\0xpr\0xrm\0" - "xrn\0xsa\0xsd\0xsr\0xtq\0xub\0xuj\0xve\0xvi\0xwo\0xzh\0yai\0ybh\0" - "ybi\0ydg\0yea\0yej\0yeu\0ygp\0yhd\0yi\0yig\0yih\0yiv\0ykg\0ykh\0" - "yna\0ynk\0yoi\0yoy\0yrk\0ysd\0ysn\0ysp\0ysr\0ysy\0yud\0yue\0yue_CN\0" - "yug\0yux\0ywq\0ywu\0zau\0zba\0zch\0zdj\0zeh\0zen\0zgb\0zgh\0zgm\0" - "zgn\0zh\0zh_AU\0zh_BN\0zh_GB\0zh_GF\0zh_HK\0zh_ID\0zh_MO\0zh_PA\0" - "zh_PF\0zh_PH\0zh_SR\0zh_TH\0zh_TW\0zh_US\0zh_VN\0zhd\0zko\0zkt\0" - "zkz\0zlj\0zln\0zlq\0zqe\0zrg\0zrp\0zum\0zwa\0zyg\0zyn\0zzj\0"; + "clh\0clw\0cmg\0cna\0cnp\0cnu\0cog\0cop\0cpg\0cpx\0cr\0crh\0crj\0" + "crk\0crl\0crm\0csh\0csj\0csp\0csw\0ctd\0ctg\0ctn\0ctt\0cty\0cu\0" + "cuu\0cv\0czh\0czk\0daq\0dar\0dcc\0ddo\0def\0deh\0der\0dgl\0dhi\0" + "dhn\0dho\0dhw\0dka\0dlg\0dmf\0dmk\0dml\0dng\0dnu\0dnv\0doi\0dox\0" + "dre\0drq\0drs\0dry\0dso\0dty\0dub\0duh\0dus\0dv\0dwk\0dwz\0dz\0" + "dzl\0ecr\0ecy\0egy\0eky\0el\0emg\0emu\0enf\0enh\0era\0esg\0esh\0" + "ett\0eve\0evn\0fa\0fay\0faz\0fia\0fmu\0fub\0gan\0gaq\0gas\0gau\0" + "gbj\0gbk\0gbl\0gbm\0gbz\0gdb\0gdo\0gdx\0gez\0ggg\0gha\0ghe\0gho\0" + "ghr\0ght\0gig\0gin\0gjk\0gju\0gld\0glh\0glk\0gml\0gmv\0gmy\0goe\0" + "gof\0goj\0gok\0gon\0got\0gra\0grc\0grr\0grt\0gru\0gu\0gvr\0gwc\0" + "gwf\0gwt\0gyo\0gzi\0ha_CM\0ha_SD\0hac\0hak\0hak_TW\0har\0haz\0" + "hbo\0hdy\0he\0hi\0hif\0hii\0hit\0hkh\0hlb\0hlu\0hmd\0hmj\0hmq\0" + "hnd\0hne\0hnj\0hnm\0hno\0hoc\0hoh\0hoj\0how\0hoy\0hpo\0hrt\0hrz\0" + "hsn\0hss\0htx\0hut\0huy\0huz\0hy\0hyw\0ii\0imy\0inh\0int\0ior\0" + "iru\0isk\0itk\0itl\0iu\0iw\0ja\0jad\0jat\0jbe\0jbn\0jct\0jda\0" + "jdg\0jdt\0jee\0jge\0ji\0jje\0jkp\0jml\0jna\0jnd\0jnl\0jns\0jog\0" + "jpa\0jpr\0jrb\0juc\0jul\0jun\0juy\0jya\0jye\0ka\0kaa\0kap\0kaw\0" + "kbd\0kbg\0kbu\0kby\0kca\0kcy\0kdq\0kdt\0ket\0kev\0kex\0key\0kfa\0" + "kfb\0kfc\0kfd\0kfe\0kfg\0kfh\0kfi\0kfk\0kfm\0kfp\0kfq\0kfr\0kfs\0" + "kfu\0kfx\0kfy\0kgj\0kgy\0khb\0khf\0khg\0khn\0kho\0kht\0khv\0khw\0" + "kif\0kim\0kip\0kjg\0kjh\0kjl\0kjo\0kjp\0kjt\0kjz\0kk\0kk_AF\0" + "kk_CN\0kk_IR\0kk_MN\0kkf\0kkh\0kkt\0kle\0klj\0klr\0km\0kmj\0kmz\0" + "kn\0knn\0ko\0koi\0kok\0kpt\0kpy\0kqd\0kqy\0kra\0krc\0krk\0krr\0" + "kru\0krv\0ks\0ksu\0ksw\0ksz\0ktb\0kte\0ktl\0ktp\0ku_AM\0ku_AZ\0" + "ku_GE\0ku_IQ\0ku_IR\0ku_LB\0ku_TM\0kuf\0kum\0kv\0kva\0kvq\0kvt\0" + "kvx\0kvy\0kwx\0kxf\0kxk\0kxm\0kxp\0ky\0ky_CN\0kyu\0kyv\0kyw\0" + "kzq\0lab\0lad\0lae\0lah\0lbe\0lbf\0lbj\0lbm\0lbo\0lbr\0lcp\0lep\0" + "lez\0lhm\0lhs\0lif\0lis\0lkh\0lki\0lmh\0lmn\0lo\0loy\0lpo\0lrc\0" + "lrk\0lrl\0lsa\0lsd\0lss\0ltc\0luh\0luk\0luu\0luv\0luz\0lwl\0lwm\0" + "lya\0lzh\0lzz_GE\0mag\0mai\0mby\0mde\0mdf\0mdx\0mdy\0mey\0mfa\0" + "mfi\0mga\0mgp\0mhj\0mid\0mjl\0mjq\0mjr\0mjt\0mju\0mjv\0mjz\0mk\0" + "mkb\0mke\0mki\0mkm\0ml\0mlf\0mn\0mn_CN\0mnc\0mni\0mnj\0mnp\0mns\0" + "mnw\0mpz\0mr\0mra\0mrj\0mro\0mrr\0ms_CC\0mtm\0mtr\0mud\0muk\0" + "mut\0muv\0muz\0mve\0mvf\0mvy\0mvz\0mwr\0mwt\0mww\0my\0mym\0myv\0" + "myz\0mzb\0mzn\0nan\0nan_MO\0nan_TW\0nao\0ncd\0ncq\0ndf\0ne\0neg\0" + "neh\0nei\0nev\0new\0ngt\0nio\0nit\0niv\0nli\0nll\0nlm\0nlx\0nmm\0" + "nnp\0nod\0noe\0nog\0noi\0non\0nos\0npb\0nqo\0nrn\0nsd\0nsf\0nsk\0" + "nst\0nsv\0nty\0ntz\0nwc\0nwx\0nyl\0nyq\0nyw\0oaa\0oac\0oak\0oar\0" + "oav\0obm\0obr\0och\0odk\0oht\0oj\0ojs\0okm\0oko\0okz\0ola\0ole\0" + "omk\0omp\0omr\0omx\0omy\0oon\0or\0ort\0oru\0orv\0os\0osa\0osc\0" + "osd\0osi\0ota\0otb\0otk\0oty\0oui\0oyb\0pa\0pa_PK\0pal\0paq\0" + "pbt\0pcb\0pce\0pcf\0pcg\0pch\0pci\0pcj\0peg\0peo\0pgd\0pgg\0pgl\0" + "pgn\0phd\0phk\0phl\0phn\0pho\0phr\0pht\0phu\0phv\0phw\0pi_IN\0" + "pi_LK\0pi_MM\0pi_TH\0pka\0pkr\0plk\0pll\0pmh\0pnt\0pnt_RU\0pnx\0" + "prc\0prd\0prt\0prx\0ps\0psh\0psi\0pst\0psu\0pum\0pwo\0pwr\0pww\0" + "pyx\0qxq\0raa\0rab\0raf\0rah\0raj\0rav\0rbb\0rdb\0rei\0rhg\0rji\0" + "rjs\0rka\0rki\0rkt\0rmi\0rmt\0rmz\0rsk\0rtw\0ru\0rue\0rut\0rwr\0" + "ryu\0sa\0sah\0sam\0sat\0saz\0sbn\0sbu\0sck\0scl\0scp\0sct\0scu\0" + "scx\0sd\0sd_IN\0sdb\0sdf\0sdg\0sdh\0sdr\0sds\0sel\0sfm\0sgh\0" + "sgj\0sgr\0sgt\0sgw\0sgy\0shd\0shi\0shm\0shn\0shu\0shv\0si\0sia\0" + "sip\0siy\0siz\0sjc\0sjd\0sjp\0sjt\0skb\0skj\0skr\0sle\0smh\0smp\0" + "smu\0smy\0soa\0sog\0soi\0sou\0spt\0spv\0sqo\0sqq\0sqt\0sr\0srb\0" + "srh\0srx\0srz\0ssh\0sss\0sts\0stu\0stu_CN\0stv\0sty\0suz\0sva\0" + "swb\0swi\0swv\0sxu\0syc\0syl\0syn\0syr\0syw\0ta\0tab\0taj\0tbk\0" + "tcn\0tco\0tcx\0tcy\0tda\0tdb\0tdd\0tdg\0tdh\0te\0tes\0tg\0tg_PK\0" + "tge\0tgf\0th\0the\0thf\0thi\0thl\0thm\0thq\0thr\0ths\0ti\0tig\0" + "tij\0tin\0tjl\0tjo\0tkb\0tks\0tkt\0tmr\0tnv\0tov\0tpu\0tra\0trg\0" + "trm\0trw\0tsd\0tsj\0tt\0tth\0tto\0tts\0ttz\0tvn\0twm\0txg\0txo\0" + "tyr\0tyv\0ude\0udg\0udi\0udm\0ug\0ug_KZ\0ug_MN\0uga\0ugh\0ugo\0" + "uk\0uki\0ulc\0unr\0unr_NP\0unx\0ur\0urk\0ush\0uum\0uz_AF\0uz_CN\0" + "uzs\0vaa\0vaf\0vah\0vai\0vas\0vav\0vay\0vgr\0vjk\0vmd\0vmh\0wal\0" + "wbk\0wbq\0wbr\0wle\0wly\0wme\0wne\0wni\0wsg\0wsv\0wtm\0wuu\0xag\0" + "xal\0xan\0xas\0xco\0xcr\0xdq\0xhe\0xhm\0xis\0xka\0xkc\0xkf\0xkj\0" + "xkk\0xkp\0xlc\0xld\0xly\0xmf\0xmn\0xmr\0xna\0xnr\0xpg\0xpi\0xpm\0" + "xpr\0xrm\0xrn\0xsa\0xsd\0xsr\0xtq\0xua\0xub\0xuj\0xve\0xvi\0xwo\0" + "xzh\0yai\0ybh\0ybi\0ydg\0yea\0yej\0yeu\0ygp\0yhd\0yi\0yig\0yih\0" + "yin\0yiv\0ykg\0ykh\0yna\0ynk\0yoi\0yoy\0yrk\0ysd\0ysn\0ysp\0ysr\0" + "ysy\0yud\0yue\0yue_CN\0yug\0yux\0ywq\0ywu\0zau\0zba\0zch\0zdj\0" + "zeh\0zen\0zgb\0zgh\0zgm\0zgn\0zh\0zh_AU\0zh_BN\0zh_GB\0zh_GF\0" + "zh_HK\0zh_ID\0zh_MO\0zh_PA\0zh_PF\0zh_PH\0zh_SR\0zh_TH\0zh_TW\0" + "zh_US\0zh_VN\0zhd\0zkn\0zko\0zkt\0zkz\0zlj\0zln\0zlq\0zqe\0zrg\0" + "zrp\0zum\0zwa\0zyg\0zyn\0zzj\0"; const int32_t defaultScriptTable[] = { 0, 325, // aaf -> Mlym 4, 10, // aao -> Arab - 8, 150, // aat -> Grek + 8, 145, // aat -> Grek 12, 100, // ab -> Cyrl 15, 10, // abh -> Arab 19, 425, // abl -> Rjng @@ -123,7 +125,7 @@ const int32_t defaultScriptTable[] = { 39, 10, // acw -> Arab 43, 10, // acx -> Arab 47, 10, // adf -> Arab - 51, 545, // adx -> Tibt + 51, 550, // adx -> Tibt 55, 100, // ady -> Cyrl 59, 25, // ae -> Avst 62, 10, // aeb -> Arab @@ -138,12 +140,12 @@ const int32_t defaultScriptTable[] = { 98, 5, // aho -> Ahom 102, 105, // ahr -> Deva 106, 10, // aib -> Arab - 110, 485, // aii -> Syrc - 114, 185, // aij -> Hebr + 110, 490, // aii -> Syrc + 114, 180, // aij -> Hebr 118, 220, // ain -> Kana 122, 350, // aio -> Mymr 126, 10, // aiq -> Arab - 130, 580, // akk -> Xsux + 130, 585, // akk -> Xsux 134, 100, // akv -> Cyrl 138, 255, // alk -> Laoo 142, 325, // all -> Mlym @@ -151,8 +153,8 @@ const int32_t defaultScriptTable[] = { 150, 100, // alt -> Cyrl 154, 120, // alw -> Ethi 158, 120, // am -> Ethi - 161, 210, // ams -> Jpan - 165, 485, // amw -> Syrc + 161, 205, // ams -> Jpan + 165, 490, // amw -> Syrc 169, 100, // ani -> Cyrl 173, 105, // anp -> Deva 177, 105, // anq -> Deva @@ -170,7 +172,7 @@ const int32_t defaultScriptTable[] = { 224, 10, // ary -> Arab 228, 10, // arz -> Arab 232, 45, // as -> Beng - 235, 455, // ase -> Sgnw + 235, 460, // ase -> Sgnw 239, 10, // ask -> Arab 243, 105, // asr -> Deva 247, 10, // atn -> Arab @@ -203,9 +205,9 @@ const int32_t defaultScriptTable[] = { 358, 105, // bee -> Deva 362, 10, // bej -> Arab 366, 105, // bfb -> Deva - 370, 510, // bfq -> Taml + 370, 515, // bfq -> Taml 374, 10, // bft -> Arab - 378, 545, // bfu -> Tibt + 378, 550, // bfu -> Tibt 382, 385, // bfw -> Orya 386, 105, // bfy -> Deva 390, 105, // bfz -> Deva @@ -216,7 +218,7 @@ const int32_t defaultScriptTable[] = { 409, 10, // bgp -> Arab 413, 105, // bgq -> Deva 417, 105, // bgw -> Deva - 421, 150, // bgx -> Grek + 421, 145, // bgx -> Grek 425, 105, // bha -> Deva 429, 105, // bhb -> Deva 433, 105, // bhd -> Deva @@ -225,22 +227,22 @@ const int32_t defaultScriptTable[] = { 445, 105, // bhi -> Deva 449, 105, // bhj -> Deva 453, 10, // bhm -> Arab - 457, 485, // bhn -> Syrc + 457, 490, // bhn -> Syrc 461, 105, // bho -> Deva 465, 105, // bht -> Deva 469, 105, // bhu -> Deva 473, 105, // bix -> Deva 477, 105, // biy -> Deva - 481, 485, // bjf -> Syrc + 481, 490, // bjf -> Syrc 485, 105, // bjj -> Deva 489, 10, // bjm -> Arab - 493, 545, // bkk -> Tibt + 493, 550, // bkk -> Tibt 497, 350, // blk -> Mymr - 501, 520, // blt -> Tavt + 501, 525, // blt -> Tavt 505, 105, // bmj -> Deva 509, 45, // bn -> Beng 512, 105, // bns -> Deva - 516, 545, // bo -> Tibt + 516, 550, // bo -> Tibt 519, 100, // bph -> Cyrl 523, 105, // bpx -> Deva 527, 45, // bpy -> Beng @@ -250,7 +252,7 @@ const int32_t defaultScriptTable[] = { 543, 105, // brd -> Deva 547, 10, // brh -> Arab 551, 10, // brk -> Arab - 555, 545, // bro -> Tibt + 555, 550, // bro -> Tibt 559, 255, // brv -> Laoo 563, 240, // brw -> Knda 567, 105, // brx -> Deva @@ -267,19 +269,19 @@ const int32_t defaultScriptTable[] = { 611, 105, // byh -> Deva 615, 120, // byn -> Ethi 619, 105, // byw -> Deva - 623, 540, // bzi -> Thai - 627, 540, // cbn -> Thai + 623, 545, // bzi -> Thai + 627, 545, // cbn -> Thai 631, 60, // ccp -> Cakm - 635, 525, // cde -> Telu + 635, 530, // cde -> Telu 639, 105, // cdh -> Deva - 643, 155, // cdi -> Gujr + 643, 150, // cdi -> Gujr 647, 105, // cdj -> Deva 651, 105, // cdm -> Deva 655, 105, // cdn -> Deva - 659, 175, // cdo -> Hans + 659, 170, // cdo -> Hans 663, 45, // cdz -> Beng 667, 100, // ce -> Cyrl - 670, 545, // cgk -> Tibt + 670, 550, // cgk -> Tibt 674, 10, // chg -> Arab 678, 100, // chm -> Cyrl 682, 80, // chr -> Cher @@ -288,897 +290,914 @@ const int32_t defaultScriptTable[] = { 694, 10, // cja -> Arab 698, 100, // cji -> Cyrl 702, 75, // cjm -> Cham - 706, 175, // cjy -> Hans + 706, 170, // cjy -> Hans 710, 10, // ckb -> Arab 714, 100, // ckt -> Cyrl 718, 10, // clh -> Arab 722, 100, // clw -> Cyrl - 726, 480, // cmg -> Soyo - 730, 545, // cna -> Tibt - 734, 175, // cnp -> Hans - 738, 540, // cog -> Thai - 742, 90, // cop -> Copt - 746, 150, // cpg -> Grek - 750, 65, // cr -> Cans - 753, 100, // crh -> Cyrl - 757, 65, // crj -> Cans - 761, 65, // crk -> Cans - 765, 65, // crl -> Cans - 769, 65, // crm -> Cans - 773, 350, // csh -> Mymr - 777, 175, // csp -> Hans - 781, 65, // csw -> Cans - 785, 400, // ctd -> Pauc - 789, 45, // ctg -> Beng - 793, 105, // ctn -> Deva - 797, 510, // ctt -> Taml - 801, 510, // cty -> Taml - 805, 100, // cu -> Cyrl - 808, 250, // cuu -> Lana - 812, 100, // cv -> Cyrl - 815, 175, // czh -> Hans - 819, 185, // czk -> Hebr - 823, 105, // daq -> Deva - 827, 100, // dar -> Cyrl - 831, 10, // dcc -> Arab - 835, 100, // ddo -> Cyrl - 839, 10, // def -> Arab - 843, 10, // deh -> Arab - 847, 45, // der -> Beng - 851, 10, // dgl -> Arab - 855, 105, // dhi -> Deva - 859, 155, // dhn -> Gujr - 863, 155, // dho -> Gujr - 867, 105, // dhw -> Deva - 871, 545, // dka -> Tibt - 875, 100, // dlg -> Cyrl - 879, 315, // dmf -> Medf - 883, 10, // dmk -> Arab - 887, 10, // dml -> Arab - 891, 100, // dng -> Cyrl - 895, 350, // dnu -> Mymr - 899, 350, // dnv -> Mymr - 903, 105, // doi -> Deva - 907, 120, // dox -> Ethi - 911, 545, // dre -> Tibt - 915, 105, // drq -> Deva - 919, 120, // drs -> Ethi - 923, 105, // dry -> Deva - 927, 385, // dso -> Orya - 931, 105, // dty -> Deva - 935, 155, // dub -> Gujr - 939, 105, // duh -> Deva - 943, 105, // dus -> Deva - 947, 535, // dv -> Thaa - 950, 385, // dwk -> Orya - 954, 105, // dwz -> Deva - 958, 545, // dz -> Tibt - 961, 545, // dzl -> Tibt - 965, 150, // ecr -> Grek - 969, 95, // ecy -> Cprt - 973, 110, // egy -> Egyp - 977, 215, // eky -> Kali - 981, 150, // el -> Grek - 984, 105, // emg -> Deva - 988, 105, // emu -> Deva - 992, 100, // enf -> Cyrl - 996, 100, // enh -> Cyrl - 1000, 510, // era -> Taml - 1004, 135, // esg -> Gonm - 1008, 10, // esh -> Arab - 1012, 200, // ett -> Ital - 1016, 100, // eve -> Cyrl - 1020, 100, // evn -> Cyrl - 1024, 10, // fa -> Arab - 1027, 10, // fay -> Arab - 1031, 10, // faz -> Arab - 1035, 10, // fia -> Arab - 1039, 105, // fmu -> Deva - 1043, 10, // fub -> Arab - 1047, 175, // gan -> Hans - 1051, 385, // gaq -> Orya - 1055, 155, // gas -> Gujr - 1059, 525, // gau -> Telu - 1063, 385, // gbj -> Orya - 1067, 105, // gbk -> Deva - 1071, 155, // gbl -> Gujr - 1075, 105, // gbm -> Deva - 1079, 10, // gbz -> Arab - 1083, 385, // gdb -> Orya - 1087, 100, // gdo -> Cyrl - 1091, 105, // gdx -> Deva - 1095, 120, // gez -> Ethi - 1099, 10, // ggg -> Arab - 1103, 10, // gha -> Arab - 1107, 105, // ghe -> Deva - 1111, 530, // gho -> Tfng - 1115, 10, // ghr -> Arab - 1119, 545, // ght -> Tibt - 1123, 10, // gig -> Arab - 1127, 100, // gin -> Cyrl - 1131, 10, // gjk -> Arab - 1135, 10, // gju -> Arab - 1139, 100, // gld -> Cyrl - 1143, 10, // glh -> Arab - 1147, 10, // glk -> Arab - 1151, 260, // gml -> Latf - 1155, 120, // gmv -> Ethi - 1159, 280, // gmy -> Linb - 1163, 545, // goe -> Tibt - 1167, 120, // gof -> Ethi - 1171, 105, // goj -> Deva - 1175, 105, // gok -> Deva - 1179, 105, // gon -> Deva - 1183, 140, // got -> Goth - 1187, 105, // gra -> Deva - 1191, 150, // grc -> Grek - 1195, 10, // grr -> Arab - 1199, 45, // grt -> Beng - 1203, 120, // gru -> Ethi - 1207, 155, // gu -> Gujr - 1210, 105, // gvr -> Deva - 1214, 10, // gwc -> Arab - 1218, 10, // gwf -> Arab - 1222, 10, // gwt -> Arab - 1226, 105, // gyo -> Deva - 1230, 10, // gzi -> Arab - 1234, 10, // ha_CM -> Arab - 1240, 10, // ha_SD -> Arab - 1246, 10, // hac -> Arab - 1250, 175, // hak -> Hans - 1254, 180, // hak_TW -> Hant - 1261, 120, // har -> Ethi - 1265, 10, // haz -> Arab - 1269, 185, // hbo -> Hebr - 1273, 120, // hdy -> Ethi - 1277, 185, // he -> Hebr - 1280, 105, // hi -> Deva - 1283, 105, // hif -> Deva - 1287, 495, // hii -> Takr - 1291, 580, // hit -> Xsux - 1295, 10, // hkh -> Arab - 1299, 105, // hlb -> Deva - 1303, 190, // hlu -> Hluw - 1307, 415, // hmd -> Plrd - 1311, 50, // hmj -> Bopo - 1315, 50, // hmq -> Bopo - 1319, 10, // hnd -> Arab - 1323, 105, // hne -> Deva - 1327, 195, // hnj -> Hmnp - 1331, 175, // hnm -> Hans - 1335, 10, // hno -> Arab - 1339, 105, // hoc -> Deva - 1343, 10, // hoh -> Arab - 1347, 105, // hoj -> Deva - 1351, 170, // how -> Hani - 1355, 105, // hoy -> Deva - 1359, 350, // hpo -> Mymr - 1363, 485, // hrt -> Syrc - 1367, 10, // hrz -> Arab - 1371, 175, // hsn -> Hans - 1375, 10, // hss -> Arab - 1379, 580, // htx -> Xsux - 1383, 105, // hut -> Deva - 1387, 185, // huy -> Hebr - 1391, 100, // huz -> Cyrl - 1395, 20, // hy -> Armn - 1398, 20, // hyw -> Armn - 1402, 585, // ii -> Yiii - 1405, 290, // imy -> Lyci - 1409, 100, // inh -> Cyrl - 1413, 350, // int -> Mymr - 1417, 120, // ior -> Ethi - 1421, 510, // iru -> Taml - 1425, 10, // isk -> Arab - 1429, 185, // itk -> Hebr - 1433, 100, // itl -> Cyrl - 1437, 65, // iu -> Cans - 1440, 185, // iw -> Hebr - 1443, 210, // ja -> Jpan - 1446, 10, // jad -> Arab - 1450, 10, // jat -> Arab - 1454, 185, // jbe -> Hebr - 1458, 10, // jbn -> Arab - 1462, 100, // jct -> Cyrl - 1466, 545, // jda -> Tibt - 1470, 10, // jdg -> Arab - 1474, 100, // jdt -> Cyrl - 1478, 105, // jee -> Deva - 1482, 125, // jge -> Geor - 1486, 185, // ji -> Hebr - 1489, 165, // jje -> Hang - 1493, 350, // jkm -> Mymr - 1497, 105, // jml -> Deva - 1501, 495, // jna -> Takr - 1505, 10, // jnd -> Arab - 1509, 105, // jnl -> Deva - 1513, 105, // jns -> Deva - 1517, 10, // jog -> Arab - 1521, 185, // jpa -> Hebr - 1525, 185, // jpr -> Hebr - 1529, 185, // jrb -> Hebr - 1533, 105, // jul -> Deva - 1537, 385, // jun -> Orya - 1541, 385, // juy -> Orya - 1545, 545, // jya -> Tibt - 1549, 185, // jye -> Hebr - 1553, 125, // ka -> Geor - 1556, 100, // kaa -> Cyrl - 1560, 100, // kap -> Cyrl - 1564, 30, // kaw -> Bali - 1568, 100, // kbd -> Cyrl - 1572, 545, // kbg -> Tibt - 1576, 10, // kbu -> Arab - 1580, 10, // kby -> Arab - 1584, 100, // kca -> Cyrl - 1588, 10, // kcy -> Arab - 1592, 45, // kdq -> Beng - 1596, 540, // kdt -> Thai - 1600, 100, // ket -> Cyrl - 1604, 325, // kev -> Mlym - 1608, 105, // kex -> Deva - 1612, 525, // key -> Telu - 1616, 240, // kfa -> Knda - 1620, 105, // kfb -> Deva - 1624, 525, // kfc -> Telu - 1628, 240, // kfd -> Knda - 1632, 510, // kfe -> Taml - 1636, 240, // kfg -> Knda - 1640, 325, // kfh -> Mlym - 1644, 510, // kfi -> Taml - 1648, 105, // kfk -> Deva - 1652, 10, // kfm -> Arab - 1656, 105, // kfp -> Deva - 1660, 105, // kfq -> Deva - 1664, 105, // kfr -> Deva - 1668, 105, // kfs -> Deva - 1672, 105, // kfu -> Deva - 1676, 105, // kfx -> Deva - 1680, 105, // kfy -> Deva - 1684, 105, // kgj -> Deva - 1688, 545, // kgy -> Tibt - 1692, 505, // khb -> Talu - 1696, 540, // khf -> Thai - 1700, 545, // khg -> Tibt - 1704, 105, // khn -> Deva - 1708, 55, // kho -> Brah - 1712, 350, // kht -> Mymr - 1716, 100, // khv -> Cyrl - 1720, 10, // khw -> Arab - 1724, 105, // kif -> Deva - 1728, 100, // kim -> Cyrl - 1732, 105, // kip -> Deva - 1736, 255, // kjg -> Laoo - 1740, 100, // kjh -> Cyrl - 1744, 105, // kjl -> Deva - 1748, 105, // kjo -> Deva - 1752, 350, // kjp -> Mymr - 1756, 540, // kjt -> Thai - 1760, 545, // kjz -> Tibt - 1764, 100, // kk -> Cyrl - 1767, 10, // kk_AF -> Arab - 1773, 10, // kk_CN -> Arab - 1779, 10, // kk_IR -> Arab - 1785, 10, // kk_MN -> Arab - 1791, 545, // kkf -> Tibt - 1795, 250, // kkh -> Lana - 1799, 105, // kkt -> Deva - 1803, 105, // kle -> Deva - 1807, 10, // klj -> Arab - 1811, 105, // klr -> Deva - 1815, 230, // km -> Khmr - 1818, 105, // kmj -> Deva - 1822, 10, // kmz -> Arab - 1826, 240, // kn -> Knda - 1829, 105, // knn -> Deva - 1833, 245, // ko -> Kore - 1836, 100, // koi -> Cyrl - 1840, 105, // kok -> Deva - 1844, 100, // kpt -> Cyrl - 1848, 100, // kpy -> Cyrl - 1852, 485, // kqd -> Syrc - 1856, 120, // kqy -> Ethi - 1860, 105, // kra -> Deva - 1864, 100, // krc -> Cyrl - 1868, 100, // krk -> Cyrl - 1872, 230, // krr -> Khmr - 1876, 105, // kru -> Deva - 1880, 230, // krv -> Khmr - 1884, 10, // ks -> Arab - 1887, 350, // ksu -> Mymr - 1891, 350, // ksw -> Mymr - 1895, 105, // ksz -> Deva - 1899, 120, // ktb -> Ethi - 1903, 105, // kte -> Deva - 1907, 10, // ktl -> Arab - 1911, 415, // ktp -> Plrd - 1915, 100, // ku_AM -> Cyrl - 1921, 100, // ku_AZ -> Cyrl - 1927, 100, // ku_GE -> Cyrl - 1933, 10, // ku_IQ -> Arab - 1939, 10, // ku_IR -> Arab - 1945, 10, // ku_LB -> Arab - 1951, 100, // ku_TM -> Cyrl - 1957, 255, // kuf -> Laoo - 1961, 100, // kum -> Cyrl - 1965, 100, // kv -> Cyrl - 1968, 100, // kva -> Cyrl - 1972, 350, // kvq -> Mymr - 1976, 350, // kvt -> Mymr - 1980, 10, // kvx -> Arab - 1984, 215, // kvy -> Kali - 1988, 105, // kwx -> Deva - 1992, 350, // kxf -> Mymr - 1996, 350, // kxk -> Mymr - 2000, 540, // kxm -> Thai - 2004, 10, // kxp -> Arab - 2008, 100, // ky -> Cyrl - 2011, 10, // ky_CN -> Arab - 2017, 215, // kyu -> Kali - 2021, 105, // kyv -> Deva - 2025, 105, // kyw -> Deva - 2029, 275, // lab -> Lina - 2033, 185, // lad -> Hebr - 2037, 105, // lae -> Deva - 2041, 10, // lah -> Arab - 2045, 100, // lbe -> Cyrl - 2049, 105, // lbf -> Deva - 2053, 545, // lbj -> Tibt - 2057, 105, // lbm -> Deva - 2061, 255, // lbo -> Laoo - 2065, 105, // lbr -> Deva - 2069, 540, // lcp -> Thai - 2073, 270, // lep -> Lepc - 2077, 100, // lez -> Cyrl - 2081, 105, // lhm -> Deva - 2085, 485, // lhs -> Syrc - 2089, 105, // lif -> Deva - 2093, 285, // lis -> Lisu - 2097, 545, // lkh -> Tibt - 2101, 10, // lki -> Arab - 2105, 105, // lmh -> Deva - 2109, 525, // lmn -> Telu - 2113, 255, // lo -> Laoo - 2116, 105, // loy -> Deva - 2120, 415, // lpo -> Plrd - 2124, 10, // lrc -> Arab - 2128, 10, // lrk -> Arab - 2132, 10, // lrl -> Arab - 2136, 10, // lsa -> Arab - 2140, 185, // lsd -> Hebr - 2144, 10, // lss -> Arab - 2148, 180, // ltc -> Hant - 2152, 175, // luh -> Hans - 2156, 545, // luk -> Tibt - 2160, 105, // luu -> Deva - 2164, 10, // luv -> Arab - 2168, 10, // luz -> Arab - 2172, 540, // lwl -> Thai - 2176, 540, // lwm -> Thai - 2180, 545, // lya -> Tibt - 2184, 180, // lzh -> Hant - 2188, 125, // lzz_GE -> Geor - 2195, 105, // mag -> Deva - 2199, 105, // mai -> Deva - 2203, 10, // mby -> Arab - 2207, 10, // mde -> Arab - 2211, 100, // mdf -> Cyrl - 2215, 120, // mdx -> Ethi - 2219, 120, // mdy -> Ethi - 2223, 10, // mey -> Arab - 2227, 10, // mfa -> Arab - 2231, 10, // mfi -> Arab - 2235, 265, // mga -> Latg - 2239, 105, // mgp -> Deva - 2243, 10, // mhj -> Arab - 2247, 300, // mid -> Mand - 2251, 105, // mjl -> Deva - 2255, 325, // mjq -> Mlym - 2259, 325, // mjr -> Mlym - 2263, 105, // mjt -> Deva - 2267, 525, // mju -> Telu - 2271, 325, // mjv -> Mlym - 2275, 105, // mjz -> Deva - 2279, 100, // mk -> Cyrl - 2282, 105, // mkb -> Deva - 2286, 105, // mke -> Deva - 2290, 10, // mki -> Arab - 2294, 540, // mkm -> Thai - 2298, 325, // ml -> Mlym - 2301, 540, // mlf -> Thai - 2305, 100, // mn -> Cyrl - 2308, 335, // mn_CN -> Mong - 2314, 335, // mnc -> Mong - 2318, 45, // mni -> Beng - 2322, 10, // mnj -> Arab - 2326, 100, // mns -> Cyrl - 2330, 350, // mnw -> Mymr - 2334, 540, // mpz -> Thai - 2338, 105, // mr -> Deva - 2341, 540, // mra -> Thai - 2345, 105, // mrd -> Deva - 2349, 100, // mrj -> Cyrl - 2353, 340, // mro -> Mroo - 2357, 105, // mrr -> Deva - 2361, 10, // ms_CC -> Arab - 2367, 100, // mtm -> Cyrl - 2371, 105, // mtr -> Deva - 2375, 100, // mud -> Cyrl - 2379, 545, // muk -> Tibt - 2383, 105, // mut -> Deva - 2387, 510, // muv -> Taml - 2391, 120, // muz -> Ethi - 2395, 10, // mve -> Arab - 2399, 335, // mvf -> Mong - 2403, 10, // mvy -> Arab - 2407, 120, // mvz -> Ethi - 2411, 105, // mwr -> Deva - 2415, 350, // mwt -> Mymr - 2419, 195, // mww -> Hmnp - 2423, 350, // my -> Mymr - 2426, 120, // mym -> Ethi - 2430, 100, // myv -> Cyrl - 2434, 300, // myz -> Mand - 2438, 10, // mzb -> Arab - 2442, 10, // mzn -> Arab - 2446, 175, // nan -> Hans - 2450, 180, // nan_MO -> Hant - 2457, 180, // nan_TW -> Hant - 2464, 105, // nao -> Deva - 2468, 105, // ncd -> Deva - 2472, 255, // ncq -> Laoo - 2476, 100, // ndf -> Cyrl - 2480, 105, // ne -> Deva - 2483, 100, // neg -> Cyrl - 2487, 545, // neh -> Tibt - 2491, 580, // nei -> Xsux - 2495, 105, // new -> Deva - 2499, 255, // ngt -> Laoo - 2503, 100, // nio -> Cyrl - 2507, 525, // nit -> Telu - 2511, 100, // niv -> Cyrl - 2515, 10, // nli -> Arab - 2519, 10, // nlm -> Arab - 2523, 105, // nlx -> Deva - 2527, 105, // nmm -> Deva - 2531, 570, // nnp -> Wcho - 2535, 250, // nod -> Lana - 2539, 105, // noe -> Deva - 2543, 100, // nog -> Cyrl - 2547, 105, // noi -> Deva - 2551, 435, // non -> Runr - 2555, 585, // nos -> Yiii - 2559, 545, // npb -> Tibt - 2563, 365, // nqo -> Nkoo - 2567, 435, // nrn -> Runr - 2571, 585, // nsd -> Yiii - 2575, 585, // nsf -> Yiii - 2579, 65, // nsk -> Cans - 2583, 550, // nst -> Tnsa - 2587, 585, // nsv -> Yiii - 2591, 585, // nty -> Yiii - 2595, 10, // ntz -> Arab - 2599, 360, // nwc -> Newa - 2603, 105, // nwx -> Deva - 2607, 540, // nyl -> Thai - 2611, 10, // nyq -> Arab - 2615, 540, // nyw -> Thai - 2619, 100, // oaa -> Cyrl - 2623, 100, // oac -> Cyrl - 2627, 485, // oar -> Syrc - 2631, 125, // oav -> Geor - 2635, 410, // obm -> Phnx - 2639, 350, // obr -> Mymr - 2643, 10, // odk -> Arab - 2647, 580, // oht -> Xsux - 2651, 65, // oj -> Cans - 2654, 65, // ojs -> Cans - 2658, 165, // okm -> Hang - 2662, 170, // oko -> Hani - 2666, 230, // okz -> Khmr - 2670, 105, // ola -> Deva - 2674, 545, // ole -> Tibt - 2678, 100, // omk -> Cyrl - 2682, 345, // omp -> Mtei - 2686, 330, // omr -> Modi - 2690, 350, // omx -> Mymr - 2694, 105, // oon -> Deva - 2698, 385, // or -> Orya - 2701, 525, // ort -> Telu - 2705, 10, // oru -> Arab - 2709, 100, // orv -> Cyrl - 2713, 100, // os -> Cyrl - 2716, 390, // osa -> Osge - 2720, 200, // osc -> Ital - 2724, 205, // osi -> Java - 2728, 10, // ota -> Arab - 2732, 545, // otb -> Tibt - 2736, 380, // otk -> Orkh - 2740, 145, // oty -> Gran - 2744, 395, // oui -> Ougr - 2748, 255, // oyb -> Laoo - 2752, 160, // pa -> Guru - 2755, 10, // pa_PK -> Arab - 2761, 405, // pal -> Phli - 2765, 100, // paq -> Cyrl - 2769, 10, // pbt -> Arab - 2773, 230, // pcb -> Khmr - 2777, 350, // pce -> Mymr - 2781, 325, // pcf -> Mlym - 2785, 325, // pcg -> Mlym - 2789, 105, // pch -> Deva - 2793, 105, // pci -> Deva - 2797, 525, // pcj -> Telu - 2801, 385, // peg -> Orya - 2805, 575, // peo -> Xpeo - 2809, 225, // pgd -> Khar - 2813, 105, // pgg -> Deva - 2817, 370, // pgl -> Ogam - 2821, 200, // pgn -> Ital - 2825, 105, // phd -> Deva - 2829, 350, // phk -> Mymr - 2833, 10, // phl -> Arab - 2837, 410, // phn -> Phnx - 2841, 255, // pho -> Laoo - 2845, 10, // phr -> Arab - 2849, 540, // pht -> Thai - 2853, 540, // phu -> Thai - 2857, 10, // phv -> Arab - 2861, 105, // phw -> Deva - 2865, 105, // pi_IN -> Deva - 2871, 465, // pi_LK -> Sinh - 2877, 350, // pi_MM -> Mymr - 2883, 540, // pi_TH -> Thai - 2889, 55, // pka -> Brah - 2893, 325, // pkr -> Mlym - 2897, 10, // plk -> Arab - 2901, 350, // pll -> Mymr - 2905, 55, // pmh -> Brah - 2909, 150, // pnt -> Grek - 2913, 100, // pnt_RU -> Cyrl - 2920, 10, // prc -> Arab - 2924, 10, // prd -> Arab - 2928, 540, // prt -> Thai - 2932, 10, // prx -> Arab - 2936, 10, // ps -> Arab - 2939, 10, // psh -> Arab - 2943, 10, // psi -> Arab - 2947, 10, // pst -> Arab - 2951, 55, // psu -> Brah - 2955, 105, // pum -> Deva - 2959, 350, // pwo -> Mymr - 2963, 105, // pwr -> Deva - 2967, 540, // pww -> Thai - 2971, 350, // pyx -> Mymr - 2975, 10, // qxq -> Arab - 2979, 105, // raa -> Deva - 2983, 105, // rab -> Deva - 2987, 105, // raf -> Deva - 2991, 45, // rah -> Beng - 2995, 105, // raj -> Deva - 2999, 105, // rav -> Deva - 3003, 350, // rbb -> Mymr - 3007, 10, // rdb -> Arab - 3011, 385, // rei -> Orya - 3015, 430, // rhg -> Rohg - 3019, 105, // rji -> Deva - 3023, 105, // rjs -> Deva - 3027, 230, // rka -> Khmr - 3031, 350, // rki -> Mymr - 3035, 45, // rkt -> Beng - 3039, 20, // rmi -> Armn - 3043, 10, // rmt -> Arab - 3047, 350, // rmz -> Mymr - 3051, 100, // rsk -> Cyrl - 3055, 105, // rtw -> Deva - 3059, 100, // ru -> Cyrl - 3062, 100, // rue -> Cyrl - 3066, 100, // rut -> Cyrl - 3070, 105, // rwr -> Deva - 3074, 220, // ryu -> Kana - 3078, 105, // sa -> Deva - 3081, 100, // sah -> Cyrl - 3085, 440, // sam -> Samr - 3089, 375, // sat -> Olck - 3093, 450, // saz -> Saur - 3097, 10, // sbn -> Arab - 3101, 545, // sbu -> Tibt - 3105, 105, // sck -> Deva - 3109, 10, // scl -> Arab - 3113, 105, // scp -> Deva - 3117, 255, // sct -> Laoo - 3121, 495, // scu -> Takr - 3125, 150, // scx -> Grek - 3129, 10, // sd -> Arab - 3132, 105, // sd_IN -> Deva - 3138, 10, // sdb -> Arab - 3142, 10, // sdf -> Arab - 3146, 10, // sdg -> Arab - 3150, 10, // sdh -> Arab - 3154, 45, // sdr -> Beng - 3158, 10, // sds -> Arab - 3162, 100, // sel -> Cyrl - 3166, 415, // sfm -> Plrd - 3170, 100, // sgh -> Cyrl - 3174, 105, // sgj -> Deva - 3178, 10, // sgr -> Arab - 3182, 545, // sgt -> Tibt - 3186, 120, // sgw -> Ethi - 3190, 10, // sgy -> Arab - 3194, 10, // shd -> Arab - 3198, 530, // shi -> Tfng - 3202, 10, // shm -> Arab - 3206, 350, // shn -> Mymr - 3210, 10, // shu -> Arab - 3214, 10, // shv -> Arab - 3218, 465, // si -> Sinh - 3221, 100, // sia -> Cyrl - 3225, 545, // sip -> Tibt - 3229, 10, // siy -> Arab - 3233, 10, // siz -> Arab - 3237, 175, // sjc -> Hans - 3241, 100, // sjd -> Cyrl - 3245, 105, // sjp -> Deva - 3249, 100, // sjt -> Cyrl - 3253, 540, // skb -> Thai - 3257, 105, // skj -> Deva - 3261, 10, // skr -> Arab - 3265, 585, // smh -> Yiii - 3269, 440, // smp -> Samr - 3273, 230, // smu -> Khmr - 3277, 10, // smy -> Arab - 3281, 520, // soa -> Tavt - 3285, 470, // sog -> Sogd - 3289, 105, // soi -> Deva - 3293, 540, // sou -> Thai - 3297, 545, // spt -> Tibt - 3301, 385, // spv -> Orya - 3305, 10, // sqo -> Arab - 3309, 255, // sqq -> Laoo - 3313, 10, // sqt -> Arab - 3317, 100, // sr -> Cyrl - 3320, 475, // srb -> Sora - 3324, 10, // srh -> Arab - 3328, 105, // srx -> Deva - 3332, 10, // srz -> Arab - 3336, 10, // ssh -> Arab - 3340, 255, // sss -> Laoo - 3344, 10, // sts -> Arab - 3348, 250, // stu -> Lana - 3352, 500, // stu_CN -> Tale - 3359, 120, // stv -> Ethi - 3363, 100, // sty -> Cyrl - 3367, 105, // suz -> Deva - 3371, 125, // sva -> Geor - 3375, 10, // swb -> Arab - 3379, 170, // swi -> Hani - 3383, 105, // swv -> Deva - 3387, 435, // sxu -> Runr - 3391, 485, // syc -> Syrc - 3395, 45, // syl -> Beng - 3399, 485, // syn -> Syrc - 3403, 485, // syr -> Syrc - 3407, 105, // syw -> Deva - 3411, 510, // ta -> Taml - 3414, 100, // tab -> Cyrl - 3418, 105, // taj -> Deva - 3422, 490, // tbk -> Tagb - 3426, 105, // tcn -> Deva - 3430, 350, // tco -> Mymr - 3434, 510, // tcx -> Taml - 3438, 240, // tcy -> Knda - 3442, 530, // tda -> Tfng - 3446, 105, // tdb -> Deva - 3450, 500, // tdd -> Tale - 3454, 105, // tdg -> Deva - 3458, 105, // tdh -> Deva - 3462, 525, // te -> Telu - 3465, 205, // tes -> Java - 3469, 100, // tg -> Cyrl - 3472, 10, // tg_PK -> Arab - 3478, 105, // tge -> Deva - 3482, 545, // tgf -> Tibt - 3486, 540, // th -> Thai - 3489, 105, // the -> Deva - 3493, 105, // thf -> Deva - 3497, 500, // thi -> Tale - 3501, 105, // thl -> Deva - 3505, 540, // thm -> Thai - 3509, 105, // thq -> Deva - 3513, 105, // thr -> Deva - 3517, 105, // ths -> Deva - 3521, 120, // ti -> Ethi - 3524, 120, // tig -> Ethi - 3528, 105, // tij -> Deva - 3532, 100, // tin -> Cyrl - 3536, 350, // tjl -> Mymr - 3540, 10, // tjo -> Arab - 3544, 105, // tkb -> Deva - 3548, 10, // tks -> Arab - 3552, 105, // tkt -> Deva - 3556, 485, // tmr -> Syrc - 3560, 60, // tnv -> Cakm - 3564, 10, // tov -> Arab - 3568, 230, // tpu -> Khmr - 3572, 10, // tra -> Arab - 3576, 185, // trg -> Hebr - 3580, 10, // trm -> Arab - 3584, 10, // trw -> Arab - 3588, 150, // tsd -> Grek - 3592, 545, // tsj -> Tibt - 3596, 100, // tt -> Cyrl - 3599, 255, // tth -> Laoo - 3603, 255, // tto -> Laoo - 3607, 540, // tts -> Thai - 3611, 105, // ttz -> Deva - 3615, 350, // tvn -> Mymr - 3619, 545, // twm -> Tibt - 3623, 515, // txg -> Tang - 3627, 555, // txo -> Toto - 3631, 520, // tyr -> Tavt - 3635, 100, // tyv -> Cyrl - 3639, 100, // ude -> Cyrl - 3643, 325, // udg -> Mlym - 3647, 100, // udi -> Cyrl - 3651, 100, // udm -> Cyrl - 3655, 10, // ug -> Arab - 3658, 100, // ug_KZ -> Cyrl - 3664, 100, // ug_MN -> Cyrl - 3670, 560, // uga -> Ugar - 3674, 100, // ugh -> Cyrl - 3678, 540, // ugo -> Thai - 3682, 100, // uk -> Cyrl - 3685, 385, // uki -> Orya - 3689, 100, // ulc -> Cyrl - 3693, 45, // unr -> Beng - 3697, 105, // unr_NP -> Deva - 3704, 45, // unx -> Beng - 3708, 10, // ur -> Arab - 3711, 540, // urk -> Thai - 3715, 10, // ush -> Arab - 3719, 150, // uum -> Grek - 3723, 10, // uz_AF -> Arab - 3729, 100, // uz_CN -> Cyrl - 3735, 10, // uzs -> Arab - 3739, 510, // vaa -> Taml - 3743, 10, // vaf -> Arab - 3747, 105, // vah -> Deva - 3751, 565, // vai -> Vaii - 3755, 105, // vas -> Deva - 3759, 105, // vav -> Deva - 3763, 105, // vay -> Deva - 3767, 10, // vgr -> Arab - 3771, 105, // vjk -> Deva - 3775, 240, // vmd -> Knda - 3779, 10, // vmh -> Arab - 3783, 120, // wal -> Ethi - 3787, 10, // wbk -> Arab - 3791, 525, // wbq -> Telu - 3795, 105, // wbr -> Deva - 3799, 120, // wle -> Ethi - 3803, 10, // wlo -> Arab - 3807, 105, // wme -> Deva - 3811, 10, // wne -> Arab - 3815, 10, // wni -> Arab - 3819, 130, // wsg -> Gong - 3823, 10, // wsv -> Arab - 3827, 105, // wtm -> Deva - 3831, 175, // wuu -> Hans - 3835, 0, // xag -> Aghb - 3839, 100, // xal -> Cyrl - 3843, 120, // xan -> Ethi - 3847, 100, // xas -> Cyrl - 3851, 85, // xco -> Chrs - 3855, 70, // xcr -> Cari - 3859, 100, // xdq -> Cyrl - 3863, 10, // xhe -> Arab - 3867, 230, // xhm -> Khmr - 3871, 385, // xis -> Orya - 3875, 10, // xka -> Arab - 3879, 10, // xkc -> Arab - 3883, 545, // xkf -> Tibt - 3887, 10, // xkj -> Arab - 3891, 10, // xkp -> Arab - 3895, 290, // xlc -> Lyci - 3899, 295, // xld -> Lydi - 3903, 115, // xly -> Elym - 3907, 125, // xmf -> Geor - 3911, 305, // xmn -> Mani - 3915, 320, // xmr -> Merc - 3919, 355, // xna -> Narb - 3923, 105, // xnr -> Deva - 3927, 150, // xpg -> Grek - 3931, 370, // xpi -> Ogam - 3935, 100, // xpm -> Cyrl - 3939, 420, // xpr -> Prti - 3943, 100, // xrm -> Cyrl - 3947, 100, // xrn -> Cyrl - 3951, 445, // xsa -> Sarb - 3955, 460, // xsd -> Sidt - 3959, 105, // xsr -> Deva - 3963, 55, // xtq -> Brah - 3967, 510, // xub -> Taml - 3971, 510, // xuj -> Taml - 3975, 200, // xve -> Ital - 3979, 10, // xvi -> Arab - 3983, 100, // xwo -> Cyrl - 3987, 310, // xzh -> Marc - 3991, 100, // yai -> Cyrl - 3995, 105, // ybh -> Deva - 3999, 105, // ybi -> Deva - 4003, 10, // ydg -> Arab - 4007, 325, // yea -> Mlym - 4011, 150, // yej -> Grek - 4015, 525, // yeu -> Telu - 4019, 415, // ygp -> Plrd - 4023, 185, // yhd -> Hebr - 4027, 185, // yi -> Hebr - 4030, 585, // yig -> Yiii - 4034, 185, // yih -> Hebr - 4038, 585, // yiv -> Yiii - 4042, 100, // ykg -> Cyrl - 4046, 100, // ykh -> Cyrl - 4050, 415, // yna -> Plrd - 4054, 100, // ynk -> Cyrl - 4058, 210, // yoi -> Jpan - 4062, 540, // yoy -> Thai - 4066, 100, // yrk -> Cyrl - 4070, 585, // ysd -> Yiii - 4074, 585, // ysn -> Yiii - 4078, 585, // ysp -> Yiii - 4082, 100, // ysr -> Cyrl - 4086, 415, // ysy -> Plrd - 4090, 185, // yud -> Hebr - 4094, 180, // yue -> Hant - 4098, 175, // yue_CN -> Hans - 4105, 100, // yug -> Cyrl - 4109, 100, // yux -> Cyrl - 4113, 415, // ywq -> Plrd - 4117, 415, // ywu -> Plrd - 4121, 545, // zau -> Tibt - 4125, 10, // zba -> Arab - 4129, 170, // zch -> Hani - 4133, 10, // zdj -> Arab - 4137, 170, // zeh -> Hani - 4141, 530, // zen -> Tfng - 4145, 170, // zgb -> Hani - 4149, 530, // zgh -> Tfng - 4153, 170, // zgm -> Hani - 4157, 170, // zgn -> Hani - 4161, 175, // zh -> Hans - 4164, 180, // zh_AU -> Hant - 4170, 180, // zh_BN -> Hant - 4176, 180, // zh_GB -> Hant - 4182, 180, // zh_GF -> Hant - 4188, 180, // zh_HK -> Hant - 4194, 180, // zh_ID -> Hant - 4200, 180, // zh_MO -> Hant - 4206, 180, // zh_PA -> Hant - 4212, 180, // zh_PF -> Hant - 4218, 180, // zh_PH -> Hant - 4224, 180, // zh_SR -> Hant - 4230, 180, // zh_TH -> Hant - 4236, 180, // zh_TW -> Hant - 4242, 180, // zh_US -> Hant - 4248, 180, // zh_VN -> Hant - 4254, 170, // zhd -> Hani - 4258, 100, // zko -> Cyrl - 4262, 235, // zkt -> Kits - 4266, 100, // zkz -> Cyrl - 4270, 170, // zlj -> Hani - 4274, 170, // zln -> Hani - 4278, 170, // zlq -> Hani - 4282, 170, // zqe -> Hani - 4286, 385, // zrg -> Orya - 4290, 185, // zrp -> Hebr - 4294, 10, // zum -> Arab - 4298, 120, // zwa -> Ethi - 4302, 170, // zyg -> Hani - 4306, 170, // zyn -> Hani - 4310, 170, // zzj -> Hani + 726, 485, // cmg -> Soyo + 730, 550, // cna -> Tibt + 734, 170, // cnp -> Hans + 738, 535, // cnu -> Tfng + 742, 545, // cog -> Thai + 746, 90, // cop -> Copt + 750, 145, // cpg -> Grek + 754, 170, // cpx -> Hans + 758, 65, // cr -> Cans + 761, 100, // crh -> Cyrl + 765, 65, // crj -> Cans + 769, 65, // crk -> Cans + 773, 65, // crl -> Cans + 777, 65, // crm -> Cans + 781, 350, // csh -> Mymr + 785, 350, // csj -> Mymr + 789, 170, // csp -> Hans + 793, 65, // csw -> Cans + 797, 400, // ctd -> Pauc + 801, 45, // ctg -> Beng + 805, 105, // ctn -> Deva + 809, 515, // ctt -> Taml + 813, 515, // cty -> Taml + 817, 100, // cu -> Cyrl + 820, 250, // cuu -> Lana + 824, 100, // cv -> Cyrl + 827, 170, // czh -> Hans + 831, 180, // czk -> Hebr + 835, 105, // daq -> Deva + 839, 100, // dar -> Cyrl + 843, 10, // dcc -> Arab + 847, 100, // ddo -> Cyrl + 851, 10, // def -> Arab + 855, 10, // deh -> Arab + 859, 45, // der -> Beng + 863, 10, // dgl -> Arab + 867, 105, // dhi -> Deva + 871, 150, // dhn -> Gujr + 875, 150, // dho -> Gujr + 879, 105, // dhw -> Deva + 883, 550, // dka -> Tibt + 887, 100, // dlg -> Cyrl + 891, 315, // dmf -> Medf + 895, 10, // dmk -> Arab + 899, 10, // dml -> Arab + 903, 100, // dng -> Cyrl + 907, 350, // dnu -> Mymr + 911, 350, // dnv -> Mymr + 915, 105, // doi -> Deva + 919, 120, // dox -> Ethi + 923, 550, // dre -> Tibt + 927, 105, // drq -> Deva + 931, 120, // drs -> Ethi + 935, 105, // dry -> Deva + 939, 385, // dso -> Orya + 943, 105, // dty -> Deva + 947, 150, // dub -> Gujr + 951, 105, // duh -> Deva + 955, 105, // dus -> Deva + 959, 540, // dv -> Thaa + 962, 385, // dwk -> Orya + 966, 105, // dwz -> Deva + 970, 550, // dz -> Tibt + 973, 550, // dzl -> Tibt + 977, 145, // ecr -> Grek + 981, 95, // ecy -> Cprt + 985, 110, // egy -> Egyp + 989, 215, // eky -> Kali + 993, 145, // el -> Grek + 996, 105, // emg -> Deva + 1000, 105, // emu -> Deva + 1004, 100, // enf -> Cyrl + 1008, 100, // enh -> Cyrl + 1012, 515, // era -> Taml + 1016, 130, // esg -> Gonm + 1020, 10, // esh -> Arab + 1024, 195, // ett -> Ital + 1028, 100, // eve -> Cyrl + 1032, 100, // evn -> Cyrl + 1036, 10, // fa -> Arab + 1039, 10, // fay -> Arab + 1043, 10, // faz -> Arab + 1047, 10, // fia -> Arab + 1051, 105, // fmu -> Deva + 1055, 10, // fub -> Arab + 1059, 170, // gan -> Hans + 1063, 385, // gaq -> Orya + 1067, 150, // gas -> Gujr + 1071, 530, // gau -> Telu + 1075, 385, // gbj -> Orya + 1079, 105, // gbk -> Deva + 1083, 150, // gbl -> Gujr + 1087, 105, // gbm -> Deva + 1091, 10, // gbz -> Arab + 1095, 385, // gdb -> Orya + 1099, 100, // gdo -> Cyrl + 1103, 105, // gdx -> Deva + 1107, 120, // gez -> Ethi + 1111, 10, // ggg -> Arab + 1115, 10, // gha -> Arab + 1119, 105, // ghe -> Deva + 1123, 535, // gho -> Tfng + 1127, 10, // ghr -> Arab + 1131, 550, // ght -> Tibt + 1135, 10, // gig -> Arab + 1139, 100, // gin -> Cyrl + 1143, 10, // gjk -> Arab + 1147, 10, // gju -> Arab + 1151, 100, // gld -> Cyrl + 1155, 10, // glh -> Arab + 1159, 10, // glk -> Arab + 1163, 260, // gml -> Latf + 1167, 120, // gmv -> Ethi + 1171, 280, // gmy -> Linb + 1175, 550, // goe -> Tibt + 1179, 120, // gof -> Ethi + 1183, 105, // goj -> Deva + 1187, 105, // gok -> Deva + 1191, 105, // gon -> Deva + 1195, 135, // got -> Goth + 1199, 105, // gra -> Deva + 1203, 145, // grc -> Grek + 1207, 10, // grr -> Arab + 1211, 45, // grt -> Beng + 1215, 120, // gru -> Ethi + 1219, 150, // gu -> Gujr + 1222, 105, // gvr -> Deva + 1226, 10, // gwc -> Arab + 1230, 10, // gwf -> Arab + 1234, 10, // gwt -> Arab + 1238, 105, // gyo -> Deva + 1242, 10, // gzi -> Arab + 1246, 10, // ha_CM -> Arab + 1252, 10, // ha_SD -> Arab + 1258, 10, // hac -> Arab + 1262, 170, // hak -> Hans + 1266, 175, // hak_TW -> Hant + 1273, 120, // har -> Ethi + 1277, 10, // haz -> Arab + 1281, 180, // hbo -> Hebr + 1285, 120, // hdy -> Ethi + 1289, 180, // he -> Hebr + 1292, 105, // hi -> Deva + 1295, 105, // hif -> Deva + 1299, 500, // hii -> Takr + 1303, 585, // hit -> Xsux + 1307, 10, // hkh -> Arab + 1311, 105, // hlb -> Deva + 1315, 185, // hlu -> Hluw + 1319, 415, // hmd -> Plrd + 1323, 50, // hmj -> Bopo + 1327, 50, // hmq -> Bopo + 1331, 10, // hnd -> Arab + 1335, 105, // hne -> Deva + 1339, 190, // hnj -> Hmnp + 1343, 170, // hnm -> Hans + 1347, 10, // hno -> Arab + 1351, 105, // hoc -> Deva + 1355, 10, // hoh -> Arab + 1359, 105, // hoj -> Deva + 1363, 165, // how -> Hani + 1367, 105, // hoy -> Deva + 1371, 350, // hpo -> Mymr + 1375, 490, // hrt -> Syrc + 1379, 10, // hrz -> Arab + 1383, 170, // hsn -> Hans + 1387, 10, // hss -> Arab + 1391, 585, // htx -> Xsux + 1395, 105, // hut -> Deva + 1399, 180, // huy -> Hebr + 1403, 100, // huz -> Cyrl + 1407, 20, // hy -> Armn + 1410, 20, // hyw -> Armn + 1414, 590, // ii -> Yiii + 1417, 290, // imy -> Lyci + 1421, 100, // inh -> Cyrl + 1425, 350, // int -> Mymr + 1429, 120, // ior -> Ethi + 1433, 515, // iru -> Taml + 1437, 10, // isk -> Arab + 1441, 180, // itk -> Hebr + 1445, 100, // itl -> Cyrl + 1449, 65, // iu -> Cans + 1452, 180, // iw -> Hebr + 1455, 205, // ja -> Jpan + 1458, 10, // jad -> Arab + 1462, 10, // jat -> Arab + 1466, 180, // jbe -> Hebr + 1470, 10, // jbn -> Arab + 1474, 100, // jct -> Cyrl + 1478, 550, // jda -> Tibt + 1482, 10, // jdg -> Arab + 1486, 100, // jdt -> Cyrl + 1490, 105, // jee -> Deva + 1494, 125, // jge -> Geor + 1498, 180, // ji -> Hebr + 1501, 160, // jje -> Hang + 1505, 350, // jkp -> Mymr + 1509, 105, // jml -> Deva + 1513, 500, // jna -> Takr + 1517, 10, // jnd -> Arab + 1521, 105, // jnl -> Deva + 1525, 105, // jns -> Deva + 1529, 10, // jog -> Arab + 1533, 180, // jpa -> Hebr + 1537, 180, // jpr -> Hebr + 1541, 180, // jrb -> Hebr + 1545, 210, // juc -> Jurc + 1549, 105, // jul -> Deva + 1553, 385, // jun -> Orya + 1557, 385, // juy -> Orya + 1561, 550, // jya -> Tibt + 1565, 180, // jye -> Hebr + 1569, 125, // ka -> Geor + 1572, 100, // kaa -> Cyrl + 1576, 100, // kap -> Cyrl + 1580, 30, // kaw -> Bali + 1584, 100, // kbd -> Cyrl + 1588, 550, // kbg -> Tibt + 1592, 10, // kbu -> Arab + 1596, 10, // kby -> Arab + 1600, 100, // kca -> Cyrl + 1604, 10, // kcy -> Arab + 1608, 45, // kdq -> Beng + 1612, 545, // kdt -> Thai + 1616, 100, // ket -> Cyrl + 1620, 325, // kev -> Mlym + 1624, 105, // kex -> Deva + 1628, 530, // key -> Telu + 1632, 240, // kfa -> Knda + 1636, 105, // kfb -> Deva + 1640, 530, // kfc -> Telu + 1644, 240, // kfd -> Knda + 1648, 515, // kfe -> Taml + 1652, 240, // kfg -> Knda + 1656, 325, // kfh -> Mlym + 1660, 515, // kfi -> Taml + 1664, 105, // kfk -> Deva + 1668, 10, // kfm -> Arab + 1672, 105, // kfp -> Deva + 1676, 105, // kfq -> Deva + 1680, 105, // kfr -> Deva + 1684, 105, // kfs -> Deva + 1688, 105, // kfu -> Deva + 1692, 105, // kfx -> Deva + 1696, 105, // kfy -> Deva + 1700, 105, // kgj -> Deva + 1704, 550, // kgy -> Tibt + 1708, 510, // khb -> Talu + 1712, 545, // khf -> Thai + 1716, 550, // khg -> Tibt + 1720, 105, // khn -> Deva + 1724, 55, // kho -> Brah + 1728, 350, // kht -> Mymr + 1732, 100, // khv -> Cyrl + 1736, 10, // khw -> Arab + 1740, 105, // kif -> Deva + 1744, 100, // kim -> Cyrl + 1748, 105, // kip -> Deva + 1752, 255, // kjg -> Laoo + 1756, 100, // kjh -> Cyrl + 1760, 105, // kjl -> Deva + 1764, 105, // kjo -> Deva + 1768, 350, // kjp -> Mymr + 1772, 545, // kjt -> Thai + 1776, 550, // kjz -> Tibt + 1780, 100, // kk -> Cyrl + 1783, 10, // kk_AF -> Arab + 1789, 10, // kk_CN -> Arab + 1795, 10, // kk_IR -> Arab + 1801, 10, // kk_MN -> Arab + 1807, 550, // kkf -> Tibt + 1811, 250, // kkh -> Lana + 1815, 105, // kkt -> Deva + 1819, 105, // kle -> Deva + 1823, 10, // klj -> Arab + 1827, 105, // klr -> Deva + 1831, 230, // km -> Khmr + 1834, 105, // kmj -> Deva + 1838, 10, // kmz -> Arab + 1842, 240, // kn -> Knda + 1845, 105, // knn -> Deva + 1849, 245, // ko -> Kore + 1852, 100, // koi -> Cyrl + 1856, 105, // kok -> Deva + 1860, 100, // kpt -> Cyrl + 1864, 100, // kpy -> Cyrl + 1868, 490, // kqd -> Syrc + 1872, 120, // kqy -> Ethi + 1876, 105, // kra -> Deva + 1880, 100, // krc -> Cyrl + 1884, 100, // krk -> Cyrl + 1888, 230, // krr -> Khmr + 1892, 105, // kru -> Deva + 1896, 230, // krv -> Khmr + 1900, 10, // ks -> Arab + 1903, 350, // ksu -> Mymr + 1907, 350, // ksw -> Mymr + 1911, 105, // ksz -> Deva + 1915, 120, // ktb -> Ethi + 1919, 105, // kte -> Deva + 1923, 10, // ktl -> Arab + 1927, 415, // ktp -> Plrd + 1931, 100, // ku_AM -> Cyrl + 1937, 100, // ku_AZ -> Cyrl + 1943, 100, // ku_GE -> Cyrl + 1949, 10, // ku_IQ -> Arab + 1955, 10, // ku_IR -> Arab + 1961, 10, // ku_LB -> Arab + 1967, 100, // ku_TM -> Cyrl + 1973, 255, // kuf -> Laoo + 1977, 100, // kum -> Cyrl + 1981, 100, // kv -> Cyrl + 1984, 100, // kva -> Cyrl + 1988, 350, // kvq -> Mymr + 1992, 350, // kvt -> Mymr + 1996, 10, // kvx -> Arab + 2000, 215, // kvy -> Kali + 2004, 105, // kwx -> Deva + 2008, 350, // kxf -> Mymr + 2012, 350, // kxk -> Mymr + 2016, 545, // kxm -> Thai + 2020, 10, // kxp -> Arab + 2024, 100, // ky -> Cyrl + 2027, 10, // ky_CN -> Arab + 2033, 215, // kyu -> Kali + 2037, 105, // kyv -> Deva + 2041, 105, // kyw -> Deva + 2045, 105, // kzq -> Deva + 2049, 275, // lab -> Lina + 2053, 180, // lad -> Hebr + 2057, 105, // lae -> Deva + 2061, 10, // lah -> Arab + 2065, 100, // lbe -> Cyrl + 2069, 105, // lbf -> Deva + 2073, 550, // lbj -> Tibt + 2077, 105, // lbm -> Deva + 2081, 255, // lbo -> Laoo + 2085, 105, // lbr -> Deva + 2089, 545, // lcp -> Thai + 2093, 270, // lep -> Lepc + 2097, 100, // lez -> Cyrl + 2101, 105, // lhm -> Deva + 2105, 490, // lhs -> Syrc + 2109, 105, // lif -> Deva + 2113, 285, // lis -> Lisu + 2117, 550, // lkh -> Tibt + 2121, 10, // lki -> Arab + 2125, 105, // lmh -> Deva + 2129, 530, // lmn -> Telu + 2133, 255, // lo -> Laoo + 2136, 105, // loy -> Deva + 2140, 415, // lpo -> Plrd + 2144, 10, // lrc -> Arab + 2148, 10, // lrk -> Arab + 2152, 10, // lrl -> Arab + 2156, 10, // lsa -> Arab + 2160, 180, // lsd -> Hebr + 2164, 10, // lss -> Arab + 2168, 175, // ltc -> Hant + 2172, 170, // luh -> Hans + 2176, 550, // luk -> Tibt + 2180, 105, // luu -> Deva + 2184, 10, // luv -> Arab + 2188, 10, // luz -> Arab + 2192, 545, // lwl -> Thai + 2196, 545, // lwm -> Thai + 2200, 550, // lya -> Tibt + 2204, 175, // lzh -> Hant + 2208, 125, // lzz_GE -> Geor + 2215, 105, // mag -> Deva + 2219, 105, // mai -> Deva + 2223, 10, // mby -> Arab + 2227, 10, // mde -> Arab + 2231, 100, // mdf -> Cyrl + 2235, 120, // mdx -> Ethi + 2239, 120, // mdy -> Ethi + 2243, 10, // mey -> Arab + 2247, 10, // mfa -> Arab + 2251, 10, // mfi -> Arab + 2255, 265, // mga -> Latg + 2259, 105, // mgp -> Deva + 2263, 10, // mhj -> Arab + 2267, 300, // mid -> Mand + 2271, 105, // mjl -> Deva + 2275, 325, // mjq -> Mlym + 2279, 325, // mjr -> Mlym + 2283, 105, // mjt -> Deva + 2287, 530, // mju -> Telu + 2291, 325, // mjv -> Mlym + 2295, 105, // mjz -> Deva + 2299, 100, // mk -> Cyrl + 2302, 105, // mkb -> Deva + 2306, 105, // mke -> Deva + 2310, 10, // mki -> Arab + 2314, 545, // mkm -> Thai + 2318, 325, // ml -> Mlym + 2321, 545, // mlf -> Thai + 2325, 100, // mn -> Cyrl + 2328, 335, // mn_CN -> Mong + 2334, 335, // mnc -> Mong + 2338, 45, // mni -> Beng + 2342, 10, // mnj -> Arab + 2346, 170, // mnp -> Hans + 2350, 100, // mns -> Cyrl + 2354, 350, // mnw -> Mymr + 2358, 545, // mpz -> Thai + 2362, 105, // mr -> Deva + 2365, 545, // mra -> Thai + 2369, 100, // mrj -> Cyrl + 2373, 340, // mro -> Mroo + 2377, 105, // mrr -> Deva + 2381, 10, // ms_CC -> Arab + 2387, 100, // mtm -> Cyrl + 2391, 105, // mtr -> Deva + 2395, 100, // mud -> Cyrl + 2399, 550, // muk -> Tibt + 2403, 105, // mut -> Deva + 2407, 515, // muv -> Taml + 2411, 120, // muz -> Ethi + 2415, 10, // mve -> Arab + 2419, 335, // mvf -> Mong + 2423, 10, // mvy -> Arab + 2427, 120, // mvz -> Ethi + 2431, 105, // mwr -> Deva + 2435, 350, // mwt -> Mymr + 2439, 190, // mww -> Hmnp + 2443, 350, // my -> Mymr + 2446, 120, // mym -> Ethi + 2450, 100, // myv -> Cyrl + 2454, 300, // myz -> Mand + 2458, 10, // mzb -> Arab + 2462, 10, // mzn -> Arab + 2466, 170, // nan -> Hans + 2470, 175, // nan_MO -> Hant + 2477, 175, // nan_TW -> Hant + 2484, 105, // nao -> Deva + 2488, 105, // ncd -> Deva + 2492, 255, // ncq -> Laoo + 2496, 100, // ndf -> Cyrl + 2500, 105, // ne -> Deva + 2503, 100, // neg -> Cyrl + 2507, 550, // neh -> Tibt + 2511, 585, // nei -> Xsux + 2515, 255, // nev -> Laoo + 2519, 105, // new -> Deva + 2523, 255, // ngt -> Laoo + 2527, 100, // nio -> Cyrl + 2531, 530, // nit -> Telu + 2535, 100, // niv -> Cyrl + 2539, 10, // nli -> Arab + 2543, 105, // nll -> Deva + 2547, 10, // nlm -> Arab + 2551, 105, // nlx -> Deva + 2555, 105, // nmm -> Deva + 2559, 575, // nnp -> Wcho + 2563, 250, // nod -> Lana + 2567, 105, // noe -> Deva + 2571, 100, // nog -> Cyrl + 2575, 105, // noi -> Deva + 2579, 435, // non -> Runr + 2583, 590, // nos -> Yiii + 2587, 550, // npb -> Tibt + 2591, 365, // nqo -> Nkoo + 2595, 435, // nrn -> Runr + 2599, 590, // nsd -> Yiii + 2603, 590, // nsf -> Yiii + 2607, 65, // nsk -> Cans + 2611, 555, // nst -> Tnsa + 2615, 590, // nsv -> Yiii + 2619, 590, // nty -> Yiii + 2623, 10, // ntz -> Arab + 2627, 360, // nwc -> Newa + 2631, 105, // nwx -> Deva + 2635, 545, // nyl -> Thai + 2639, 10, // nyq -> Arab + 2643, 545, // nyw -> Thai + 2647, 100, // oaa -> Cyrl + 2651, 100, // oac -> Cyrl + 2655, 45, // oak -> Beng + 2659, 490, // oar -> Syrc + 2663, 125, // oav -> Geor + 2667, 410, // obm -> Phnx + 2671, 350, // obr -> Mymr + 2675, 455, // och -> Seal + 2679, 10, // odk -> Arab + 2683, 585, // oht -> Xsux + 2687, 65, // oj -> Cans + 2690, 65, // ojs -> Cans + 2694, 160, // okm -> Hang + 2698, 165, // oko -> Hani + 2702, 230, // okz -> Khmr + 2706, 105, // ola -> Deva + 2710, 550, // ole -> Tibt + 2714, 100, // omk -> Cyrl + 2718, 345, // omp -> Mtei + 2722, 330, // omr -> Modi + 2726, 350, // omx -> Mymr + 2730, 10, // omy -> Arab + 2734, 105, // oon -> Deva + 2738, 385, // or -> Orya + 2741, 530, // ort -> Telu + 2745, 10, // oru -> Arab + 2749, 100, // orv -> Cyrl + 2753, 100, // os -> Cyrl + 2756, 390, // osa -> Osge + 2760, 195, // osc -> Ital + 2764, 100, // osd -> Cyrl + 2768, 200, // osi -> Java + 2772, 10, // ota -> Arab + 2776, 550, // otb -> Tibt + 2780, 380, // otk -> Orkh + 2784, 140, // oty -> Gran + 2788, 395, // oui -> Ougr + 2792, 255, // oyb -> Laoo + 2796, 155, // pa -> Guru + 2799, 10, // pa_PK -> Arab + 2805, 405, // pal -> Phli + 2809, 100, // paq -> Cyrl + 2813, 10, // pbt -> Arab + 2817, 230, // pcb -> Khmr + 2821, 350, // pce -> Mymr + 2825, 325, // pcf -> Mlym + 2829, 325, // pcg -> Mlym + 2833, 105, // pch -> Deva + 2837, 105, // pci -> Deva + 2841, 530, // pcj -> Telu + 2845, 385, // peg -> Orya + 2849, 580, // peo -> Xpeo + 2853, 225, // pgd -> Khar + 2857, 105, // pgg -> Deva + 2861, 370, // pgl -> Ogam + 2865, 195, // pgn -> Ital + 2869, 105, // phd -> Deva + 2873, 350, // phk -> Mymr + 2877, 10, // phl -> Arab + 2881, 410, // phn -> Phnx + 2885, 255, // pho -> Laoo + 2889, 10, // phr -> Arab + 2893, 545, // pht -> Thai + 2897, 545, // phu -> Thai + 2901, 10, // phv -> Arab + 2905, 105, // phw -> Deva + 2909, 105, // pi_IN -> Deva + 2915, 470, // pi_LK -> Sinh + 2921, 350, // pi_MM -> Mymr + 2927, 545, // pi_TH -> Thai + 2933, 55, // pka -> Brah + 2937, 325, // pkr -> Mlym + 2941, 10, // plk -> Arab + 2945, 350, // pll -> Mymr + 2949, 55, // pmh -> Brah + 2953, 145, // pnt -> Grek + 2957, 100, // pnt_RU -> Cyrl + 2964, 255, // pnx -> Laoo + 2968, 10, // prc -> Arab + 2972, 10, // prd -> Arab + 2976, 545, // prt -> Thai + 2980, 10, // prx -> Arab + 2984, 10, // ps -> Arab + 2987, 10, // psh -> Arab + 2991, 10, // psi -> Arab + 2995, 10, // pst -> Arab + 2999, 55, // psu -> Brah + 3003, 105, // pum -> Deva + 3007, 350, // pwo -> Mymr + 3011, 105, // pwr -> Deva + 3015, 545, // pww -> Thai + 3019, 350, // pyx -> Mymr + 3023, 10, // qxq -> Arab + 3027, 105, // raa -> Deva + 3031, 105, // rab -> Deva + 3035, 105, // raf -> Deva + 3039, 45, // rah -> Beng + 3043, 105, // raj -> Deva + 3047, 105, // rav -> Deva + 3051, 350, // rbb -> Mymr + 3055, 10, // rdb -> Arab + 3059, 385, // rei -> Orya + 3063, 430, // rhg -> Rohg + 3067, 105, // rji -> Deva + 3071, 105, // rjs -> Deva + 3075, 230, // rka -> Khmr + 3079, 350, // rki -> Mymr + 3083, 45, // rkt -> Beng + 3087, 20, // rmi -> Armn + 3091, 10, // rmt -> Arab + 3095, 350, // rmz -> Mymr + 3099, 100, // rsk -> Cyrl + 3103, 105, // rtw -> Deva + 3107, 100, // ru -> Cyrl + 3110, 100, // rue -> Cyrl + 3114, 100, // rut -> Cyrl + 3118, 105, // rwr -> Deva + 3122, 220, // ryu -> Kana + 3126, 105, // sa -> Deva + 3129, 100, // sah -> Cyrl + 3133, 440, // sam -> Samr + 3137, 375, // sat -> Olck + 3141, 450, // saz -> Saur + 3145, 10, // sbn -> Arab + 3149, 550, // sbu -> Tibt + 3153, 105, // sck -> Deva + 3157, 10, // scl -> Arab + 3161, 105, // scp -> Deva + 3165, 255, // sct -> Laoo + 3169, 500, // scu -> Takr + 3173, 145, // scx -> Grek + 3177, 10, // sd -> Arab + 3180, 105, // sd_IN -> Deva + 3186, 10, // sdb -> Arab + 3190, 10, // sdf -> Arab + 3194, 10, // sdg -> Arab + 3198, 10, // sdh -> Arab + 3202, 45, // sdr -> Beng + 3206, 10, // sds -> Arab + 3210, 100, // sel -> Cyrl + 3214, 415, // sfm -> Plrd + 3218, 100, // sgh -> Cyrl + 3222, 105, // sgj -> Deva + 3226, 10, // sgr -> Arab + 3230, 550, // sgt -> Tibt + 3234, 120, // sgw -> Ethi + 3238, 10, // sgy -> Arab + 3242, 10, // shd -> Arab + 3246, 535, // shi -> Tfng + 3250, 10, // shm -> Arab + 3254, 350, // shn -> Mymr + 3258, 10, // shu -> Arab + 3262, 10, // shv -> Arab + 3266, 470, // si -> Sinh + 3269, 100, // sia -> Cyrl + 3273, 550, // sip -> Tibt + 3277, 10, // siy -> Arab + 3281, 10, // siz -> Arab + 3285, 170, // sjc -> Hans + 3289, 100, // sjd -> Cyrl + 3293, 105, // sjp -> Deva + 3297, 100, // sjt -> Cyrl + 3301, 545, // skb -> Thai + 3305, 105, // skj -> Deva + 3309, 10, // skr -> Arab + 3313, 240, // sle -> Knda + 3317, 590, // smh -> Yiii + 3321, 440, // smp -> Samr + 3325, 230, // smu -> Khmr + 3329, 10, // smy -> Arab + 3333, 525, // soa -> Tavt + 3337, 475, // sog -> Sogd + 3341, 105, // soi -> Deva + 3345, 545, // sou -> Thai + 3349, 550, // spt -> Tibt + 3353, 385, // spv -> Orya + 3357, 10, // sqo -> Arab + 3361, 255, // sqq -> Laoo + 3365, 10, // sqt -> Arab + 3369, 100, // sr -> Cyrl + 3372, 480, // srb -> Sora + 3376, 10, // srh -> Arab + 3380, 105, // srx -> Deva + 3384, 10, // srz -> Arab + 3388, 10, // ssh -> Arab + 3392, 255, // sss -> Laoo + 3396, 10, // sts -> Arab + 3400, 250, // stu -> Lana + 3404, 505, // stu_CN -> Tale + 3411, 120, // stv -> Ethi + 3415, 100, // sty -> Cyrl + 3419, 105, // suz -> Deva + 3423, 125, // sva -> Geor + 3427, 10, // swb -> Arab + 3431, 165, // swi -> Hani + 3435, 105, // swv -> Deva + 3439, 435, // sxu -> Runr + 3443, 490, // syc -> Syrc + 3447, 45, // syl -> Beng + 3451, 490, // syn -> Syrc + 3455, 490, // syr -> Syrc + 3459, 105, // syw -> Deva + 3463, 515, // ta -> Taml + 3466, 100, // tab -> Cyrl + 3470, 105, // taj -> Deva + 3474, 495, // tbk -> Tagb + 3478, 105, // tcn -> Deva + 3482, 350, // tco -> Mymr + 3486, 515, // tcx -> Taml + 3490, 240, // tcy -> Knda + 3494, 535, // tda -> Tfng + 3498, 105, // tdb -> Deva + 3502, 505, // tdd -> Tale + 3506, 105, // tdg -> Deva + 3510, 105, // tdh -> Deva + 3514, 530, // te -> Telu + 3517, 200, // tes -> Java + 3521, 100, // tg -> Cyrl + 3524, 10, // tg_PK -> Arab + 3530, 105, // tge -> Deva + 3534, 550, // tgf -> Tibt + 3538, 545, // th -> Thai + 3541, 105, // the -> Deva + 3545, 105, // thf -> Deva + 3549, 505, // thi -> Tale + 3553, 105, // thl -> Deva + 3557, 545, // thm -> Thai + 3561, 105, // thq -> Deva + 3565, 105, // thr -> Deva + 3569, 105, // ths -> Deva + 3573, 120, // ti -> Ethi + 3576, 120, // tig -> Ethi + 3580, 105, // tij -> Deva + 3584, 100, // tin -> Cyrl + 3588, 350, // tjl -> Mymr + 3592, 10, // tjo -> Arab + 3596, 105, // tkb -> Deva + 3600, 10, // tks -> Arab + 3604, 105, // tkt -> Deva + 3608, 490, // tmr -> Syrc + 3612, 60, // tnv -> Cakm + 3616, 10, // tov -> Arab + 3620, 230, // tpu -> Khmr + 3624, 10, // tra -> Arab + 3628, 180, // trg -> Hebr + 3632, 10, // trm -> Arab + 3636, 10, // trw -> Arab + 3640, 145, // tsd -> Grek + 3644, 550, // tsj -> Tibt + 3648, 100, // tt -> Cyrl + 3651, 255, // tth -> Laoo + 3655, 255, // tto -> Laoo + 3659, 545, // tts -> Thai + 3663, 105, // ttz -> Deva + 3667, 350, // tvn -> Mymr + 3671, 550, // twm -> Tibt + 3675, 520, // txg -> Tang + 3679, 560, // txo -> Toto + 3683, 525, // tyr -> Tavt + 3687, 100, // tyv -> Cyrl + 3691, 100, // ude -> Cyrl + 3695, 325, // udg -> Mlym + 3699, 100, // udi -> Cyrl + 3703, 100, // udm -> Cyrl + 3707, 10, // ug -> Arab + 3710, 100, // ug_KZ -> Cyrl + 3716, 100, // ug_MN -> Cyrl + 3722, 565, // uga -> Ugar + 3726, 100, // ugh -> Cyrl + 3730, 545, // ugo -> Thai + 3734, 100, // uk -> Cyrl + 3737, 385, // uki -> Orya + 3741, 100, // ulc -> Cyrl + 3745, 45, // unr -> Beng + 3749, 105, // unr_NP -> Deva + 3756, 45, // unx -> Beng + 3760, 10, // ur -> Arab + 3763, 545, // urk -> Thai + 3767, 10, // ush -> Arab + 3771, 145, // uum -> Grek + 3775, 10, // uz_AF -> Arab + 3781, 100, // uz_CN -> Cyrl + 3787, 10, // uzs -> Arab + 3791, 515, // vaa -> Taml + 3795, 10, // vaf -> Arab + 3799, 105, // vah -> Deva + 3803, 570, // vai -> Vaii + 3807, 105, // vas -> Deva + 3811, 105, // vav -> Deva + 3815, 105, // vay -> Deva + 3819, 10, // vgr -> Arab + 3823, 105, // vjk -> Deva + 3827, 240, // vmd -> Knda + 3831, 10, // vmh -> Arab + 3835, 120, // wal -> Ethi + 3839, 10, // wbk -> Arab + 3843, 530, // wbq -> Telu + 3847, 105, // wbr -> Deva + 3851, 120, // wle -> Ethi + 3855, 105, // wly -> Deva + 3859, 105, // wme -> Deva + 3863, 10, // wne -> Arab + 3867, 10, // wni -> Arab + 3871, 530, // wsg -> Telu + 3875, 10, // wsv -> Arab + 3879, 105, // wtm -> Deva + 3883, 170, // wuu -> Hans + 3887, 0, // xag -> Aghb + 3891, 100, // xal -> Cyrl + 3895, 120, // xan -> Ethi + 3899, 100, // xas -> Cyrl + 3903, 85, // xco -> Chrs + 3907, 70, // xcr -> Cari + 3911, 100, // xdq -> Cyrl + 3915, 10, // xhe -> Arab + 3919, 230, // xhm -> Khmr + 3923, 385, // xis -> Orya + 3927, 10, // xka -> Arab + 3931, 10, // xkc -> Arab + 3935, 550, // xkf -> Tibt + 3939, 10, // xkj -> Arab + 3943, 230, // xkk -> Khmr + 3947, 10, // xkp -> Arab + 3951, 290, // xlc -> Lyci + 3955, 295, // xld -> Lydi + 3959, 115, // xly -> Elym + 3963, 125, // xmf -> Geor + 3967, 305, // xmn -> Mani + 3971, 320, // xmr -> Merc + 3975, 355, // xna -> Narb + 3979, 105, // xnr -> Deva + 3983, 145, // xpg -> Grek + 3987, 370, // xpi -> Ogam + 3991, 100, // xpm -> Cyrl + 3995, 420, // xpr -> Prti + 3999, 100, // xrm -> Cyrl + 4003, 100, // xrn -> Cyrl + 4007, 445, // xsa -> Sarb + 4011, 465, // xsd -> Sidt + 4015, 105, // xsr -> Deva + 4019, 55, // xtq -> Brah + 4023, 515, // xua -> Taml + 4027, 515, // xub -> Taml + 4031, 515, // xuj -> Taml + 4035, 195, // xve -> Ital + 4039, 10, // xvi -> Arab + 4043, 100, // xwo -> Cyrl + 4047, 310, // xzh -> Marc + 4051, 100, // yai -> Cyrl + 4055, 105, // ybh -> Deva + 4059, 105, // ybi -> Deva + 4063, 10, // ydg -> Arab + 4067, 325, // yea -> Mlym + 4071, 145, // yej -> Grek + 4075, 530, // yeu -> Telu + 4079, 415, // ygp -> Plrd + 4083, 180, // yhd -> Hebr + 4087, 180, // yi -> Hebr + 4090, 590, // yig -> Yiii + 4094, 180, // yih -> Hebr + 4098, 350, // yin -> Mymr + 4102, 590, // yiv -> Yiii + 4106, 100, // ykg -> Cyrl + 4110, 100, // ykh -> Cyrl + 4114, 415, // yna -> Plrd + 4118, 100, // ynk -> Cyrl + 4122, 205, // yoi -> Jpan + 4126, 545, // yoy -> Thai + 4130, 100, // yrk -> Cyrl + 4134, 590, // ysd -> Yiii + 4138, 590, // ysn -> Yiii + 4142, 590, // ysp -> Yiii + 4146, 100, // ysr -> Cyrl + 4150, 415, // ysy -> Plrd + 4154, 180, // yud -> Hebr + 4158, 175, // yue -> Hant + 4162, 170, // yue_CN -> Hans + 4169, 100, // yug -> Cyrl + 4173, 100, // yux -> Cyrl + 4177, 415, // ywq -> Plrd + 4181, 415, // ywu -> Plrd + 4185, 550, // zau -> Tibt + 4189, 10, // zba -> Arab + 4193, 165, // zch -> Hani + 4197, 10, // zdj -> Arab + 4201, 165, // zeh -> Hani + 4205, 535, // zen -> Tfng + 4209, 165, // zgb -> Hani + 4213, 535, // zgh -> Tfng + 4217, 165, // zgm -> Hani + 4221, 165, // zgn -> Hani + 4225, 170, // zh -> Hans + 4228, 175, // zh_AU -> Hant + 4234, 175, // zh_BN -> Hant + 4240, 175, // zh_GB -> Hant + 4246, 175, // zh_GF -> Hant + 4252, 175, // zh_HK -> Hant + 4258, 175, // zh_ID -> Hant + 4264, 175, // zh_MO -> Hant + 4270, 175, // zh_PA -> Hant + 4276, 175, // zh_PF -> Hant + 4282, 175, // zh_PH -> Hant + 4288, 175, // zh_SR -> Hant + 4294, 175, // zh_TH -> Hant + 4300, 175, // zh_TW -> Hant + 4306, 175, // zh_US -> Hant + 4312, 175, // zh_VN -> Hant + 4318, 165, // zhd -> Hani + 4322, 350, // zkn -> Mymr + 4326, 100, // zko -> Cyrl + 4330, 235, // zkt -> Kits + 4334, 100, // zkz -> Cyrl + 4338, 165, // zlj -> Hani + 4342, 165, // zln -> Hani + 4346, 165, // zlq -> Hani + 4350, 165, // zqe -> Hani + 4354, 385, // zrg -> Orya + 4358, 180, // zrp -> Hebr + 4362, 10, // zum -> Arab + 4366, 120, // zwa -> Ethi + 4370, 165, // zyg -> Hani + 4374, 165, // zyn -> Hani + 4378, 165, // zzj -> Hani }; -//====================================================================== +// ====================================================================== // Parent locale table const char parentLocaleChars[] = "az_Arab\0az_Cyrl\0bal_Latn\0blt_Latn\0bm_Nkoo\0bs_Cyrl\0byn_Latn\0" @@ -1197,27 +1216,27 @@ const char parentLocaleChars[] = "en_UA\0en_UG\0en_VC\0en_VG\0en_VU\0en_WS\0en_ZA\0en_ZM\0en_ZW\0" "es_419\0es_AR\0es_BO\0es_BR\0es_BZ\0es_CL\0es_CO\0es_CR\0es_CU\0" "es_DO\0es_EC\0es_GT\0es_HN\0es_JP\0es_MX\0es_NI\0es_PA\0es_PE\0" - "es_PR\0es_PY\0es_SV\0es_US\0es_UY\0es_VE\0ff_Adlm\0ff_Arab\0fr_HT\0" - "ha_Arab\0hi_Latn\0ht\0iu_Latn\0kaa_Latn\0kk_Arab\0kok_Latn\0ks_Deva\0" - "ku_Arab\0kxv_Deva\0kxv_Orya\0kxv_Telu\0ky_Arab\0ky_Latn\0ml_Arab\0" - "mn_Mong\0mni_Mtei\0ms_Arab\0nb\0nn\0no\0no_NO\0pa_Arab\0pt_AO\0" - "pt_CH\0pt_CV\0pt_FR\0pt_GQ\0pt_GW\0pt_LU\0pt_MO\0pt_MZ\0pt_PT\0" - "pt_ST\0pt_TL\0root\0sat_Deva\0sd_Deva\0sd_Khoj\0sd_Sind\0shi_Latn\0" - "so_Arab\0sr_Latn\0suz_Sunu\0sw_Arab\0tg_Arab\0ug_Cyrl\0uz_Arab\0" - "uz_Cyrl\0vai_Latn\0wo_Arab\0yo_Arab\0yue_Hans\0zh_Hant\0zh_Hant_HK\0" - "zh_Hant_MO\0"; + "es_PR\0es_PY\0es_SV\0es_US\0es_UY\0es_VE\0ff_Adlm\0ff_Arab\0ha_Arab\0" + "hi_Latn\0iu_Latn\0kaa_Latn\0kk_Arab\0kok_Latn\0ks_Deva\0ku_Arab\0" + "kxv_Deva\0kxv_Orya\0kxv_Telu\0ky_Arab\0ky_Latn\0ml_Arab\0mn_Mong\0" + "mni_Mtei\0ms_Arab\0nb\0nn\0no\0no_NO\0pa_Arab\0pt_AO\0pt_CH\0" + "pt_CV\0pt_FR\0pt_GQ\0pt_GW\0pt_LU\0pt_MO\0pt_MZ\0pt_PT\0pt_ST\0" + "pt_TL\0root\0sat_Deva\0sd_Deva\0sd_Khoj\0sd_Sind\0shi_Latn\0so_Arab\0" + "sr_Latn\0suz_Sunu\0sw_Arab\0tg_Arab\0ug_Cyrl\0uz_Arab\0uz_Cyrl\0" + "vai_Latn\0wo_Arab\0yo_Arab\0yue_Hans\0zh_Hant\0zh_Hant_HK\0zh_Hant_MO\0" + ""; const int32_t parentLocaleTable[] = { - 0, 1176, // az_Arab -> root - 8, 1176, // az_Cyrl -> root - 16, 1176, // bal_Latn -> root - 25, 1176, // blt_Latn -> root - 34, 1176, // bm_Nkoo -> root - 42, 1176, // bs_Cyrl -> root - 50, 1176, // byn_Latn -> root - 59, 1176, // cu_Glag -> root - 67, 1176, // dje_Arab -> root - 76, 1176, // dyo_Arab -> root + 0, 1167, // az_Arab -> root + 8, 1167, // az_Cyrl -> root + 16, 1167, // bal_Latn -> root + 25, 1167, // blt_Latn -> root + 34, 1167, // bm_Nkoo -> root + 42, 1167, // bs_Cyrl -> root + 50, 1167, // byn_Latn -> root + 59, 1167, // cu_Glag -> root + 67, 1167, // dje_Arab -> root + 76, 1167, // dyo_Arab -> root 92, 85, // en_150 -> en_001 99, 85, // en_AG -> en_001 105, 85, // en_AI -> en_001 @@ -1240,7 +1259,7 @@ const int32_t parentLocaleTable[] = { 207, 85, // en_DG -> en_001 213, 92, // en_DK -> en_150 219, 85, // en_DM -> en_001 - 225, 1176, // en_Dsrt -> root + 225, 1167, // en_Dsrt -> root 233, 92, // en_EE -> en_150 239, 85, // en_ER -> en_001 245, 92, // en_ES -> en_150 @@ -1314,7 +1333,7 @@ const int32_t parentLocaleTable[] = { 653, 85, // en_SS -> en_001 659, 85, // en_SX -> en_001 665, 85, // en_SZ -> en_001 - 671, 1176, // en_Shaw -> root + 671, 1167, // en_Shaw -> root 679, 85, // en_TC -> en_001 685, 85, // en_TK -> en_001 691, 85, // en_TO -> en_001 @@ -1353,60 +1372,59 @@ const int32_t parentLocaleTable[] = { 896, 769, // es_US -> es_419 902, 769, // es_UY -> es_419 908, 769, // es_VE -> es_419 - 914, 1176, // ff_Adlm -> root - 922, 1176, // ff_Arab -> root - 936, 1176, // ha_Arab -> root - 944, 371, // hi_Latn -> en_IN - 952, 930, // ht -> fr_HT - 955, 1176, // iu_Latn -> root - 963, 1176, // kaa_Latn -> root - 972, 1176, // kk_Arab -> root - 980, 1176, // kok_Latn -> root - 989, 1176, // ks_Deva -> root - 997, 1176, // ku_Arab -> root - 1005, 1176, // kxv_Deva -> root - 1014, 1176, // kxv_Orya -> root - 1023, 1176, // kxv_Telu -> root - 1032, 1176, // ky_Arab -> root - 1040, 1176, // ky_Latn -> root - 1048, 1176, // ml_Arab -> root - 1056, 1176, // mn_Mong -> root - 1064, 1176, // mni_Mtei -> root - 1073, 1176, // ms_Arab -> root - 1081, 1087, // nb -> no - 1084, 1087, // nn -> no - 1090, 1087, // no_NO -> no - 1096, 1176, // pa_Arab -> root - 1104, 1158, // pt_AO -> pt_PT - 1110, 1158, // pt_CH -> pt_PT - 1116, 1158, // pt_CV -> pt_PT - 1122, 1158, // pt_FR -> pt_PT - 1128, 1158, // pt_GQ -> pt_PT - 1134, 1158, // pt_GW -> pt_PT - 1140, 1158, // pt_LU -> pt_PT - 1146, 1158, // pt_MO -> pt_PT - 1152, 1158, // pt_MZ -> pt_PT - 1164, 1158, // pt_ST -> pt_PT - 1170, 1158, // pt_TL -> pt_PT - 1181, 1176, // sat_Deva -> root - 1190, 1176, // sd_Deva -> root - 1198, 1176, // sd_Khoj -> root - 1206, 1176, // sd_Sind -> root - 1214, 1176, // shi_Latn -> root - 1223, 1176, // so_Arab -> root - 1231, 1176, // sr_Latn -> root - 1239, 1176, // suz_Sunu -> root - 1248, 1176, // sw_Arab -> root - 1256, 1176, // tg_Arab -> root - 1264, 1176, // ug_Cyrl -> root - 1272, 1176, // uz_Arab -> root - 1280, 1176, // uz_Cyrl -> root - 1288, 1176, // vai_Latn -> root - 1297, 1176, // wo_Arab -> root - 1305, 1176, // yo_Arab -> root - 1313, 1176, // yue_Hans -> root - 1322, 1176, // zh_Hant -> root - 1341, 1330, // zh_Hant_MO -> zh_Hant_HK + 914, 1167, // ff_Adlm -> root + 922, 1167, // ff_Arab -> root + 930, 1167, // ha_Arab -> root + 938, 371, // hi_Latn -> en_IN + 946, 1167, // iu_Latn -> root + 954, 1167, // kaa_Latn -> root + 963, 1167, // kk_Arab -> root + 971, 1167, // kok_Latn -> root + 980, 1167, // ks_Deva -> root + 988, 1167, // ku_Arab -> root + 996, 1167, // kxv_Deva -> root + 1005, 1167, // kxv_Orya -> root + 1014, 1167, // kxv_Telu -> root + 1023, 1167, // ky_Arab -> root + 1031, 1167, // ky_Latn -> root + 1039, 1167, // ml_Arab -> root + 1047, 1167, // mn_Mong -> root + 1055, 1167, // mni_Mtei -> root + 1064, 1167, // ms_Arab -> root + 1072, 1078, // nb -> no + 1075, 1078, // nn -> no + 1081, 1078, // no_NO -> no + 1087, 1167, // pa_Arab -> root + 1095, 1149, // pt_AO -> pt_PT + 1101, 1149, // pt_CH -> pt_PT + 1107, 1149, // pt_CV -> pt_PT + 1113, 1149, // pt_FR -> pt_PT + 1119, 1149, // pt_GQ -> pt_PT + 1125, 1149, // pt_GW -> pt_PT + 1131, 1149, // pt_LU -> pt_PT + 1137, 1149, // pt_MO -> pt_PT + 1143, 1149, // pt_MZ -> pt_PT + 1155, 1149, // pt_ST -> pt_PT + 1161, 1149, // pt_TL -> pt_PT + 1172, 1167, // sat_Deva -> root + 1181, 1167, // sd_Deva -> root + 1189, 1167, // sd_Khoj -> root + 1197, 1167, // sd_Sind -> root + 1205, 1167, // shi_Latn -> root + 1214, 1167, // so_Arab -> root + 1222, 1167, // sr_Latn -> root + 1230, 1167, // suz_Sunu -> root + 1239, 1167, // sw_Arab -> root + 1247, 1167, // tg_Arab -> root + 1255, 1167, // ug_Cyrl -> root + 1263, 1167, // uz_Arab -> root + 1271, 1167, // uz_Cyrl -> root + 1279, 1167, // vai_Latn -> root + 1288, 1167, // wo_Arab -> root + 1296, 1167, // yo_Arab -> root + 1304, 1167, // yue_Hans -> root + 1313, 1167, // zh_Hant -> root + 1332, 1321, // zh_Hant_MO -> zh_Hant_HK }; diff --git a/deps/icu-small/source/common/localematcher.cpp b/deps/icu-small/source/common/localematcher.cpp index 1e74dd1f1493..f9cd9354c5ec 100644 --- a/deps/icu-small/source/common/localematcher.cpp +++ b/deps/icu-small/source/common/localematcher.cpp @@ -72,7 +72,8 @@ LocaleMatcher::Result::~Result() { } } -LocaleMatcher::Result &LocaleMatcher::Result::operator=(LocaleMatcher::Result &&src) noexcept { +LocaleMatcher::Result& +LocaleMatcher::Result::operator=(LocaleMatcher::Result&& src) noexcept U_LIFETIME_BOUND { this->~Result(); desiredLocale = src.desiredLocale; @@ -144,7 +145,8 @@ LocaleMatcher::Builder::~Builder() { delete maxDistanceSupported_; } -LocaleMatcher::Builder &LocaleMatcher::Builder::operator=(LocaleMatcher::Builder &&src) noexcept { +LocaleMatcher::Builder& +LocaleMatcher::Builder::operator=(LocaleMatcher::Builder&& src) noexcept U_LIFETIME_BOUND { this->~Builder(); errorCode_ = src.errorCode_; @@ -176,8 +178,8 @@ bool LocaleMatcher::Builder::ensureSupportedLocaleVector() { return true; } -LocaleMatcher::Builder &LocaleMatcher::Builder::setSupportedLocalesFromListString( - StringPiece locales) { +LocaleMatcher::Builder& +LocaleMatcher::Builder::setSupportedLocalesFromListString(StringPiece locales) U_LIFETIME_BOUND { LocalePriorityList list(locales, errorCode_); if (U_FAILURE(errorCode_)) { return *this; } clearSupportedLocales(); @@ -194,7 +196,8 @@ LocaleMatcher::Builder &LocaleMatcher::Builder::setSupportedLocalesFromListStrin return *this; } -LocaleMatcher::Builder &LocaleMatcher::Builder::setSupportedLocales(Locale::Iterator &locales) { +LocaleMatcher::Builder& +LocaleMatcher::Builder::setSupportedLocales(Locale::Iterator& locales) U_LIFETIME_BOUND { if (ensureSupportedLocaleVector()) { clearSupportedLocales(); while (locales.hasNext() && U_SUCCESS(errorCode_)) { @@ -206,7 +209,8 @@ LocaleMatcher::Builder &LocaleMatcher::Builder::setSupportedLocales(Locale::Iter return *this; } -LocaleMatcher::Builder &LocaleMatcher::Builder::addSupportedLocale(const Locale &locale) { +LocaleMatcher::Builder& +LocaleMatcher::Builder::addSupportedLocale(const Locale& locale) U_LIFETIME_BOUND { if (ensureSupportedLocaleVector()) { LocalPointer clone(locale.clone(), errorCode_); supportedLocales_->adoptElement(clone.orphan(), errorCode_); @@ -214,7 +218,7 @@ LocaleMatcher::Builder &LocaleMatcher::Builder::addSupportedLocale(const Locale return *this; } -LocaleMatcher::Builder &LocaleMatcher::Builder::setNoDefaultLocale() { +LocaleMatcher::Builder& LocaleMatcher::Builder::setNoDefaultLocale() U_LIFETIME_BOUND { if (U_FAILURE(errorCode_)) { return *this; } delete defaultLocale_; defaultLocale_ = nullptr; @@ -222,7 +226,8 @@ LocaleMatcher::Builder &LocaleMatcher::Builder::setNoDefaultLocale() { return *this; } -LocaleMatcher::Builder &LocaleMatcher::Builder::setDefaultLocale(const Locale *defaultLocale) { +LocaleMatcher::Builder& +LocaleMatcher::Builder::setDefaultLocale(const Locale* defaultLocale) U_LIFETIME_BOUND { if (U_FAILURE(errorCode_)) { return *this; } Locale *clone = nullptr; if (defaultLocale != nullptr) { @@ -238,20 +243,23 @@ LocaleMatcher::Builder &LocaleMatcher::Builder::setDefaultLocale(const Locale *d return *this; } -LocaleMatcher::Builder &LocaleMatcher::Builder::setFavorSubtag(ULocMatchFavorSubtag subtag) { +LocaleMatcher::Builder& +LocaleMatcher::Builder::setFavorSubtag(ULocMatchFavorSubtag subtag) U_LIFETIME_BOUND { if (U_FAILURE(errorCode_)) { return *this; } favor_ = subtag; return *this; } -LocaleMatcher::Builder &LocaleMatcher::Builder::setDemotionPerDesiredLocale(ULocMatchDemotion demotion) { +LocaleMatcher::Builder& +LocaleMatcher::Builder::setDemotionPerDesiredLocale(ULocMatchDemotion demotion) U_LIFETIME_BOUND { if (U_FAILURE(errorCode_)) { return *this; } demotion_ = demotion; return *this; } -LocaleMatcher::Builder &LocaleMatcher::Builder::setMaxDistance(const Locale &desired, - const Locale &supported) { +LocaleMatcher::Builder& +LocaleMatcher::Builder::setMaxDistance(const Locale& desired, + const Locale& supported) U_LIFETIME_BOUND { if (U_FAILURE(errorCode_)) { return *this; } Locale *desiredClone = desired.clone(); Locale *supportedClone = supported.clone(); @@ -522,7 +530,7 @@ LocaleMatcher::~LocaleMatcher() { delete ownedDefaultLocale; } -LocaleMatcher &LocaleMatcher::operator=(LocaleMatcher &&src) noexcept { +LocaleMatcher& LocaleMatcher::operator=(LocaleMatcher&& src) noexcept U_LIFETIME_BOUND { this->~LocaleMatcher(); thresholdDistance = src.thresholdDistance; @@ -605,7 +613,8 @@ class LocaleLsrIterator { int32_t bestDesiredIndex = -1; }; -const Locale *LocaleMatcher::getBestMatch(const Locale &desiredLocale, UErrorCode &errorCode) const { +const Locale* LocaleMatcher::getBestMatch(const Locale& desiredLocale, + UErrorCode& errorCode) const U_LIFETIME_BOUND { if (U_FAILURE(errorCode)) { return nullptr; } std::optional suppIndex = getBestSuppIndex( getMaximalLsrOrUnd(likelySubtags, desiredLocale, errorCode), @@ -614,8 +623,8 @@ const Locale *LocaleMatcher::getBestMatch(const Locale &desiredLocale, UErrorCod : defaultLocale; } -const Locale *LocaleMatcher::getBestMatch(Locale::Iterator &desiredLocales, - UErrorCode &errorCode) const { +const Locale* LocaleMatcher::getBestMatch(Locale::Iterator& desiredLocales, + UErrorCode& errorCode) const U_LIFETIME_BOUND { if (U_FAILURE(errorCode)) { return nullptr; } if (!desiredLocales.hasNext()) { return defaultLocale; @@ -626,16 +635,18 @@ const Locale *LocaleMatcher::getBestMatch(Locale::Iterator &desiredLocales, : defaultLocale; } -const Locale *LocaleMatcher::getBestMatchForListString( - StringPiece desiredLocaleList, UErrorCode &errorCode) const { +const Locale* +LocaleMatcher::getBestMatchForListString(StringPiece desiredLocaleList, + UErrorCode& errorCode) const U_LIFETIME_BOUND { if (U_FAILURE(errorCode)) { return nullptr; } LocalePriorityList list(desiredLocaleList, errorCode); LocalePriorityList::Iterator iter = list.iterator(); return getBestMatch(iter, errorCode); } -LocaleMatcher::Result LocaleMatcher::getBestMatchResult( - const Locale &desiredLocale, UErrorCode &errorCode) const { +LocaleMatcher::Result +LocaleMatcher::getBestMatchResult(const Locale& desiredLocale U_LIFETIME_BOUND, + UErrorCode& errorCode) const U_LIFETIME_BOUND { if (U_FAILURE(errorCode)) { return Result(nullptr, defaultLocale, -1, -1, false); } @@ -649,8 +660,9 @@ LocaleMatcher::Result LocaleMatcher::getBestMatchResult( } } -LocaleMatcher::Result LocaleMatcher::getBestMatchResult( - Locale::Iterator &desiredLocales, UErrorCode &errorCode) const { +LocaleMatcher::Result +LocaleMatcher::getBestMatchResult(Locale::Iterator& desiredLocales, + UErrorCode& errorCode) const U_LIFETIME_BOUND { if (U_FAILURE(errorCode) || !desiredLocales.hasNext()) { return Result(nullptr, defaultLocale, -1, -1, false); } @@ -749,7 +761,7 @@ namespace { class LocaleFromTag { public: LocaleFromTag() : locale(Locale::getRoot()) {} - const Locale &operator()(const char *tag) { return locale = Locale(tag); } + const Locale& operator()(const char* tag) U_LIFETIME_BOUND { return locale = Locale(tag); } private: // Store the locale in the converter, rather than return a reference to a temporary, diff --git a/deps/icu-small/source/common/locavailable.cpp b/deps/icu-small/source/common/locavailable.cpp index 4a2600e88c59..daf73e484ad8 100644 --- a/deps/icu-small/source/common/locavailable.cpp +++ b/deps/icu-small/source/common/locavailable.cpp @@ -137,7 +137,7 @@ class AvailableLocalesStringEnumeration : public StringEnumeration { AvailableLocalesStringEnumeration(ULocAvailableType type) : fType(type) { } - const char* next(int32_t *resultLength, UErrorCode &status) override { + const char* next(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND override { if (U_FAILURE(status)) { return nullptr; } ULocAvailableType actualType = fType; int32_t actualIndex = fIndex++; diff --git a/deps/icu-small/source/common/locbased.cpp b/deps/icu-small/source/common/locbased.cpp index b661cc462785..1d0d44214597 100644 --- a/deps/icu-small/source/common/locbased.cpp +++ b/deps/icu-small/source/common/locbased.cpp @@ -15,8 +15,10 @@ U_NAMESPACE_BEGIN -const Locale& LocaleBased::getLocale(const Locale& valid, const Locale& actual, - ULocDataLocaleType type, UErrorCode& status) { +const Locale& LocaleBased::getLocale(const Locale& valid U_LIFETIME_BOUND, + const Locale& actual U_LIFETIME_BOUND, + ULocDataLocaleType type, + UErrorCode& status) { if (U_FAILURE(status)) { return Locale::getRoot(); } diff --git a/deps/icu-small/source/common/locbased.h b/deps/icu-small/source/common/locbased.h index dbff148bcd08..e5ad15b0b957 100644 --- a/deps/icu-small/source/common/locbased.h +++ b/deps/icu-small/source/common/locbased.h @@ -40,8 +40,10 @@ class U_COMMON_API LocaleBased : public UMemory { * @return the indicated locale */ static const Locale& getLocale( - const Locale& valid, const Locale& actual, - ULocDataLocaleType type, UErrorCode& status); + const Locale& valid U_LIFETIME_BOUND, + const Locale& actual U_LIFETIME_BOUND, + ULocDataLocaleType type, + UErrorCode& status); /** * Return the locale ID for the service object wrapped by this diff --git a/deps/icu-small/source/common/locdispnames.cpp b/deps/icu-small/source/common/locdispnames.cpp index 3051798b78bc..46a529c79c95 100644 --- a/deps/icu-small/source/common/locdispnames.cpp +++ b/deps/icu-small/source/common/locdispnames.cpp @@ -42,7 +42,7 @@ U_NAMESPACE_BEGIN UnicodeString& -Locale::getDisplayLanguage(UnicodeString& dispLang) const +Locale::getDisplayLanguage(UnicodeString& dispLang U_LIFETIME_BOUND) const { return this->getDisplayLanguage(getDefault(), dispLang); } @@ -54,8 +54,8 @@ Locale::getDisplayLanguage(UnicodeString& dispLang) const * the exact buffer we need copy it to the UnicodeString and delete it*/ UnicodeString& -Locale::getDisplayLanguage(const Locale &displayLocale, - UnicodeString &result) const { +Locale::getDisplayLanguage(const Locale& displayLocale, + UnicodeString& result U_LIFETIME_BOUND) const { char16_t *buffer; UErrorCode errorCode=U_ZERO_ERROR; int32_t length; @@ -88,14 +88,14 @@ Locale::getDisplayLanguage(const Locale &displayLocale, } UnicodeString& -Locale::getDisplayScript(UnicodeString& dispScript) const +Locale::getDisplayScript(UnicodeString& dispScript U_LIFETIME_BOUND) const { return this->getDisplayScript(getDefault(), dispScript); } UnicodeString& -Locale::getDisplayScript(const Locale &displayLocale, - UnicodeString &result) const { +Locale::getDisplayScript(const Locale& displayLocale, + UnicodeString& result U_LIFETIME_BOUND) const { char16_t *buffer; UErrorCode errorCode=U_ZERO_ERROR; int32_t length; @@ -128,14 +128,14 @@ Locale::getDisplayScript(const Locale &displayLocale, } UnicodeString& -Locale::getDisplayCountry(UnicodeString& dispCntry) const +Locale::getDisplayCountry(UnicodeString& dispCntry U_LIFETIME_BOUND) const { return this->getDisplayCountry(getDefault(), dispCntry); } UnicodeString& -Locale::getDisplayCountry(const Locale &displayLocale, - UnicodeString &result) const { +Locale::getDisplayCountry(const Locale& displayLocale, + UnicodeString& result U_LIFETIME_BOUND) const { char16_t *buffer; UErrorCode errorCode=U_ZERO_ERROR; int32_t length; @@ -168,14 +168,14 @@ Locale::getDisplayCountry(const Locale &displayLocale, } UnicodeString& -Locale::getDisplayVariant(UnicodeString& dispVar) const +Locale::getDisplayVariant(UnicodeString& dispVar U_LIFETIME_BOUND) const { return this->getDisplayVariant(getDefault(), dispVar); } UnicodeString& -Locale::getDisplayVariant(const Locale &displayLocale, - UnicodeString &result) const { +Locale::getDisplayVariant(const Locale& displayLocale, + UnicodeString& result U_LIFETIME_BOUND) const { char16_t *buffer; UErrorCode errorCode=U_ZERO_ERROR; int32_t length; @@ -208,14 +208,14 @@ Locale::getDisplayVariant(const Locale &displayLocale, } UnicodeString& -Locale::getDisplayName( UnicodeString& name ) const +Locale::getDisplayName(UnicodeString& name U_LIFETIME_BOUND) const { return this->getDisplayName(getDefault(), name); } UnicodeString& -Locale::getDisplayName(const Locale &displayLocale, - UnicodeString &result) const { +Locale::getDisplayName(const Locale& displayLocale, + UnicodeString& result U_LIFETIME_BOUND) const { char16_t *buffer; UErrorCode errorCode=U_ZERO_ERROR; int32_t length; @@ -253,7 +253,7 @@ Locale::getDisplayName(const Locale &displayLocale, // Gets the objectLocale display name in the default locale language. UnicodeString& U_EXPORT2 BreakIterator::getDisplayName(const Locale& objectLocale, - UnicodeString& name) + UnicodeString& name U_LIFETIME_BOUND) { return objectLocale.getDisplayName(name); } @@ -262,8 +262,8 @@ BreakIterator::getDisplayName(const Locale& objectLocale, // Gets the objectLocale display name in the displayLocale language. UnicodeString& U_EXPORT2 BreakIterator::getDisplayName(const Locale& objectLocale, - const Locale& displayLocale, - UnicodeString& name) + const Locale& displayLocale, + UnicodeString& name U_LIFETIME_BOUND) { return objectLocale.getDisplayName(displayLocale, name); } diff --git a/deps/icu-small/source/common/locdspnm.cpp b/deps/icu-small/source/common/locdspnm.cpp index 270684341c5c..ae5acfd12233 100644 --- a/deps/icu-small/source/common/locdspnm.cpp +++ b/deps/icu-small/source/common/locdspnm.cpp @@ -44,26 +44,26 @@ class ICUDataTable { ICUDataTable(const char* path, const Locale& locale); ~ICUDataTable() = default; - const Locale& getLocale(); + const Locale& getLocale() U_LIFETIME_BOUND; UnicodeString& get(const char* tableKey, const char* itemKey, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; UnicodeString& get(const char* tableKey, const char* subTableKey, const char* itemKey, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; UnicodeString& getNoFallback(const char* tableKey, const char* itemKey, - UnicodeString &result) const; + UnicodeString& result U_LIFETIME_BOUND) const; UnicodeString& getNoFallback(const char* tableKey, const char* subTableKey, const char* itemKey, - UnicodeString &result) const; + UnicodeString& result U_LIFETIME_BOUND) const; }; -inline UnicodeString & -ICUDataTable::get(const char* tableKey, const char* itemKey, UnicodeString& result) const { +inline UnicodeString& ICUDataTable::get(const char* tableKey, const char* itemKey, + UnicodeString& result U_LIFETIME_BOUND) const { return get(tableKey, nullptr, itemKey, result); } -inline UnicodeString & -ICUDataTable::getNoFallback(const char* tableKey, const char* itemKey, UnicodeString& result) const { +inline UnicodeString& ICUDataTable::getNoFallback(const char* tableKey, const char* itemKey, + UnicodeString& result U_LIFETIME_BOUND) const { return getNoFallback(tableKey, nullptr, itemKey, result); } @@ -74,13 +74,13 @@ ICUDataTable::ICUDataTable(const char* path, const Locale& locale) } const Locale& -ICUDataTable::getLocale() { +ICUDataTable::getLocale() U_LIFETIME_BOUND { return locale; } -UnicodeString & +UnicodeString& ICUDataTable::get(const char* tableKey, const char* subTableKey, const char* itemKey, - UnicodeString &result) const { + UnicodeString &result U_LIFETIME_BOUND) const { UErrorCode status = U_ZERO_ERROR; int32_t len = 0; @@ -93,9 +93,9 @@ ICUDataTable::get(const char* tableKey, const char* subTableKey, const char* ite return result.setTo(UnicodeString(itemKey, -1, US_INV)); } -UnicodeString & +UnicodeString& ICUDataTable::getNoFallback(const char* tableKey, const char* subTableKey, const char* itemKey, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { UErrorCode status = U_ZERO_ERROR; int32_t len = 0; @@ -127,28 +127,28 @@ class DefaultLocaleDisplayNames : public LocaleDisplayNames { virtual ~DefaultLocaleDisplayNames(); - virtual const Locale& getLocale() const; + virtual const Locale& getLocale() const U_LIFETIME_BOUND; virtual UDialectHandling getDialectHandling() const; virtual UnicodeString& localeDisplayName(const Locale& locale, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; virtual UnicodeString& localeDisplayName(const char* localeId, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; virtual UnicodeString& languageDisplayName(const char* lang, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; virtual UnicodeString& scriptDisplayName(const char* script, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; virtual UnicodeString& scriptDisplayName(UScriptCode scriptCode, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; virtual UnicodeString& regionDisplayName(const char* region, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; virtual UnicodeString& variantDisplayName(const char* variant, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; virtual UnicodeString& keyDisplayName(const char* key, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; virtual UnicodeString& keyValueDisplayName(const char* key, const char* value, - UnicodeString& result) const; + UnicodeString& result U_LIFETIME_BOUND) const; }; DefaultLocaleDisplayNames::DefaultLocaleDisplayNames(UDialectHandling dialectHandling) @@ -159,7 +159,7 @@ DefaultLocaleDisplayNames::~DefaultLocaleDisplayNames() { } const Locale& -DefaultLocaleDisplayNames::getLocale() const { +DefaultLocaleDisplayNames::getLocale() const U_LIFETIME_BOUND { return Locale::getRoot(); } @@ -170,31 +170,31 @@ DefaultLocaleDisplayNames::getDialectHandling() const { UnicodeString& DefaultLocaleDisplayNames::localeDisplayName(const Locale& locale, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return result = UnicodeString(locale.getName(), -1, US_INV); } UnicodeString& DefaultLocaleDisplayNames::localeDisplayName(const char* localeId, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return result = UnicodeString(localeId, -1, US_INV); } UnicodeString& DefaultLocaleDisplayNames::languageDisplayName(const char* lang, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return result = UnicodeString(lang, -1, US_INV); } UnicodeString& DefaultLocaleDisplayNames::scriptDisplayName(const char* script, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return result = UnicodeString(script, -1, US_INV); } UnicodeString& DefaultLocaleDisplayNames::scriptDisplayName(UScriptCode scriptCode, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { const char* name = uscript_getName(scriptCode); if (name) { return result = UnicodeString(name, -1, US_INV); @@ -204,26 +204,26 @@ DefaultLocaleDisplayNames::scriptDisplayName(UScriptCode scriptCode, UnicodeString& DefaultLocaleDisplayNames::regionDisplayName(const char* region, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return result = UnicodeString(region, -1, US_INV); } UnicodeString& DefaultLocaleDisplayNames::variantDisplayName(const char* variant, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return result = UnicodeString(variant, -1, US_INV); } UnicodeString& DefaultLocaleDisplayNames::keyDisplayName(const char* key, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return result = UnicodeString(key, -1, US_INV); } UnicodeString& DefaultLocaleDisplayNames::keyValueDisplayName(const char* /* key */, const char* value, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return result = UnicodeString(value, -1, US_INV); } @@ -272,40 +272,48 @@ class LocaleDisplayNamesImpl : public LocaleDisplayNames { LocaleDisplayNamesImpl(const Locale& locale, UDisplayContext *contexts, int32_t length); virtual ~LocaleDisplayNamesImpl(); - virtual const Locale& getLocale() const override; + virtual const Locale& getLocale() const U_LIFETIME_BOUND override; virtual UDialectHandling getDialectHandling() const override; virtual UDisplayContext getContext(UDisplayContextType type) const override; virtual UnicodeString& localeDisplayName(const Locale& locale, - UnicodeString& result) const override; + UnicodeString& result U_LIFETIME_BOUND) const override; virtual UnicodeString& localeDisplayName(const char* localeId, - UnicodeString& result) const override; - virtual UnicodeString& languageDisplayName(const char* lang, - UnicodeString& result) const override; + UnicodeString& result U_LIFETIME_BOUND) const override; + virtual UnicodeString& + languageDisplayName(const char* lang, UnicodeString& result U_LIFETIME_BOUND) const override; virtual UnicodeString& scriptDisplayName(const char* script, - UnicodeString& result) const override; + UnicodeString& result U_LIFETIME_BOUND) const override; virtual UnicodeString& scriptDisplayName(UScriptCode scriptCode, - UnicodeString& result) const override; + UnicodeString& result U_LIFETIME_BOUND) const override; virtual UnicodeString& regionDisplayName(const char* region, - UnicodeString& result) const override; - virtual UnicodeString& variantDisplayName(const char* variant, - UnicodeString& result) const override; + UnicodeString& result U_LIFETIME_BOUND) const override; + virtual UnicodeString& + variantDisplayName(const char* variant, UnicodeString& result U_LIFETIME_BOUND) const override; virtual UnicodeString& keyDisplayName(const char* key, - UnicodeString& result) const override; - virtual UnicodeString& keyValueDisplayName(const char* key, - const char* value, - UnicodeString& result) const override; + UnicodeString& result U_LIFETIME_BOUND) const override; + virtual UnicodeString& + keyValueDisplayName(const char* key, const char* value, + UnicodeString& result U_LIFETIME_BOUND) const override; + private: - UnicodeString& localeIdName(const char* localeId, - UnicodeString& result, bool substitute) const; - UnicodeString& appendWithSep(UnicodeString& buffer, const UnicodeString& src) const; - UnicodeString& adjustForUsageAndContext(CapContextUsage usage, UnicodeString& result) const; - UnicodeString& scriptDisplayName(const char* script, UnicodeString& result, bool skipAdjust) const; - UnicodeString& regionDisplayName(const char* region, UnicodeString& result, bool skipAdjust) const; - UnicodeString& variantDisplayName(const char* variant, UnicodeString& result, bool skipAdjust) const; - UnicodeString& keyDisplayName(const char* key, UnicodeString& result, bool skipAdjust) const; + UnicodeString& localeIdName(const char* localeId, UnicodeString& result U_LIFETIME_BOUND, + bool substitute) const; + UnicodeString& appendWithSep(UnicodeString& buffer U_LIFETIME_BOUND, + const UnicodeString& src) const; + UnicodeString& adjustForUsageAndContext(CapContextUsage usage, + UnicodeString& result U_LIFETIME_BOUND) const; + UnicodeString& scriptDisplayName(const char* script, UnicodeString& result U_LIFETIME_BOUND, + bool skipAdjust) const; + UnicodeString& regionDisplayName(const char* region, UnicodeString& result U_LIFETIME_BOUND, + bool skipAdjust) const; + UnicodeString& variantDisplayName(const char* variant, UnicodeString& result U_LIFETIME_BOUND, + bool skipAdjust) const; + UnicodeString& keyDisplayName(const char* key, UnicodeString& result U_LIFETIME_BOUND, + bool skipAdjust) const; UnicodeString& keyValueDisplayName(const char* key, const char* value, - UnicodeString& result, bool skipAdjust) const; + UnicodeString& result U_LIFETIME_BOUND, + bool skipAdjust) const; void initialize(); struct CapitalizationContextSink; @@ -483,7 +491,7 @@ LocaleDisplayNamesImpl::~LocaleDisplayNamesImpl() { } const Locale& -LocaleDisplayNamesImpl::getLocale() const { +LocaleDisplayNamesImpl::getLocale() const U_LIFETIME_BOUND { return locale; } @@ -511,7 +519,7 @@ LocaleDisplayNamesImpl::getContext(UDisplayContextType type) const { UnicodeString& LocaleDisplayNamesImpl::adjustForUsageAndContext(CapContextUsage usage, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { #if !UCONFIG_NO_BREAK_ITERATION // check to see whether we need to titlecase result if ( result.length() > 0 && u_islower(result.char32At(0)) && capitalizationBrkIter!= nullptr && @@ -527,7 +535,7 @@ LocaleDisplayNamesImpl::adjustForUsageAndContext(CapContextUsage usage, UnicodeString& LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { if (loc.isBogus()) { result.setToBogus(); return result; @@ -669,7 +677,7 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& loc, } UnicodeString& -LocaleDisplayNamesImpl::appendWithSep(UnicodeString& buffer, const UnicodeString& src) const { +LocaleDisplayNamesImpl::appendWithSep(UnicodeString& buffer U_LIFETIME_BOUND, const UnicodeString& src) const { if (buffer.isEmpty()) { buffer.setTo(src); } else { @@ -682,14 +690,14 @@ LocaleDisplayNamesImpl::appendWithSep(UnicodeString& buffer, const UnicodeString UnicodeString& LocaleDisplayNamesImpl::localeDisplayName(const char* localeId, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return localeDisplayName(Locale(localeId), result); } // private UnicodeString& LocaleDisplayNamesImpl::localeIdName(const char* localeId, - UnicodeString& result, bool substitute) const { + UnicodeString& result U_LIFETIME_BOUND, bool substitute) const { if (nameLength == UDISPCTX_LENGTH_SHORT) { langData.getNoFallback("Languages%short", localeId, result); if (!result.isBogus()) { @@ -719,7 +727,7 @@ LocaleDisplayNamesImpl::localeIdName(const char* localeId, UnicodeString& LocaleDisplayNamesImpl::languageDisplayName(const char* lang, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { if (uprv_strcmp("root", lang) == 0 || uprv_strchr(lang, '_') != nullptr) { return result = UnicodeString(lang, -1, US_INV); } @@ -751,7 +759,7 @@ LocaleDisplayNamesImpl::languageDisplayName(const char* lang, UnicodeString& LocaleDisplayNamesImpl::scriptDisplayName(const char* script, - UnicodeString& result, + UnicodeString& result U_LIFETIME_BOUND, bool skipAdjust) const { if (nameLength == UDISPCTX_LENGTH_SHORT) { langData.getNoFallback("Scripts%short", script, result); @@ -769,19 +777,19 @@ LocaleDisplayNamesImpl::scriptDisplayName(const char* script, UnicodeString& LocaleDisplayNamesImpl::scriptDisplayName(const char* script, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return scriptDisplayName(script, result, false); } UnicodeString& LocaleDisplayNamesImpl::scriptDisplayName(UScriptCode scriptCode, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return scriptDisplayName(uscript_getName(scriptCode), result, false); } UnicodeString& LocaleDisplayNamesImpl::regionDisplayName(const char* region, - UnicodeString& result, + UnicodeString& result U_LIFETIME_BOUND, bool skipAdjust) const { if (nameLength == UDISPCTX_LENGTH_SHORT) { regionData.getNoFallback("Countries%short", region, result); @@ -799,14 +807,14 @@ LocaleDisplayNamesImpl::regionDisplayName(const char* region, UnicodeString& LocaleDisplayNamesImpl::regionDisplayName(const char* region, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return regionDisplayName(region, result, false); } UnicodeString& LocaleDisplayNamesImpl::variantDisplayName(const char* variant, - UnicodeString& result, + UnicodeString& result U_LIFETIME_BOUND, bool skipAdjust) const { // don't have a resource for short variant names if (substitute == UDISPCTX_SUBSTITUTE) { @@ -819,13 +827,13 @@ LocaleDisplayNamesImpl::variantDisplayName(const char* variant, UnicodeString& LocaleDisplayNamesImpl::variantDisplayName(const char* variant, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return variantDisplayName(variant, result, false); } UnicodeString& LocaleDisplayNamesImpl::keyDisplayName(const char* key, - UnicodeString& result, + UnicodeString& result U_LIFETIME_BOUND, bool skipAdjust) const { // don't have a resource for short key names if (substitute == UDISPCTX_SUBSTITUTE) { @@ -838,14 +846,14 @@ LocaleDisplayNamesImpl::keyDisplayName(const char* key, UnicodeString& LocaleDisplayNamesImpl::keyDisplayName(const char* key, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return keyDisplayName(key, result, false); } UnicodeString& LocaleDisplayNamesImpl::keyValueDisplayName(const char* key, const char* value, - UnicodeString& result, + UnicodeString& result U_LIFETIME_BOUND, bool skipAdjust) const { if (uprv_strcmp(key, "currency") == 0) { // ICU4C does not have ICU4J CurrencyDisplayInfo equivalent for now. @@ -880,7 +888,7 @@ LocaleDisplayNamesImpl::keyValueDisplayName(const char* key, UnicodeString& LocaleDisplayNamesImpl::keyValueDisplayName(const char* key, const char* value, - UnicodeString& result) const { + UnicodeString& result U_LIFETIME_BOUND) const { return keyValueDisplayName(key, value, result, false); } @@ -939,8 +947,8 @@ uldn_close(ULocaleDisplayNames *ldn) { delete (LocaleDisplayNames *)ldn; } -U_CAPI const char * U_EXPORT2 -uldn_getLocale(const ULocaleDisplayNames *ldn) { +U_CAPI const char* U_EXPORT2 +uldn_getLocale(const ULocaleDisplayNames* ldn U_LIFETIME_BOUND) { if (ldn) { return ((const LocaleDisplayNames *)ldn)->getLocale().getName(); } diff --git a/deps/icu-small/source/common/locid.cpp b/deps/icu-small/source/common/locid.cpp index 34f1266f6069..942eb4c187ed 100644 --- a/deps/icu-small/source/common/locid.cpp +++ b/deps/icu-small/source/common/locid.cpp @@ -63,6 +63,10 @@ #include "ustr_imp.h" #include "uvector.h" +#if UPRV_HAS_FEATURE(memory_sanitizer) +#include +#endif + U_NAMESPACE_BEGIN static Locale *gLocaleCache = nullptr; @@ -272,6 +276,10 @@ Locale::Nest::Nest(Heap&& heap, uint8_t variantBegin) { static_assert(offsetof(Nest, region) <= offsetof(Heap, script)); static_assert(offsetof(Nest, variantBegin) <= offsetof(Heap, region)); U_ASSERT(this == reinterpret_cast(&heap)); +#if UPRV_HAS_FEATURE(memory_sanitizer) + // Tell the sanitizer that we know that this memory really is OK to access. + __msan_unpoison(&heap, sizeof(Heap)); +#endif copyToArray<&Nest::script>(heap.script, this); copyToArray<&Nest::region>(heap.region, this); this->variantBegin = variantBegin; @@ -283,9 +291,11 @@ struct Locale::Heap::Alloc : public UMemory { FixedString baseName; int32_t variantBegin; - const char* getVariant() const { return variantBegin == 0 ? "" : getBaseName() + variantBegin; } - const char* getFullName() const { return fullName.data(); } - const char* getBaseName() const { + const char* getVariant() const U_LIFETIME_BOUND { + return variantBegin == 0 ? "" : getBaseName() + variantBegin; + } + const char* getFullName() const U_LIFETIME_BOUND { return fullName.data(); } + const char* getBaseName() const U_LIFETIME_BOUND { if (baseName.isEmpty()) { if (const char* name = fullName.data(); *name != '@') { return name; @@ -321,9 +331,9 @@ struct Locale::Heap::Alloc : public UMemory { ~Alloc() = default; }; -const char* Locale::Heap::getVariant() const { return ptr->getVariant(); } -const char* Locale::Heap::getFullName() const { return ptr->getFullName(); } -const char* Locale::Heap::getBaseName() const { return ptr->getBaseName(); } +const char* Locale::Heap::getVariant() const U_LIFETIME_BOUND { return ptr->getVariant(); } +const char* Locale::Heap::getFullName() const U_LIFETIME_BOUND { return ptr->getFullName(); } +const char* Locale::Heap::getBaseName() const U_LIFETIME_BOUND { return ptr->getBaseName(); } Locale::Heap::Heap(std::string_view language, std::string_view script, @@ -345,7 +355,7 @@ Locale::Heap::~Heap() { delete ptr; } -Locale::Heap& Locale::Heap::operator=(const Heap& other) { +Locale::Heap& Locale::Heap::operator=(const Heap& other) U_LIFETIME_BOUND { U_ASSERT(type == eBOGUS); UErrorCode status = U_ZERO_ERROR; ptr = new Alloc(*other.ptr, status); @@ -360,7 +370,7 @@ Locale::Heap& Locale::Heap::operator=(const Heap& other) { return *this; } -Locale::Heap& Locale::Heap::operator=(Heap&& other) noexcept { +Locale::Heap& Locale::Heap::operator=(Heap&& other) noexcept U_LIFETIME_BOUND { U_ASSERT(type == eBOGUS); ptr = other.ptr; type = eHEAP; @@ -407,7 +417,7 @@ Locale::Payload::~Payload() { Locale::Payload::Payload(const Payload& other) : type{eBOGUS} { copy(other); } Locale::Payload::Payload(Payload&& other) noexcept : type{eBOGUS} { move(std::move(other)); } -Locale::Payload& Locale::Payload::operator=(const Payload& other) { +Locale::Payload& Locale::Payload::operator=(const Payload& other) U_LIFETIME_BOUND { if (this != &other) { setToBogus(); copy(other); @@ -415,7 +425,7 @@ Locale::Payload& Locale::Payload::operator=(const Payload& other) { return *this; } -Locale::Payload& Locale::Payload::operator=(Payload&& other) noexcept { +Locale::Payload& Locale::Payload::operator=(Payload&& other) noexcept U_LIFETIME_BOUND { if (this != &other) { setToBogus(); move(std::move(other)); @@ -428,7 +438,7 @@ void Locale::Payload::setToBogus() { type = eBOGUS; } -template T& Locale::Payload::emplace(Args&&... args) { +template T& Locale::Payload::emplace(Args&&... args) U_LIFETIME_BOUND { if constexpr (std::is_same_v) { this->~Payload(); ::new (&nest) Nest(std::forward(args)...); @@ -441,8 +451,12 @@ template T& Locale::Payload::emplace(Args&&... ar } } -template <> Locale::Nest* Locale::Payload::get() { return type == eNEST ? &nest : nullptr; } -template <> Locale::Heap* Locale::Payload::get() { return type == eHEAP ? &heap : nullptr; } +template <> Locale::Nest* Locale::Payload::get() U_LIFETIME_BOUND { + return type == eNEST ? &nest : nullptr; +} +template <> Locale::Heap* Locale::Payload::get() U_LIFETIME_BOUND { + return type == eHEAP ? &heap : nullptr; +} UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Locale) @@ -586,8 +600,8 @@ Locale::Locale( const char * newLanguage, Locale::Locale(const Locale&) = default; Locale::Locale(Locale&&) noexcept = default; -Locale& Locale::operator=(const Locale&) = default; -Locale& Locale::operator=(Locale&&) noexcept = default; +Locale& Locale::operator=(const Locale&) U_LIFETIME_BOUND = default; +Locale& Locale::operator=(Locale&&) noexcept U_LIFETIME_BOUND = default; Locale * Locale::clone() const { @@ -749,11 +763,11 @@ class AliasData : public UMemory { return gSingleton; } - const CharStringMap& languageMap() const { return language; } - const CharStringMap& scriptMap() const { return script; } - const CharStringMap& territoryMap() const { return territory; } - const CharStringMap& variantMap() const { return variant; } - const CharStringMap& subdivisionMap() const { return subdivision; } + const CharStringMap& languageMap() const U_LIFETIME_BOUND { return language; } + const CharStringMap& scriptMap() const U_LIFETIME_BOUND { return script; } + const CharStringMap& territoryMap() const U_LIFETIME_BOUND { return territory; } + const CharStringMap& variantMap() const U_LIFETIME_BOUND { return variant; } + const CharStringMap& subdivisionMap() const U_LIFETIME_BOUND { return subdivision; } static void U_CALLCONV loadData(UErrorCode &status); static UBool U_CALLCONV cleanup(); @@ -1224,8 +1238,9 @@ class AliasReplacer { * nullptr || "" CCC nullptr CCC * nullptr || "" * DDD nullptr */ - inline const char* deleteOrReplace( - const char* input, const char* type, const char* replacement) { + inline const char* deleteOrReplace(const char* input U_LIFETIME_BOUND, + const char* type, + const char* replacement U_LIFETIME_BOUND) { return notEmpty(replacement) ? ((input == nullptr) ? replacement : input) : ((type == nullptr) ? input : nullptr); @@ -1243,11 +1258,11 @@ class AliasReplacer { } // Gather fields and generate locale ID into out. - CharString& outputToString(CharString& out, UErrorCode& status); + CharString& outputToString(CharString& out U_LIFETIME_BOUND, UErrorCode& status); // Generate the lookup key. CharString& generateKey(const char* language, const char* region, - const char* variant, CharString& out, + const char* variant, CharString& out U_LIFETIME_BOUND, UErrorCode& status); void parseLanguageReplacement(const char* replacement, @@ -1285,7 +1300,7 @@ class AliasReplacer { CharString& AliasReplacer::generateKey( const char* language, const char* region, const char* variant, - CharString& out, UErrorCode& status) + CharString& out U_LIFETIME_BOUND, UErrorCode& status) { if (U_FAILURE(status)) { return out; } out.append(language, status); @@ -1322,14 +1337,13 @@ AliasReplacer::parseLanguageReplacement( return; } // We have multiple field so we have to allocate and parse - CharString* str = - new CharString(replacement, static_cast(uprv_strlen(replacement)), status); - LocalPointer lpStr(str, status); - toBeFreed.adoptElement(lpStr.orphan(), status); + auto str = prv::make_unique( + replacement, static_cast(uprv_strlen(replacement)), status, status); + char* data = str->data(); + toBeFreed.adoptElement(str.release(), status); if (U_FAILURE(status)) { return; } - char* data = str->data(); replacedLanguage = (const char*) data; char* endOfField = uprv_strchr(data, '_'); *endOfField = '\0'; // null terminiate it. @@ -1515,7 +1529,7 @@ AliasReplacer::replaceTerritory(UVector& toBeFreed, UErrorCode& status) .build(status); l.addLikelySubtags(status); const char* likelyRegion = l.getCountry(); - LocalPointer item; + prv::unique_ptr item; if (likelyRegion != nullptr && uprv_strlen(likelyRegion) > 0) { size_t len = uprv_strlen(likelyRegion); const char* foundInReplacement = uprv_strstr(replacement, @@ -1527,18 +1541,17 @@ AliasReplacer::replaceTerritory(UVector& toBeFreed, UErrorCode& status) *(foundInReplacement-1) == ' '); U_ASSERT(foundInReplacement[len] == ' ' || foundInReplacement[len] == '\0'); - item.adoptInsteadAndCheckErrorCode( - new CharString(foundInReplacement, static_cast(len), status), status); + item = prv::make_unique( + foundInReplacement, static_cast(len), status, status); } } - if (item.isNull() && U_SUCCESS(status)) { - item.adoptInsteadAndCheckErrorCode( - new CharString(replacement, - static_cast(firstSpace - replacement), status), status); + if (!item && U_SUCCESS(status)) { + item = prv::make_unique( + replacement, static_cast(firstSpace - replacement), status, status); } if (U_FAILURE(status)) { return false; } replacedRegion = item->data(); - toBeFreed.adoptElement(item.orphan(), status); + toBeFreed.adoptElement(item.release(), status); if (U_FAILURE(status)) { return false; } } U_ASSERT(!same(region, replacedRegion)); @@ -1704,7 +1717,7 @@ AliasReplacer::replaceTransformedExtensions( CharString& AliasReplacer::outputToString( - CharString& out, UErrorCode& status) + CharString& out U_LIFETIME_BOUND, UErrorCode& status) { if (U_FAILURE(status)) { return out; } out.append(language, status); @@ -1948,13 +1961,13 @@ ulocimp_isCanonicalizedLocaleForTest(const char* localeName) U_NAMESPACE_BEGIN -Locale& Locale::init(const char* localeID, UBool canonicalize) +Locale& Locale::init(const char* localeID, UBool canonicalize) U_LIFETIME_BOUND { return localeID == nullptr ? *this = getDefault() : init(StringPiece{localeID}, canonicalize); } /*This function initializes a Locale from a C locale ID*/ -Locale& Locale::init(StringPiece localeID, UBool canonicalize) +Locale& Locale::init(StringPiece localeID, UBool canonicalize) U_LIFETIME_BOUND { /* Free our current storage */ Nest& nest = payload.emplace(); @@ -2579,7 +2592,7 @@ class KeywordEnumeration : public StringEnumeration { return result; } - virtual const char* next(int32_t* resultLength, UErrorCode& status) override { + virtual const char* next(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND override { const char* result; int32_t len; if(U_SUCCESS(status) && *current != 0) { @@ -2598,7 +2611,7 @@ class KeywordEnumeration : public StringEnumeration { return result; } - virtual const UnicodeString* snext(UErrorCode& status) override { + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override { if (U_FAILURE(status)) { return nullptr; } int32_t resultLength = 0; const char *s = next(&resultLength, status); @@ -2623,7 +2636,7 @@ class UnicodeKeywordEnumeration : public KeywordEnumeration { using KeywordEnumeration::KeywordEnumeration; virtual ~UnicodeKeywordEnumeration(); - virtual const char* next(int32_t* resultLength, UErrorCode& status) override { + virtual const char* next(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND override { const char* legacy_key = KeywordEnumeration::next(nullptr, status); while (U_SUCCESS(status) && legacy_key != nullptr) { const char* key = uloc_toUnicodeLocaleKey(legacy_key); @@ -2877,38 +2890,38 @@ Locale::setUnicodeKeywordValue(StringPiece keywordName, } const char* -Locale::getCountry() const { +Locale::getCountry() const U_LIFETIME_BOUND { return getField<&Nest::getRegion, &Heap::getRegion>(); } const char* -Locale::getLanguage() const { +Locale::getLanguage() const U_LIFETIME_BOUND { return getField<&Nest::getLanguage, &Heap::getLanguage>(); } const char* -Locale::getScript() const { +Locale::getScript() const U_LIFETIME_BOUND { return getField<&Nest::getScript, &Heap::getScript>(); } const char* -Locale::getVariant() const { +Locale::getVariant() const U_LIFETIME_BOUND { return getField<&Nest::getVariant, &Heap::getVariant>(); } const char* -Locale::getName() const { +Locale::getName() const U_LIFETIME_BOUND { return getField<&Nest::getBaseName, &Heap::getFullName>(); } const char* -Locale::getBaseName() const { +Locale::getBaseName() const U_LIFETIME_BOUND { return getField<&Nest::getBaseName, &Heap::getBaseName>(); } template -const char* Locale::getField() const { +const char* Locale::getField() const U_LIFETIME_BOUND { return payload.visit([] { return ""; }, [](const Nest& nest) { return (nest.*NEST)(); }, [](const Heap& heap) { return (heap.*HEAP)(); }); diff --git a/deps/icu-small/source/common/loclikely.cpp b/deps/icu-small/source/common/loclikely.cpp index 1c9447fa2bf3..6b9318accfd1 100644 --- a/deps/icu-small/source/common/loclikely.cpp +++ b/deps/icu-small/source/common/loclikely.cpp @@ -418,7 +418,7 @@ GetRegionFromKey(const char* localeID, std::string_view key, UErrorCode& status) if (U_SUCCESS(status) && len >= 3 && len <= 6 && uprv_isASCIILetter(kw[0]) && uprv_isASCIILetter(kw[1])) { // Additional Check - static icu::RegionValidateMap valid; + icu::RegionValidateMap valid; const char region[] = {kw[0], kw[1], '\0'}; if (valid.isSet(region)) { result.append(uprv_toupper(kw[0]), status); diff --git a/deps/icu-small/source/common/loclikelysubtags.h b/deps/icu-small/source/common/loclikelysubtags.h index 5c51e353c1e7..2e7b1cb4f28d 100644 --- a/deps/icu-small/source/common/loclikelysubtags.h +++ b/deps/icu-small/source/common/loclikelysubtags.h @@ -68,7 +68,7 @@ class LikelySubtags final : public UMemory { UErrorCode &errorCode) const; // visible for LocaleDistance - const LocaleDistanceData &getDistanceData() const { return distanceData; } + const LocaleDistanceData& getDistanceData() const U_LIFETIME_BOUND { return distanceData; } private: LikelySubtags(LikelySubtagsData &data); diff --git a/deps/icu-small/source/common/locmap.cpp b/deps/icu-small/source/common/locmap.cpp index da78c7716a75..488a1c1da63a 100644 --- a/deps/icu-small/source/common/locmap.cpp +++ b/deps/icu-small/source/common/locmap.cpp @@ -1173,7 +1173,6 @@ uprv_convertToLCIDPlatform(const char* localeID, UErrorCode* status) // 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; icu::CharString baseName; const char * mylocaleID = localeID; diff --git a/deps/icu-small/source/common/messageimpl.h b/deps/icu-small/source/common/messageimpl.h index 061df9189d53..695901c7762a 100644 --- a/deps/icu-small/source/common/messageimpl.h +++ b/deps/icu-small/source/common/messageimpl.h @@ -50,9 +50,9 @@ class U_COMMON_API MessageImpl { * Appends the sub-message to the result string. * Omits SKIP_SYNTAX and appends whole arguments using appendReducedApostrophes(). */ - static UnicodeString &appendSubMessageWithoutSkipSyntax(const MessagePattern &msgPattern, + static UnicodeString& appendSubMessageWithoutSkipSyntax(const MessagePattern& msgPattern, int32_t msgStart, - UnicodeString &result); + UnicodeString& result U_LIFETIME_BOUND); private: MessageImpl() = delete; // no constructor: all static methods diff --git a/deps/icu-small/source/common/messagepattern.cpp b/deps/icu-small/source/common/messagepattern.cpp index cd2976da164d..b5f945c59e71 100644 --- a/deps/icu-small/source/common/messagepattern.cpp +++ b/deps/icu-small/source/common/messagepattern.cpp @@ -195,8 +195,8 @@ MessagePattern::MessagePattern(const MessagePattern &other) } } -MessagePattern & -MessagePattern::operator=(const MessagePattern &other) { +MessagePattern& +MessagePattern::operator=(const MessagePattern& other) U_LIFETIME_BOUND { if(this==&other) { return *this; } @@ -264,35 +264,40 @@ MessagePattern::~MessagePattern() { // MessagePattern API ------------------------------------------------------ *** -MessagePattern & -MessagePattern::parse(const UnicodeString &pattern, UParseError *parseError, UErrorCode &errorCode) { +MessagePattern& +MessagePattern::parse(const UnicodeString& pattern, + UParseError* parseError, + UErrorCode& errorCode) U_LIFETIME_BOUND { preParse(pattern, parseError, errorCode); parseMessage(0, 0, 0, UMSGPAT_ARG_TYPE_NONE, parseError, errorCode); postParse(); return *this; } -MessagePattern & -MessagePattern::parseChoiceStyle(const UnicodeString &pattern, - UParseError *parseError, UErrorCode &errorCode) { +MessagePattern& +MessagePattern::parseChoiceStyle(const UnicodeString& pattern, + UParseError* parseError, + UErrorCode& errorCode) U_LIFETIME_BOUND { preParse(pattern, parseError, errorCode); parseChoiceStyle(0, 0, parseError, errorCode); postParse(); return *this; } -MessagePattern & -MessagePattern::parsePluralStyle(const UnicodeString &pattern, - UParseError *parseError, UErrorCode &errorCode) { +MessagePattern& +MessagePattern::parsePluralStyle(const UnicodeString& pattern, + UParseError* parseError, + UErrorCode& errorCode) U_LIFETIME_BOUND { preParse(pattern, parseError, errorCode); parsePluralOrSelectStyle(UMSGPAT_ARG_TYPE_PLURAL, 0, 0, parseError, errorCode); postParse(); return *this; } -MessagePattern & -MessagePattern::parseSelectStyle(const UnicodeString &pattern, - UParseError *parseError, UErrorCode &errorCode) { +MessagePattern& +MessagePattern::parseSelectStyle(const UnicodeString& pattern, + UParseError* parseError, + UErrorCode& errorCode) U_LIFETIME_BOUND { preParse(pattern, parseError, errorCode); parsePluralOrSelectStyle(UMSGPAT_ARG_TYPE_SELECT, 0, 0, parseError, errorCode); postParse(); @@ -1202,10 +1207,10 @@ MessageImpl::appendReducedApostrophes(const UnicodeString &s, int32_t start, int } // Ported from second half of ICU4J SelectFormat.format(String). -UnicodeString & -MessageImpl::appendSubMessageWithoutSkipSyntax(const MessagePattern &msgPattern, +UnicodeString& +MessageImpl::appendSubMessageWithoutSkipSyntax(const MessagePattern& msgPattern, int32_t msgStart, - UnicodeString &result) { + UnicodeString& result U_LIFETIME_BOUND) { const UnicodeString &msgString=msgPattern.getPatternString(); int32_t prevIndex=msgPattern.getPart(msgStart).getLimit(); for(int32_t i=msgStart;;) { diff --git a/deps/icu-small/source/common/norm2_nfc_data.h b/deps/icu-small/source/common/norm2_nfc_data.h index 562c2b2513e6..06332e211812 100644 --- a/deps/icu-small/source/common/norm2_nfc_data.h +++ b/deps/icu-small/source/common/norm2_nfc_data.h @@ -10,14 +10,14 @@ #ifdef INCLUDED_FROM_NORMALIZER2_CPP static const UVersionInfo norm2_nfc_data_formatVersion={5,0,0,0}; -static const UVersionInfo norm2_nfc_data_dataVersion={0x11,0,0,0}; +static const UVersionInfo norm2_nfc_data_dataVersion={0x12,0,0,0}; static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={ -0x58,0x4eec,0x8cc8,0x8dc8,0x8dc8,0x8dc8,0x8dc8,0x8dc8,0xc0,0x300,0xb0c,0x2a6a,0x3cf0,0xfbc4,0x12c2,0x3c26, +0x58,0x4f50,0x8d2c,0x8e2c,0x8e2c,0x8e2c,0x8e2c,0x8e2c,0xc0,0x300,0xb0c,0x2a6a,0x3cf0,0xfbc4,0x12c2,0x3c26, 0x3cbe,0x3cf0,0x300,0,0xfb10,0xfb9e }; -static const uint16_t norm2_nfc_data_trieIndex[1888]={ +static const uint16_t norm2_nfc_data_trieIndex[1891]={ 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,0x688,0x6be,0x6fe,0x73b,0x75b,0x79a,0x7d9,0x816,0x835,0x872,0x75b,0x8ab,0x8d9,0x918, @@ -82,7 +82,7 @@ static const uint16_t norm2_nfc_data_trieIndex[1888]={ 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x1881,0x18c1,0x1901,0x1941,0x1981,0x19c1,0x1a01,0x1a41,0x1a64,0x1aa4,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ac4,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x6e2,0x6f2,0x70a,0x729,0x73e,0x73e,0x73e,0x742,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x6e5,0x6f5,0x70d,0x72c,0x741,0x741,0x741,0x745,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,0xc0c,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x54f,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x40c, @@ -91,54 +91,55 @@ static const uint16_t norm2_nfc_data_trieIndex[1888]={ 0x1b1a,0x226,0x226,0x1b2a,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xdf8,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x1b3a,0x226,0x226,0x226,0x1b42,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x1608,0x226,0x226,0x226,0x226,0x1b50,0x226,0x226,0x226,0x226,0x1b60,0x54f,0x226,0x226,0x1b70,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x81d,0x226,0x226,0x1b80,0x226,0x1b90,0x1b9d,0x1ba9,0x226,0x226, -0x226,0x226,0x414,0x226,0x1bb4,0x1bc4,0x226,0x226,0x226,0x812,0x226,0x226,0x226,0x226,0x1bd4,0x226, -0x226,0x226,0x1bdf,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1be6,0x226,0x226, -0x226,0x226,0x1bf1,0x1c00,0x928,0x1c0e,0x412,0x1c1c,0x1c2c,0x226,0x1c34,0x1c42,0x87f,0x226,0x226,0x226, -0x226,0x1c52,0x7ca,0x226,0x226,0x226,0x226,0x226,0x1c62,0x1c71,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x908,0x1c79,0x1c89,0x226,0x226,0x226,0x9ec,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x1c93,0x226,0x226,0x226,0x226,0x226,0x226,0x818,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1c90,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ca3,0x812,0x226,0x226,0x226,0x226, +0x1608,0x226,0x1b50,0x226,0x226,0x1b60,0x226,0x226,0x226,0x226,0x1b70,0x54f,0x226,0x226,0x1b80,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x81d,0x226,0x226,0x1b90,0x226,0x1ba0,0x1bad,0x1bb9,0x226,0x226, +0x226,0x226,0x414,0x226,0x1bc4,0x1bd4,0x226,0x226,0x226,0x812,0x226,0x226,0x226,0x226,0x1be4,0x226, +0x226,0x226,0x1bef,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1bf6,0x226,0x226, +0x226,0x226,0x1c01,0x1c10,0x928,0x1c1e,0x412,0x1c2c,0x1c3c,0x226,0x1c44,0x1c52,0x87f,0x226,0x226,0x226, +0x226,0x1c62,0x7ca,0x226,0x226,0x226,0x226,0x226,0x1c72,0x1c81,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x908,0x1c89,0x1c99,0x226,0x226,0x226,0x9ec,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x1ca3,0x226,0x226,0x226,0x226,0x226,0x226,0x818,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1ca0,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cb3,0x812,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x87f,0x226,0x226,0x226,0x81f,0x81c,0x226,0x226,0x226,0x226,0x81a, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x9ec,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xc06,0x226,0x226,0x226,0x226,0x81c,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0xc09,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x1cb2,0x1cc1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x1cd1,0x226,0x226,0x226,0xf2d,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cde, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x1cc2,0x1cd1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x1ce1,0x226,0x226,0x226,0xf2d,0x226,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cee, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cf0,0x226,0x226,0x226,0x226,0x226,0x226, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x1cff,0x1d0f,0x1d1d,0x1d2a,0x226,0x1d36,0x1d44,0x1d54,0x226,0x226,0x226,0x226,0xd1c,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1cfe, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d00,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0xb10,0x226,0x226,0x1d0f,0x1d1f,0x1d2d,0x1d3a,0x226,0x1d46,0x1d54,0x1d64,0x226,0x226,0x226,0x226,0xd1c, +0x1d74,0x226,0x226,0x1d83,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d93,0x1d9b,0x1da9,0x226,0x226, +0x226,0x226,0x226,0x4f9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xf2d,0x226, +0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7ca,0x226,0x226,0x226,0x4fc, 0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d64,0x1d6c,0x1d7a,0x226,0x226,0x226,0x226,0x226, -0x4f9,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0xf2d,0x226,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x7ca,0x226,0x226,0x226,0x4fc,0x226,0x226,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d85,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x5c1,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1d95,0x7d3,0x226, -0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x1da5, -0x226,0x226,0x226,0x226,0x226,0x226,0x1db1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, -0x226,0x226,0x1dc1,0x1dd1,0x1de1,0x1df1,0x1e01,0x1e11,0x1e21,0x1e31,0x1e41,0x1e51,0x1e61,0x1e71,0x1e81,0x1e91, -0x1ea1,0x1eb1,0x1ec1,0x1ed1,0x1ee1,0x1ef1,0x1f01,0x1f11,0x1f21,0x1f31,0x1f41,0x1f51,0x1f61,0x1f71,0x1f81,0x1f91, -0x1fa1,0x1fb1,0x1fc1,0x1fd1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x1db4,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x5c1,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x1dc4,0x7d3,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x1dd4,0x226,0x226,0x226,0x226,0x226,0x226,0x1de0,0x226,0x226,0x226,0x226,0x226,0x226, +0x226,0x226,0x226,0x226,0x226,0x1df0,0x1e00,0x1e10,0x1e20,0x1e30,0x1e40,0x1e50,0x1e60,0x1e70,0x1e80,0x1e90, +0x1ea0,0x1eb0,0x1ec0,0x1ed0,0x1ee0,0x1ef0,0x1f00,0x1f10,0x1f20,0x1f30,0x1f40,0x1f50,0x1f60,0x1f70,0x1f80,0x1f90, +0x1fa0,0x1fb0,0x1fc0,0x1fd0,0x1fe0,0x1ff0,0x2000,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,0x440,0xc4,0xc4,0x460,0x46f,0x486,0x4a2,0x4bf,0x4dd,0x4fa,0x517,0x536, -0x553,0x56d,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0x582,0xc4,0xc4,0xc4,0xc4,0x595,0x5a9,0x5c0,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0x226,0x226,0x226,0x226,0x226,0x408,0x428,0x440,0xc4,0xc4,0x460,0x46f,0x486,0x4a2,0x4bf,0x4dd, +0x4fa,0x517,0x536,0x553,0x56d,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, +0xc4,0xc4,0xc4,0xc4,0xc4,0x582,0xc4,0xc4,0xc4,0xc4,0x595,0x5a9,0x5c0,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,0xc4,0x5e0,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0x5eb,0x608,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x628,0x63e,0x650,0x66f,0x682,0xc4,0xc4, +0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x5e0,0xc4,0xc4,0xc4,0xc4, +0xc4,0xc4,0xc4,0xc4,0x5ee,0x60b,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x62b,0x641,0x653,0x672, +0x685,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,0xc4,0xc4,0xc4,0xc4,0xc4, -0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0xc4,0x6a2,0x6c2 +0xc4,0x6a5,0x6c5 }; -static const uint16_t norm2_nfc_data_trieData[8162]={ +static const uint16_t norm2_nfc_data_trieData[8209]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -216,7 +217,7 @@ static const uint16_t norm2_nfc_data_trieData[8162]={ 0xffcc,0xffcc,0xffbc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8, 0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffbc,0xffc8,0xffcc,0xfe14,0xfe16,0xfe18,0xfe1a,0xfe1c,0xfe1e,0xfe20,0xfe22, 0xfe24,0xfe26,0xfe26,0xfe28,0xfe2a,0xfe2c,1,0xfe2e,1,0xfe30,0xfe32,1,0xffcc,0xffb8,1,0xfe24, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfe14,0xfe2a,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 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, @@ -373,8 +374,8 @@ static const uint16_t norm2_nfc_data_trieData[8162]={ 1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8, 0xffb8,0xffcc,0xffcc,0xffb8,1,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8, 0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc, -0xffd4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc, +0xffd4,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0x8c4,0x1a65,0x8c8,0x1a6b,0x8cc,0x1a71,0x8d0,0x1a77,0x8d4,0x1a7d,1, 1,0x8d8,0x1a83,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -576,7 +577,8 @@ static const uint16_t norm2_nfc_data_trieData[8162]={ 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,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, -1,1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,1,0xffb8,0xffb8,0xffb8, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc, +0xffb8,0xffb8,0xffb8,0xffcc,0xffb8,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,1,0xffb8,0xffb8,0xffb8, 1,1,1,1,1,1,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffb8,0xffb8,0xffb8, 1,1,0xffcc,0xffb8,0xffcc,0xffb8,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,0xfe12, @@ -609,53 +611,55 @@ static const uint16_t norm2_nfc_data_trieData[8162]={ 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,0x3370, 0x337a,0x338e,0x33a6,0x33be,0x33d6,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,1,1,1,1,1,1, -1,0xffd0,0xffd0,0xffb8,0xffcc,1,1,1,0xffcc,1,1,0xffcc,1,1,1,1, -1,1,1,0xffcc,0xffcc,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,0x33e5,0x33e9,0x33ed,0x33f1,0x33f7,0x2fd7,0x33fb,0x33ff,0x3403,0x3407,0x2fdb,0x340b,0x340f,0x3413,0x2fdf, -0x3419,0x341d,0x3421,0x3425,0x342b,0x342f,0x3433,0x3437,0x343d,0x3441,0x3445,0x3449,0x30c9,0x344d,0x3453,0x3457, -0x345b,0x345f,0x3463,0x3467,0x346b,0x346f,0x30dd,0x2fe3,0x2fe7,0x30e1,0x3473,0x3477,0x2ce3,0x347b,0x2feb,0x347f, -0x3483,0x3487,0x348b,0x348b,0x348b,0x348f,0x3495,0x3499,0x349d,0x34a1,0x34a7,0x34ab,0x34af,0x34b3,0x34b7,0x34bb, -0x34bf,0x34c3,0x34c7,0x34cb,0x34cf,0x34d3,0x34d7,0x34d7,0x30e9,0x34db,0x34df,0x34e3,0x34e7,0x2ff3,0x34eb,0x34ef, -0x34f3,0x2f47,0x34f7,0x34fb,0x34ff,0x3503,0x3507,0x350b,0x350f,0x3513,0x3517,0x351d,0x3521,0x3525,0x3529,0x352d, -0x3531,0x3535,0x353b,0x3541,0x3545,0x3549,0x354d,0x3551,0x3555,0x3559,0x355d,0x3561,0x3561,0x3565,0x356b,0x356f, -0x2cd3,0x3573,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3007,0x3595,0x3599,0x359d,0x35a3,0x35a7,0x35ad, -0x35b1,0x35b5,0x35b9,0x35bd,0x35c1,0x35c5,0x35c9,0x35cd,0x35d1,0x35d5,0x35d9,0x35df,0x35e3,0x35e7,0x35eb,0x2bfb, -0x35ef,0x35f5,0x35f9,0x35f9,0x35ff,0x3603,0x3603,0x3607,0x360b,0x3611,0x3617,0x361b,0x361f,0x3623,0x3627,0x362b, -0x362f,0x3633,0x3637,0x363b,0x300b,0x363f,0x3645,0x3649,0x364d,0x3119,0x364d,0x3651,0x3013,0x3655,0x3659,0x365d, -0x3661,0x3017,0x2b8f,0x3665,0x3669,0x366d,0x3671,0x3675,0x3679,0x367d,0x3683,0x3687,0x368b,0x368f,0x3693,0x3697, -0x369d,0x36a1,0x36a5,0x36a9,0x36ad,0x36b1,0x36b5,0x36b9,0x36bd,0x301b,0x36c1,0x36c5,0x36cb,0x36cf,0x36d3,0x36d7, -0x3023,0x36db,0x36df,0x36e3,0x36e7,0x36eb,0x36ef,0x36f3,0x36f7,0x2bff,0x3139,0x36fb,0x36ff,0x3703,0x3707,0x370d, -0x3711,0x3715,0x3719,0x3027,0x371d,0x3723,0x3727,0x372b,0x31eb,0x372f,0x3733,0x3737,0x373b,0x373f,0x3745,0x3749, -0x374d,0x3751,0x3757,0x375b,0x375f,0x3763,0x2d17,0x3767,0x376b,0x3771,0x3777,0x377d,0x3781,0x3787,0x378b,0x378f, -0x3793,0x3797,0x302b,0x2e73,0x379b,0x379f,0x37a3,0x37a7,0x37ad,0x37b1,0x37b5,0x37b9,0x3149,0x37bd,0x37c1,0x37c7, -0x37cb,0x37cf,0x37d5,0x37db,0x37df,0x314d,0x37e3,0x37e7,0x37eb,0x37ef,0x37f3,0x37f7,0x37fb,0x3801,0x3805,0x380b, -0x380f,0x3815,0x3155,0x3819,0x381d,0x3823,0x3827,0x382b,0x3831,0x3837,0x383b,0x383f,0x3843,0x3847,0x3847,0x384b, -0x384f,0x315d,0x3853,0x3857,0x385b,0x385f,0x3863,0x3869,0x386d,0x2cdf,0x3873,0x3879,0x387d,0x3883,0x3889,0x388f, -0x3893,0x3175,0x3897,0x389d,0x38a3,0x38a9,0x38af,0x38b3,0x38b3,0x3179,0x31f3,0x38b7,0x38bb,0x38bf,0x38c3,0x38c9, -0x2c47,0x3181,0x38cd,0x38d1,0x3057,0x38d7,0x38dd,0x2f9f,0x38e3,0x38e7,0x3067,0x38eb,0x38ef,0x38f3,0x38f9,0x38f9, -0x38ff,0x3903,0x3907,0x390d,0x3911,0x3915,0x3919,0x391f,0x3923,0x3927,0x392b,0x392f,0x3933,0x3939,0x393d,0x3941, -0x3945,0x3949,0x394d,0x3951,0x3957,0x395d,0x3961,0x3967,0x396b,0x3971,0x3975,0x307f,0x3979,0x397f,0x3985,0x3989, -0x398f,0x3993,0x3999,0x399d,0x39a1,0x39a5,0x39a9,0x39ad,0x39b1,0x39b7,0x39bd,0x39c3,0x35ff,0x39c9,0x39cd,0x39d1, -0x39d5,0x39d9,0x39dd,0x39e1,0x39e5,0x39e9,0x39ed,0x39f1,0x39f5,0x2d27,0x39fb,0x39ff,0x3a03,0x3a07,0x3a0b,0x3a0f, -0x308b,0x3a13,0x3a17,0x3a1b,0x3a1f,0x3a23,0x3a29,0x3a2f,0x3a35,0x3a39,0x3a3d,0x3a41,0x3a45,0x3a4b,0x3a4f,0x3a55, -0x3a59,0x3a5d,0x3a63,0x3a69,0x3a6d,0x2c33,0x3a71,0x3a75,0x3a79,0x3a7d,0x3a81,0x3a85,0x319d,0x3a89,0x3a8d,0x3a91, -0x3a95,0x3a99,0x3a9d,0x3aa1,0x3aa5,0x3aa9,0x3aad,0x3ab3,0x3ab7,0x3abb,0x3abf,0x3ac3,0x3ac7,0x3acd,0x3ad3,0x3ad7, -0x3adb,0x31b1,0x31b5,0x3adf,0x3ae3,0x3ae9,0x3aed,0x3af1,0x3af5,0x3af9,0x3aff,0x3b05,0x3b09,0x3b0d,0x3b11,0x3b17, -0x31b9,0x3b1b,0x3b21,0x3b27,0x3b2b,0x3b2f,0x3b33,0x3b39,0x3b3d,0x3b41,0x3b45,0x3b49,0x3b4d,0x3b51,0x3b55,0x3b5b, -0x3b5f,0x3b63,0x3b67,0x3b6d,0x3b71,0x3b75,0x3b79,0x3b7d,0x3b83,0x3b89,0x3b8d,0x3b91,0x3b95,0x3b9b,0x3b9f,0x31d1, -0x31d1,0x3ba5,0x3ba9,0x3baf,0x3bb3,0x3bb7,0x3bbb,0x3bbf,0x3bc3,0x3bc7,0x3bcb,0x31d5,0x3bd1,0x3bd5,0x3bd9,0x3bdd, -0x3be1,0x3be5,0x3beb,0x3bef,0x3bf5,0x3bfb,0x3c01,0x3c05,0x3c09,0x3c0d,0x3c11,0x3c15,0x3c19,0x3c1d,0x3c21,1, -1,1 +1,1,1,1,0xffb0,0xffb0,0xffb0,1,1,1,1,1,1,1,1,0xfe02, +0xfe02,1,1,0xffb0,0xffb0,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,1,1,1,1,1,1,1, +0xffd0,0xffd0,0xffb8,0xffcc,1,1,1,0xffcc,1,1,0xffcc,1,1,1,1,1, +1,1,0xffcc,0xffcc,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, +0x33e5,0x33e9,0x33ed,0x33f1,0x33f7,0x2fd7,0x33fb,0x33ff,0x3403,0x3407,0x2fdb,0x340b,0x340f,0x3413,0x2fdf,0x3419, +0x341d,0x3421,0x3425,0x342b,0x342f,0x3433,0x3437,0x343d,0x3441,0x3445,0x3449,0x30c9,0x344d,0x3453,0x3457,0x345b, +0x345f,0x3463,0x3467,0x346b,0x346f,0x30dd,0x2fe3,0x2fe7,0x30e1,0x3473,0x3477,0x2ce3,0x347b,0x2feb,0x347f,0x3483, +0x3487,0x348b,0x348b,0x348b,0x348f,0x3495,0x3499,0x349d,0x34a1,0x34a7,0x34ab,0x34af,0x34b3,0x34b7,0x34bb,0x34bf, +0x34c3,0x34c7,0x34cb,0x34cf,0x34d3,0x34d7,0x34d7,0x30e9,0x34db,0x34df,0x34e3,0x34e7,0x2ff3,0x34eb,0x34ef,0x34f3, +0x2f47,0x34f7,0x34fb,0x34ff,0x3503,0x3507,0x350b,0x350f,0x3513,0x3517,0x351d,0x3521,0x3525,0x3529,0x352d,0x3531, +0x3535,0x353b,0x3541,0x3545,0x3549,0x354d,0x3551,0x3555,0x3559,0x355d,0x3561,0x3561,0x3565,0x356b,0x356f,0x2cd3, +0x3573,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3007,0x3595,0x3599,0x359d,0x35a3,0x35a7,0x35ad,0x35b1, +0x35b5,0x35b9,0x35bd,0x35c1,0x35c5,0x35c9,0x35cd,0x35d1,0x35d5,0x35d9,0x35df,0x35e3,0x35e7,0x35eb,0x2bfb,0x35ef, +0x35f5,0x35f9,0x35f9,0x35ff,0x3603,0x3603,0x3607,0x360b,0x3611,0x3617,0x361b,0x361f,0x3623,0x3627,0x362b,0x362f, +0x3633,0x3637,0x363b,0x300b,0x363f,0x3645,0x3649,0x364d,0x3119,0x364d,0x3651,0x3013,0x3655,0x3659,0x365d,0x3661, +0x3017,0x2b8f,0x3665,0x3669,0x366d,0x3671,0x3675,0x3679,0x367d,0x3683,0x3687,0x368b,0x368f,0x3693,0x3697,0x369d, +0x36a1,0x36a5,0x36a9,0x36ad,0x36b1,0x36b5,0x36b9,0x36bd,0x301b,0x36c1,0x36c5,0x36cb,0x36cf,0x36d3,0x36d7,0x3023, +0x36db,0x36df,0x36e3,0x36e7,0x36eb,0x36ef,0x36f3,0x36f7,0x2bff,0x3139,0x36fb,0x36ff,0x3703,0x3707,0x370d,0x3711, +0x3715,0x3719,0x3027,0x371d,0x3723,0x3727,0x372b,0x31eb,0x372f,0x3733,0x3737,0x373b,0x373f,0x3745,0x3749,0x374d, +0x3751,0x3757,0x375b,0x375f,0x3763,0x2d17,0x3767,0x376b,0x3771,0x3777,0x377d,0x3781,0x3787,0x378b,0x378f,0x3793, +0x3797,0x302b,0x2e73,0x379b,0x379f,0x37a3,0x37a7,0x37ad,0x37b1,0x37b5,0x37b9,0x3149,0x37bd,0x37c1,0x37c7,0x37cb, +0x37cf,0x37d5,0x37db,0x37df,0x314d,0x37e3,0x37e7,0x37eb,0x37ef,0x37f3,0x37f7,0x37fb,0x3801,0x3805,0x380b,0x380f, +0x3815,0x3155,0x3819,0x381d,0x3823,0x3827,0x382b,0x3831,0x3837,0x383b,0x383f,0x3843,0x3847,0x3847,0x384b,0x384f, +0x315d,0x3853,0x3857,0x385b,0x385f,0x3863,0x3869,0x386d,0x2cdf,0x3873,0x3879,0x387d,0x3883,0x3889,0x388f,0x3893, +0x3175,0x3897,0x389d,0x38a3,0x38a9,0x38af,0x38b3,0x38b3,0x3179,0x31f3,0x38b7,0x38bb,0x38bf,0x38c3,0x38c9,0x2c47, +0x3181,0x38cd,0x38d1,0x3057,0x38d7,0x38dd,0x2f9f,0x38e3,0x38e7,0x3067,0x38eb,0x38ef,0x38f3,0x38f9,0x38f9,0x38ff, +0x3903,0x3907,0x390d,0x3911,0x3915,0x3919,0x391f,0x3923,0x3927,0x392b,0x392f,0x3933,0x3939,0x393d,0x3941,0x3945, +0x3949,0x394d,0x3951,0x3957,0x395d,0x3961,0x3967,0x396b,0x3971,0x3975,0x307f,0x3979,0x397f,0x3985,0x3989,0x398f, +0x3993,0x3999,0x399d,0x39a1,0x39a5,0x39a9,0x39ad,0x39b1,0x39b7,0x39bd,0x39c3,0x35ff,0x39c9,0x39cd,0x39d1,0x39d5, +0x39d9,0x39dd,0x39e1,0x39e5,0x39e9,0x39ed,0x39f1,0x39f5,0x2d27,0x39fb,0x39ff,0x3a03,0x3a07,0x3a0b,0x3a0f,0x308b, +0x3a13,0x3a17,0x3a1b,0x3a1f,0x3a23,0x3a29,0x3a2f,0x3a35,0x3a39,0x3a3d,0x3a41,0x3a45,0x3a4b,0x3a4f,0x3a55,0x3a59, +0x3a5d,0x3a63,0x3a69,0x3a6d,0x2c33,0x3a71,0x3a75,0x3a79,0x3a7d,0x3a81,0x3a85,0x319d,0x3a89,0x3a8d,0x3a91,0x3a95, +0x3a99,0x3a9d,0x3aa1,0x3aa5,0x3aa9,0x3aad,0x3ab3,0x3ab7,0x3abb,0x3abf,0x3ac3,0x3ac7,0x3acd,0x3ad3,0x3ad7,0x3adb, +0x31b1,0x31b5,0x3adf,0x3ae3,0x3ae9,0x3aed,0x3af1,0x3af5,0x3af9,0x3aff,0x3b05,0x3b09,0x3b0d,0x3b11,0x3b17,0x31b9, +0x3b1b,0x3b21,0x3b27,0x3b2b,0x3b2f,0x3b33,0x3b39,0x3b3d,0x3b41,0x3b45,0x3b49,0x3b4d,0x3b51,0x3b55,0x3b5b,0x3b5f, +0x3b63,0x3b67,0x3b6d,0x3b71,0x3b75,0x3b79,0x3b7d,0x3b83,0x3b89,0x3b8d,0x3b91,0x3b95,0x3b9b,0x3b9f,0x31d1,0x31d1, +0x3ba5,0x3ba9,0x3baf,0x3bb3,0x3bb7,0x3bbb,0x3bbf,0x3bc3,0x3bc7,0x3bcb,0x31d5,0x3bd1,0x3bd5,0x3bd9,0x3bdd,0x3be1, +0x3be5,0x3beb,0x3bef,0x3bf5,0x3bfb,0x3c01,0x3c05,0x3c09,0x3c0d,0x3c11,0x3c15,0x3c19,0x3c1d,0x3c21,1,1, +1 }; static const UCPTrie norm2_nfc_data_trie={ norm2_nfc_data_trieIndex, { norm2_nfc_data_trieData }, - 1888, 8162, + 1891, 8209, 0x2fc00, 0x30, 0, 0, 0, 0, diff --git a/deps/icu-small/source/common/norm2allmodes.h b/deps/icu-small/source/common/norm2allmodes.h index 4b30d787e87c..8d5e944f9bde 100644 --- a/deps/icu-small/source/common/norm2allmodes.h +++ b/deps/icu-small/source/common/norm2allmodes.h @@ -24,6 +24,7 @@ #include "unicode/unistr.h" #include "cpputils.h" #include "normalizer2impl.h" +#include "putilimp.h" U_NAMESPACE_BEGIN @@ -35,10 +36,10 @@ class Normalizer2WithImpl : public Normalizer2 { virtual ~Normalizer2WithImpl(); // normalize - virtual UnicodeString & - normalize(const UnicodeString &src, - UnicodeString &dest, - UErrorCode &errorCode) const override { + virtual UnicodeString& + normalize(const UnicodeString& src, + UnicodeString& dest U_LIFETIME_BOUND, + UErrorCode& errorCode) const override { if(U_FAILURE(errorCode)) { dest.setToBogus(); return dest; @@ -61,23 +62,23 @@ class Normalizer2WithImpl : public Normalizer2 { ReorderingBuffer &buffer, UErrorCode &errorCode) const = 0; // normalize and append - virtual UnicodeString & - normalizeSecondAndAppend(UnicodeString &first, - const UnicodeString &second, - UErrorCode &errorCode) const override { + virtual UnicodeString& + normalizeSecondAndAppend(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, + UErrorCode& errorCode) const override { return normalizeSecondAndAppend(first, second, true, errorCode); } - virtual UnicodeString & - append(UnicodeString &first, - const UnicodeString &second, - UErrorCode &errorCode) const override { + virtual UnicodeString& + append(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, + UErrorCode& errorCode) const override { return normalizeSecondAndAppend(first, second, false, errorCode); } - UnicodeString & - normalizeSecondAndAppend(UnicodeString &first, - const UnicodeString &second, + UnicodeString& + normalizeSecondAndAppend(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, UBool doNormalize, - UErrorCode &errorCode) const { + UErrorCode& errorCode) const { uprv_checkCanGetBuffer(first, errorCode); if(U_FAILURE(errorCode)) { return first; @@ -90,8 +91,14 @@ class Normalizer2WithImpl : public Normalizer2 { int32_t firstLength=first.length(); UnicodeString safeMiddle; { + int32_t destCapacity; + if(uprv_add32_overflow(firstLength, second.length(), &destCapacity)) { + first.setToBogus(); + errorCode=U_MEMORY_ALLOCATION_ERROR; + return first; + } ReorderingBuffer buffer(impl, first); - if(buffer.init(firstLength+second.length(), errorCode)) { + if(buffer.init(destCapacity, errorCode)) { normalizeAndAppend(secondArray, secondArray+second.length(), doNormalize, safeMiddle, buffer, errorCode); } @@ -176,8 +183,10 @@ class Normalizer2WithImpl : public Normalizer2 { } return static_cast(spanQuickCheckYes(sArray, sArray + s.length(), errorCode) - sArray); } - virtual const char16_t * - spanQuickCheckYes(const char16_t *src, const char16_t *limit, UErrorCode &errorCode) const = 0; + virtual const char16_t* + spanQuickCheckYes(const char16_t* src U_LIFETIME_BOUND, + const char16_t* limit, + UErrorCode& errorCode) const = 0; virtual UNormalizationCheckResult getQuickCheck(UChar32) const { return UNORM_YES; @@ -228,8 +237,10 @@ class DecomposeNormalizer2 : public Normalizer2WithImpl { return sLimit == impl.decomposeUTF8(0, s, sLimit, nullptr, nullptr, errorCode); } - virtual const char16_t * - spanQuickCheckYes(const char16_t *src, const char16_t *limit, UErrorCode &errorCode) const override { + virtual const char16_t* + spanQuickCheckYes(const char16_t* src U_LIFETIME_BOUND, + const char16_t* limit, + UErrorCode& errorCode) const override { return impl.decompose(src, limit, nullptr, errorCode); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. @@ -322,8 +333,10 @@ class ComposeNormalizer2 : public Normalizer2WithImpl { impl.composeQuickCheck(sArray, sArray+s.length(), onlyContiguous, &qcResult); return qcResult; } - virtual const char16_t * - spanQuickCheckYes(const char16_t *src, const char16_t *limit, UErrorCode &) const override { + virtual const char16_t* + spanQuickCheckYes(const char16_t* src U_LIFETIME_BOUND, + const char16_t* limit, + UErrorCode&) const override { return impl.composeQuickCheck(src, limit, onlyContiguous, nullptr); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. @@ -361,8 +374,10 @@ class FCDNormalizer2 : public Normalizer2WithImpl { ReorderingBuffer &buffer, UErrorCode &errorCode) const override { impl.makeFCDAndAppend(src, limit, doNormalize, safeMiddle, buffer, errorCode); } - virtual const char16_t * - spanQuickCheckYes(const char16_t *src, const char16_t *limit, UErrorCode &errorCode) const override { + virtual const char16_t* + spanQuickCheckYes(const char16_t* src U_LIFETIME_BOUND, + const char16_t* limit, + UErrorCode& errorCode) const override { return impl.makeFCD(src, limit, nullptr, errorCode); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. diff --git a/deps/icu-small/source/common/normalizer2.cpp b/deps/icu-small/source/common/normalizer2.cpp index dad3df4edee2..6d510f142512 100644 --- a/deps/icu-small/source/common/normalizer2.cpp +++ b/deps/icu-small/source/common/normalizer2.cpp @@ -29,6 +29,7 @@ #include "mutex.h" #include "norm2allmodes.h" #include "normalizer2impl.h" +#include "putilimp.h" #include "uassert.h" #include "ucln_cmn.h" @@ -84,10 +85,10 @@ Normalizer2::isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const { class NoopNormalizer2 : public Normalizer2 { virtual ~NoopNormalizer2(); - virtual UnicodeString & - normalize(const UnicodeString &src, - UnicodeString &dest, - UErrorCode &errorCode) const override { + virtual UnicodeString& + normalize(const UnicodeString& src, + UnicodeString& dest U_LIFETIME_BOUND, + UErrorCode& errorCode) const override { if(U_SUCCESS(errorCode)) { if(&dest!=&src) { dest=src; @@ -114,10 +115,10 @@ class NoopNormalizer2 : public Normalizer2 { } } - virtual UnicodeString & - normalizeSecondAndAppend(UnicodeString &first, - const UnicodeString &second, - UErrorCode &errorCode) const override { + virtual UnicodeString& + normalizeSecondAndAppend(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, + UErrorCode& errorCode) const override { if(U_SUCCESS(errorCode)) { if(&first!=&second) { first.append(second); @@ -127,10 +128,10 @@ class NoopNormalizer2 : public Normalizer2 { } return first; } - virtual UnicodeString & - append(UnicodeString &first, - const UnicodeString &second, - UErrorCode &errorCode) const override { + virtual UnicodeString& + append(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, + UErrorCode& errorCode) const override { if(U_SUCCESS(errorCode)) { if(&first!=&second) { first.append(second); @@ -203,8 +204,8 @@ const Normalizer2 *Normalizer2Factory::getNoopInstance(UErrorCode &errorCode) { return noopSingleton; } -const Normalizer2Impl * -Normalizer2Factory::getImpl(const Normalizer2 *norm2) { +const Normalizer2Impl* +Normalizer2Factory::getImpl(const Normalizer2* norm2 U_LIFETIME_BOUND) { return &((Normalizer2WithImpl *)norm2)->impl; } @@ -386,8 +387,13 @@ normalizeSecondAndAppend(const UNormalizer2 *norm2, // Avoid duplicate argument checking and support NUL-terminated src. UnicodeString safeMiddle; { + int32_t destCapacity; ReorderingBuffer buffer(n2wi->impl, firstString); - if(buffer.init(firstLength+secondLength+1, *pErrorCode)) { // destCapacity>=-1 + if(uprv_add32_overflow(firstLength, secondLength, &destCapacity) || + uprv_add32_overflow(destCapacity, 1, &destCapacity)) { + firstString.setToBogus(); + *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + } else if(buffer.init(destCapacity, *pErrorCode)) { // destCapacity>=-1 n2wi->normalizeAndAppend(second, secondLength>=0 ? second+secondLength : nullptr, doNormalize, safeMiddle, buffer, *pErrorCode); } diff --git a/deps/icu-small/source/common/normalizer2impl.cpp b/deps/icu-small/source/common/normalizer2impl.cpp index 758a84c11069..12c6f9dea8af 100644 --- a/deps/icu-small/source/common/normalizer2impl.cpp +++ b/deps/icu-small/source/common/normalizer2impl.cpp @@ -353,9 +353,16 @@ UBool ReorderingBuffer::resize(int32_t appendLength, UErrorCode &errorCode) { int32_t reorderStartIndex = static_cast(reorderStart - start); int32_t length = static_cast(limit - start); str.releaseBuffer(length); - int32_t newCapacity=length+appendLength; - int32_t doubleCapacity=2*str.getCapacity(); - if(newCapacitydefaultTZFilePtr == nullptr) { - tzInfo->defaultTZFilePtr = fopen(defaultTZFileName, "r"); - } + U_ASSERT(tzInfo->defaultTZFilePtr != nullptr); file = fopen(TZFileName, "r"); tzInfo->defaultTZPosition = 0; /* reset position to begin search */ - if (file != nullptr && tzInfo->defaultTZFilePtr != nullptr) { + if (file != nullptr) { /* First check that the file size are equal. */ if (tzInfo->defaultTZFileSize == 0) { fseek(tzInfo->defaultTZFilePtr, 0, SEEK_END); tzInfo->defaultTZFileSize = ftell(tzInfo->defaultTZFilePtr); } - fseek(file, 0, SEEK_END); + if (fseek(file, 0, SEEK_END) != 0) { + fclose(file); + return false; + } sizeFile = ftell(file); + if (sizeFile == -1) { + fclose(file); + return false; + } sizeFileLeft = sizeFile; if (sizeFile != tzInfo->defaultTZFileSize) { @@ -926,16 +930,26 @@ static UBool compareBinaryFiles(const char* defaultTZFileName, const char* TZFil * compare each byte to determine equality. */ if (tzInfo->defaultTZBuffer == nullptr) { - rewind(tzInfo->defaultTZFilePtr); + if (fseek(tzInfo->defaultTZFilePtr, 0, SEEK_SET) != 0) { + fclose(file); + return false; + } tzInfo->defaultTZBuffer = static_cast(uprv_malloc(sizeof(char) * tzInfo->defaultTZFileSize)); sizeFileRead = fread(tzInfo->defaultTZBuffer, 1, tzInfo->defaultTZFileSize, tzInfo->defaultTZFilePtr); } - rewind(file); + if (fseek(file, 0, SEEK_SET) != 0) { + fclose(file); + return false; + } while(sizeFileLeft > 0) { uprv_memset(bufferFile, 0, MAX_READ_SIZE); sizeFileToRead = sizeFileLeft < MAX_READ_SIZE ? sizeFileLeft : MAX_READ_SIZE; sizeFileRead = fread(bufferFile, 1, sizeFileToRead, file); + if (sizeFileRead == -1) { + fclose(file); + return false; + } if (memcmp(tzInfo->defaultTZBuffer + tzInfo->defaultTZPosition, bufferFile, sizeFileRead) != 0) { result = false; break; @@ -972,6 +986,11 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { char* result = nullptr; UErrorCode status = U_ZERO_ERROR; + /* There is no reference file to compare against, so do not traverse the zoneinfo tree. */ + if (tzInfo->defaultTZFilePtr == nullptr) { + return nullptr; + } + /* Save the current path */ CharString curpath(path, -1, status); if (U_FAILURE(status)) { @@ -1023,7 +1042,7 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { if (result != nullptr) break; } else { - if(compareBinaryFiles(TZDEFAULT, newpath.data(), tzInfo)) { + if(compareBinaryFiles(newpath.data(), tzInfo)) { int32_t amountToSkip = sizeof(TZZONEINFO) - 1; if (amountToSkip > newpath.length()) { amountToSkip = newpath.length(); @@ -1198,8 +1217,7 @@ uprv_tzname(int n) if (tzInfo != nullptr) { tzInfo->defaultTZBuffer = nullptr; tzInfo->defaultTZFileSize = 0; - tzInfo->defaultTZFilePtr = nullptr; - tzInfo->defaultTZstatus = false; + tzInfo->defaultTZFilePtr = fopen(TZDEFAULT, "r"); tzInfo->defaultTZPosition = 0; gTimeZoneBufferPtr = searchForTZFile(TZZONEINFO, tzInfo); @@ -1430,9 +1448,6 @@ static void U_CALLCONV dataDirectoryInitFn() { } const char *path = nullptr; -#if defined(ICU_DATA_DIR_PREFIX_ENV_VAR) - char datadir_path_buffer[PATH_MAX]; -#endif /* When ICU_NO_USER_DATA_OVERRIDE is defined, users aren't allowed to @@ -1462,6 +1477,9 @@ static void U_CALLCONV dataDirectoryInitFn() { * set their own path. */ #if defined(ICU_DATA_DIR) || defined(U_ICU_DATA_DEFAULT_DIR) +# if defined(ICU_DATA_DIR_PREFIX_ENV_VAR) + char datadir_path_buffer[PATH_MAX]; +# endif if(path==nullptr || *path==0) { # if defined(ICU_DATA_DIR_PREFIX_ENV_VAR) const char *prefix = getenv(ICU_DATA_DIR_PREFIX_ENV_VAR); diff --git a/deps/icu-small/source/common/putilimp.h b/deps/icu-small/source/common/putilimp.h index 8a8ff5008118..03f588a1a7a3 100644 --- a/deps/icu-small/source/common/putilimp.h +++ b/deps/icu-small/source/common/putilimp.h @@ -107,6 +107,8 @@ typedef size_t uintptr_t; /* not defined */ #elif U_PLATFORM == U_PF_HAIKU /* not defined */ +#elif defined(__wasi__) + /* not defined */ #else # define U_TZSET tzset #endif @@ -132,6 +134,8 @@ typedef size_t uintptr_t; /* not defined */ #elif U_PLATFORM == U_PF_IPHONE /* not defined */ +#elif defined(__wasi__) + /* not defined */ #else # define U_TIMEZONE timezone #endif @@ -147,6 +151,8 @@ typedef size_t uintptr_t; /* not defined */ #elif U_PLATFORM == U_PF_HAIKU /* not defined, (well it is but a loop back to icu) */ +#elif defined(__wasi__) + /* not defined */ #else # define U_TZNAME tzname #endif diff --git a/deps/icu-small/source/common/rbbi.cpp b/deps/icu-small/source/common/rbbi.cpp index 069af2153711..37fa28b158c7 100644 --- a/deps/icu-small/source/common/rbbi.cpp +++ b/deps/icu-small/source/common/rbbi.cpp @@ -277,7 +277,7 @@ RuleBasedBreakIterator::~RuleBasedBreakIterator() { * TODO: needs better handling of memory allocation errors. */ RuleBasedBreakIterator& -RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { +RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) U_LIFETIME_BOUND { if (this == &that) { return *this; } @@ -326,6 +326,7 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { fPosition = that.fPosition; fRuleStatusIndex = that.fRuleStatusIndex; fDone = that.fDone; + fIsPhraseBreaking = that.fIsPhraseBreaking; // TODO: both the dictionary and the main cache need to be copied. // Current position could be within a dictionary range. Trying to continue @@ -377,7 +378,8 @@ RuleBasedBreakIterator::operator==(const BreakIterator& that) const { if (!(fPosition == that2.fPosition && fRuleStatusIndex == that2.fRuleStatusIndex && - fDone == that2.fDone)) { + fDone == that2.fDone && + fIsPhraseBreaking == that2.fIsPhraseBreaking)) { return false; } @@ -429,7 +431,7 @@ void RuleBasedBreakIterator::setText(UText *ut, UErrorCode &status) { } -UText *RuleBasedBreakIterator::getUText(UText *fillIn, UErrorCode &status) const { +UText* RuleBasedBreakIterator::getUText(UText* fillIn U_LIFETIME_BOUND, UErrorCode& status) const { UText *result = utext_clone(fillIn, &fText, false, true, &status); return result; } @@ -443,7 +445,7 @@ UText *RuleBasedBreakIterator::getUText(UText *fillIn, UErrorCode &status) const * Return a CharacterIterator over the text being analyzed. */ CharacterIterator& -RuleBasedBreakIterator::getText() const { +RuleBasedBreakIterator::getText() const U_LIFETIME_BOUND { return *fCharIter; } @@ -508,7 +510,8 @@ RuleBasedBreakIterator::setText(const UnicodeString& newText) { * Intended for use with text data originating in Java (garbage collected) environments * where the data may be moved in memory at arbitrary times. */ -RuleBasedBreakIterator &RuleBasedBreakIterator::refreshInputText(UText *input, UErrorCode &status) { +RuleBasedBreakIterator& +RuleBasedBreakIterator::refreshInputText(UText* input, UErrorCode& status) U_LIFETIME_BOUND { if (U_FAILURE(status)) { return *this; } @@ -820,10 +823,6 @@ int32_t RuleBasedBreakIterator::handleNext() { mode = RBBI_RUN; - if (statetable->fFlags & RBBI_BOF_REQUIRED) { - category = 2; - mode = RBBI_START; - } // loop until we reach the end of the text or transition to state 0 @@ -1086,7 +1085,7 @@ int32_t RuleBasedBreakIterator::getRuleStatusVec( // for standard iterator types. // //------------------------------------------------------------------------------- -const uint8_t *RuleBasedBreakIterator::getBinaryRules(uint32_t &length) { +const uint8_t* RuleBasedBreakIterator::getBinaryRules(uint32_t& length) U_LIFETIME_BOUND { const uint8_t *retPtr = nullptr; length = 0; @@ -1203,8 +1202,8 @@ getLanguageBreakEngineFromFactory(UChar32 c, const char* locale) // the character c. // //------------------------------------------------------------------------------- -const LanguageBreakEngine * -RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c, const char* locale) { +const LanguageBreakEngine* +RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c, const char* locale) U_LIFETIME_BOUND { const LanguageBreakEngine *lbe = nullptr; UErrorCode status = U_ZERO_ERROR; @@ -1289,7 +1288,7 @@ void RuleBasedBreakIterator::dumpTables() { */ const UnicodeString& -RuleBasedBreakIterator::getRules() const { +RuleBasedBreakIterator::getRules() const U_LIFETIME_BOUND { if (fData != nullptr) { return fData->getRuleSourceString(); } else { diff --git a/deps/icu-small/source/common/rbbi_cache.cpp b/deps/icu-small/source/common/rbbi_cache.cpp index 3ef030cb9195..da4121210d66 100644 --- a/deps/icu-small/source/common/rbbi_cache.cpp +++ b/deps/icu-small/source/common/rbbi_cache.cpp @@ -40,6 +40,11 @@ void RuleBasedBreakIterator::DictionaryCache::reset() { fFirstRuleStatusIndex = 0; fOtherRuleStatusIndex = 0; fBreaks.removeAllElements(); + int32_t maxStatus = 0; + for (int32_t i = 0; i < fBI->fData->fStatusMaxIdx; ++i) { + maxStatus = std::max(maxStatus, fBI->fData->fRuleStatusTable[i]); + } + isWordLike = maxStatus > 100; } UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_t *result, int32_t *statusIndex) { @@ -60,7 +65,7 @@ UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_ r = fBreaks.elementAti(fPositionInCache); U_ASSERT(r > fromPos); *result = r; - *statusIndex = fOtherRuleStatusIndex; + *statusIndex = isWordLike || r == fLimit ? fOtherRuleStatusIndex : 0; return true; } @@ -70,7 +75,7 @@ UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_ r= fBreaks.elementAti(fPositionInCache); if (r > fromPos) { *result = r; - *statusIndex = fOtherRuleStatusIndex; + *statusIndex = isWordLike || r == fLimit ? fOtherRuleStatusIndex : 0; return true; } } @@ -97,7 +102,9 @@ UBool RuleBasedBreakIterator::DictionaryCache::preceding(int32_t fromPos, int32_ r = fBreaks.elementAti(fPositionInCache); U_ASSERT(r < fromPos); *result = r; - *statusIndex = ( r== fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex; + *statusIndex = (r == fStart) ? fFirstRuleStatusIndex + : isWordLike ? fOtherRuleStatusIndex + : 0; return true; } @@ -110,7 +117,9 @@ UBool RuleBasedBreakIterator::DictionaryCache::preceding(int32_t fromPos, int32_ r = fBreaks.elementAti(fPositionInCache); if (r < fromPos) { *result = r; - *statusIndex = ( r == fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex; + *statusIndex = (r == fStart) ? fFirstRuleStatusIndex + : isWordLike ? fOtherRuleStatusIndex + : 0; return true; } } diff --git a/deps/icu-small/source/common/rbbi_cache.h b/deps/icu-small/source/common/rbbi_cache.h index 597312e85c45..8ce8b4f21a67 100644 --- a/deps/icu-small/source/common/rbbi_cache.h +++ b/deps/icu-small/source/common/rbbi_cache.h @@ -64,6 +64,13 @@ class RuleBasedBreakIterator::DictionaryCache: public UMemory { // text segment being handled by the dictionary. int32_t fFirstRuleStatusIndex; // Rule status info for first boundary. int32_t fOtherRuleStatusIndex; // Rule status info for 2nd through last boundaries. + + // If `this->isWordLike`, the status of dictionary breaks is equal to the status of the final + // break of the rule-based segment they refine (fOtherRuleStatusIndex); otherwise, dictionary + // breaks have status 0. + // For compatibility, this property is determined by the largest status value used by `*fBI`: + // rules that have a largest status greater than 100 are considered word-like. + bool isWordLike; }; diff --git a/deps/icu-small/source/common/rbbidata.cpp b/deps/icu-small/source/common/rbbidata.cpp index edfa1bf0d85e..c99cd9ae85eb 100644 --- a/deps/icu-small/source/common/rbbidata.cpp +++ b/deps/icu-small/source/common/rbbidata.cpp @@ -234,10 +234,9 @@ void RBBIDataWrapper::printTable(const char *heading, const RBBIStateTable *tab RBBIDebugPrintf(" fDictCategoriesStart: %d\n", table->fDictCategoriesStart); RBBIDebugPrintf(" fLookAheadResultsSize: %d\n", table->fLookAheadResultsSize); - RBBIDebugPrintf(" Flags: %4x RBBI_LOOKAHEAD_HARD_BREAK=%s RBBI_BOF_REQUIRED=%s RBBI_8BITS_ROWS=%s\n", + RBBIDebugPrintf(" Flags: %4x RBBI_LOOKAHEAD_HARD_BREAK=%s RBBI_8BITS_ROWS=%s\n", table->fFlags, table->fFlags & RBBI_LOOKAHEAD_HARD_BREAK ? "T" : "F", - table->fFlags & RBBI_BOF_REQUIRED ? "T" : "F", table->fFlags & RBBI_8BITS_ROWS ? "T" : "F"); RBBIDebugPrintf("\nState | Acc LA TagIx"); for (c=0; cfCatCount; c++) {RBBIDebugPrintf("%3d ", c);} diff --git a/deps/icu-small/source/common/rbbidata.h b/deps/icu-small/source/common/rbbidata.h index 75c1be504560..c264a4156ce6 100644 --- a/deps/icu-small/source/common/rbbidata.h +++ b/deps/icu-small/source/common/rbbidata.h @@ -59,7 +59,7 @@ ubrk_swap(const UDataSwapper *ds, U_NAMESPACE_BEGIN // The current RBBI data format version. -static const uint8_t RBBI_DATA_FORMAT_VERSION[] = {6, 0, 0, 0}; +static const uint8_t RBBI_DATA_FORMAT_VERSION[] = {7, 0, 0, 0}; /* * The following structs map exactly onto the raw data from ICU common data file. @@ -148,7 +148,8 @@ struct RBBIStateTable { }; constexpr uint32_t RBBI_LOOKAHEAD_HARD_BREAK = 1; -constexpr uint32_t RBBI_BOF_REQUIRED = 2; +// No longer used since ICU 79: +// constexpr uint32_t RBBI_BOF_REQUIRED = 2; constexpr uint32_t RBBI_8BITS_ROWS = 4; diff --git a/deps/icu-small/source/common/rbbirb.cpp b/deps/icu-small/source/common/rbbirb.cpp index 4fd789970cc0..56b742ee5c63 100644 --- a/deps/icu-small/source/common/rbbirb.cpp +++ b/deps/icu-small/source/common/rbbirb.cpp @@ -337,13 +337,15 @@ RBBIDataHeader *RBBIRuleBuilder::build(UErrorCode &status) { void RBBIRuleBuilder::optimizeTables() { bool didSomething; + fForwardTable->minimizeLookaheads(); do { didSomething = false; // Begin looking for duplicates with char class 3. - // Classes 0, 1 and 2 are special; they are unused, {bof} and {eof} respectively, - // and should not have other categories merged into them. - IntPair duplPair = {3, 0}; + // Class 0 is unused and should not have other categories merged into + // it. We allow merging categories *into* class 1 {eof} (but not the + // reverse, so that eof remains in class 1). + IntPair duplPair = {1, 0}; while (fForwardTable->findDuplCharClassFrom(&duplPair)) { fSetBuilder->mergeCategories(duplPair); fForwardTable->removeColumn(duplPair.second); diff --git a/deps/icu-small/source/common/rbbirb.h b/deps/icu-small/source/common/rbbirb.h index 96d3aa643dd1..1dd1ea43523d 100644 --- a/deps/icu-small/source/common/rbbirb.h +++ b/deps/icu-small/source/common/rbbirb.h @@ -65,15 +65,10 @@ class RBBISymbolTable : public UMemory, public SymbolTable { UHashtable *fHashTable; RBBIRuleScanner *fRuleScanner; - // These next two fields are part of the mechanism for passing references to - // already-constructed UnicodeSets back to the UnicodeSet constructor - // when the pattern includes $variable references. - const UnicodeString ffffString; // = "/uffff" - UnicodeSet *fCachedSetLookup; - public: // API inherited from class SymbolTable virtual const UnicodeString* lookup(const UnicodeString& s) const override; + virtual const UnicodeSet* lookupSet(const UnicodeString& s) const override; virtual const UnicodeFunctor* lookupMatcher(UChar32 ch) const override; virtual UnicodeString parseReference(const UnicodeString& text, ParsePosition& pos, int32_t limit) const override; @@ -91,7 +86,7 @@ class RBBISymbolTable : public UMemory, public SymbolTable { // A do-nothing inline function for non-debug builds. Member funcs can't be empty // or the call sites won't compile. int32_t fFakeField; - #define rbbiSymtablePrint() fFakeField=0; + #define rbbiSymtablePrint() fFakeField=0; #endif private: @@ -220,7 +215,7 @@ typedef std::pair IntPair; #define RBBIDebugPrintf printf #define RBBIDebugPuts puts #else -#undef RBBIDebugPrintf +#undef RBBIDebugPrintf #define RBBIDebugPuts(arg) #endif diff --git a/deps/icu-small/source/common/rbbiscan.cpp b/deps/icu-small/source/common/rbbiscan.cpp index d3aa32fd6ed7..0ae80cb6fcd6 100644 --- a/deps/icu-small/source/common/rbbiscan.cpp +++ b/deps/icu-small/source/common/rbbiscan.cpp @@ -1258,7 +1258,7 @@ void RBBIRuleScanner::scanSet() { // Use tempSet to handle the case that the UnicodeSet contains // only string element, such as [{ab}] and treat it as empty set. tempSet.removeAllStrings(); - if (tempSet.isEmpty()) { + if (tempSet.isEmpty() && !uset->contains(UnicodeString::readOnlyAlias(u"eof"))) { // This set is empty. // Make it an error, because it almost certainly is not what the user wanted. // Also, avoids having to think about corner cases in the tree manipulation code diff --git a/deps/icu-small/source/common/rbbisetb.cpp b/deps/icu-small/source/common/rbbisetb.cpp index b6e9f745e4f1..5580ede56b84 100644 --- a/deps/icu-small/source/common/rbbisetb.cpp +++ b/deps/icu-small/source/common/rbbisetb.cpp @@ -60,7 +60,6 @@ RBBISetBuilder::RBBISetBuilder(RBBIRuleBuilder *rb) fTrie = nullptr; fTrieSize = 0; fGroupCount = 0; - fSawBOF = false; } @@ -240,16 +239,12 @@ void RBBISetBuilder::buildRanges() { // Handle input sets that contain the special string {eof}. // Column 1 of the state table is reserved for EOF on input. - // Column 2 is reserved for before-the-start-input. - // (This column can be optimized away later if there are no rule - // references to {bof}.) - // Add this column value (1 or 2) to the equivalent expression + // Add this column value (1) to the equivalent expression // subtree for each UnicodeSet that contains the string {eof} - // Because {bof} and {eof} are not characters in the normal sense, - // they don't affect the computation of the ranges or TRIE. + // Because {eof} is not a character in the normal sense, + // it doesn’t affect the computation of ranges or TRIE. UnicodeString eofString(u"eof"); - UnicodeString bofString(u"bof"); for (ni=0; ; ni++) { // Loop over each of the UnicodeSets encountered in the input rules usetNode = static_cast(this->fRB->fUSetNodes->elementAt(ni)); if (usetNode==nullptr) { @@ -259,10 +254,6 @@ void RBBISetBuilder::buildRanges() { if (inputSet->contains(eofString)) { addValToSet(usetNode, 1); } - if (inputSet->contains(bofString)) { - addValToSet(usetNode, 2); - fSawBOF = true; - } } @@ -432,16 +423,6 @@ int32_t RBBISetBuilder::getDictCategoriesStart() const { } -//------------------------------------------------------------------------ -// -// sawBOF -// -//------------------------------------------------------------------------ -UBool RBBISetBuilder::sawBOF() const { - return fSawBOF; -} - - //------------------------------------------------------------------------ // // getFirstChar Given a runtime RBBI character category, find diff --git a/deps/icu-small/source/common/rbbisetb.h b/deps/icu-small/source/common/rbbisetb.h index 2c7e82ca194f..e75c0bd367d7 100644 --- a/deps/icu-small/source/common/rbbisetb.h +++ b/deps/icu-small/source/common/rbbisetb.h @@ -96,8 +96,7 @@ class RBBISetBuilder : public UMemory { int32_t getTrieSize() /*const*/; // Size in bytes of the serialized Trie. void serializeTrie(uint8_t *where); // write out the serialized Trie. UChar32 getFirstChar(int32_t val) const; - UBool sawBOF() const; // Indicate whether any references to the {bof} pseudo - // character were encountered. + /** * Merge two character categories that have been identified as having equivalent behavior. * The ranges belonging to the second category (table column) will be added to the first. @@ -132,8 +131,6 @@ class RBBISetBuilder : public UMemory { // If there are no Dictionary categories, set to the last category + 1. int32_t fDictCategoriesStart; - UBool fSawBOF; - RBBISetBuilder(const RBBISetBuilder &other) = delete; // forbid copying of this class RBBISetBuilder &operator=(const RBBISetBuilder &other) = delete; // forbid copying of this class }; diff --git a/deps/icu-small/source/common/rbbistbl.cpp b/deps/icu-small/source/common/rbbistbl.cpp index 27f31a9d552c..c100615114f7 100644 --- a/deps/icu-small/source/common/rbbistbl.cpp +++ b/deps/icu-small/source/common/rbbistbl.cpp @@ -41,11 +41,10 @@ U_CDECL_END U_NAMESPACE_BEGIN RBBISymbolTable::RBBISymbolTable(RBBIRuleScanner *rs, const UnicodeString &rules, UErrorCode &status) - : fRules(rules), fRuleScanner(rs), ffffString(static_cast(0xffff)) + : fRules(rules), fRuleScanner(rs) { fHashTable = nullptr; - fCachedSetLookup = nullptr; - + fHashTable = uhash_open(uhash_hashUnicodeString, uhash_compareUnicodeString, nullptr, &status); // uhash_open checks status if (U_FAILURE(status)) { @@ -71,60 +70,47 @@ RBBISymbolTable::~RBBISymbolTable() // const UnicodeString *RBBISymbolTable::lookup(const UnicodeString& s) const { - RBBISymbolTableEntry *el; - RBBINode *varRefNode; - RBBINode *exprNode; - RBBINode *usetNode; - const UnicodeString *retString; - RBBISymbolTable *This = const_cast(this); // cast off const - - el = static_cast(uhash_get(fHashTable, &s)); + const RBBISymbolTableEntry* const el = + static_cast(uhash_get(fHashTable, &s)); if (el == nullptr) { return nullptr; } + const RBBINode& exprNode = *el->val->fLeftChild; // Root node of expression for variable + // Return the original source string for the expression. + // Note that for set-valued variables used in UnicodeSet expressions, this would be rejected by + // the UnicodeSet parser if the source itself contains variable references. For instance, with + // $CaseIgnorable = [[:Mn:][:Me:][:Cf:][:Lm:][:Sk:] \u0027 \u00AD \u2019]; + // $Cased = [[:Upper_Case:][:Lower_Case:][:Lt:] - $CaseIgnorable]; + // If lookupSet were not overridden, when parsing the right-hand side of + // $NotCased = [[^ $Cased] - $CaseIgnorable]; + // there would be a call to lookup("Cased") which would return + // "[[:Upper_Case:][:Lower_Case:][:Lt:]-$CaseIgnorable]". This contains a variable, which is + // disallowed by the UnicodeSet parser inside a variable expansion. + // However, set-valued variables are pre-parsed, and returned by lookupSet instead, so this call + // to lookup() never happens; instead, lookupSet("CaseIgnorable") is called when computing + // $Cased and returns the non-null value of $CaseIgnorable, and then when computing $NotCased, + // lookupSet("Cased") returns the value computed for $Cased. + return &exprNode.fText; +} - varRefNode = el->val; - exprNode = varRefNode->fLeftChild; // Root node of expression for variable - if (exprNode->fType == RBBINode::setRef) { - // The $variable refers to a single UnicodeSet - // return the ffffString, which will subsequently be interpreted as a - // stand-in character for the set by RBBISymbolTable::lookupMatcher() - usetNode = exprNode->fLeftChild; - This->fCachedSetLookup = usetNode->fInputSet; - retString = &ffffString; +const UnicodeSet* RBBISymbolTable::lookupSet(const UnicodeString& s) const { + const RBBISymbolTableEntry* const el = static_cast(uhash_get(fHashTable, &s)); + if (el == nullptr) { + return nullptr; } - else - { - // The variable refers to something other than just a set. - // return the original source string for the expression - retString = &exprNode->fText; - This->fCachedSetLookup = nullptr; + const RBBINode& exprNode = *el->val->fLeftChild; + if (exprNode.fType == RBBINode::setRef) { + return exprNode.fLeftChild->fInputSet; + } else { + return nullptr; } - return retString; } -// -// RBBISymbolTable::lookupMatcher This function from the abstract symbol table -// interface maps a single stand-in character to a -// pointer to a Unicode Set. The Unicode Set code uses this -// mechanism to get all references to the same $variable -// name to refer to a single common Unicode Set instance. -// -// This implementation cheats a little, and does not maintain a map of stand-in chars -// to sets. Instead, it takes advantage of the fact that the UnicodeSet -// constructor will always call this function right after calling lookup(), -// and we just need to remember what set to return between these two calls. -const UnicodeFunctor *RBBISymbolTable::lookupMatcher(UChar32 ch) const -{ - UnicodeSet *retVal = nullptr; - RBBISymbolTable *This = const_cast(this); // cast off const - if (ch == 0xffff) { - retVal = fCachedSetLookup; - This->fCachedSetLookup = nullptr; - } - return retVal; +// No longer used, see ICU-23297. +const UnicodeFunctor* RBBISymbolTable::lookupMatcher(UChar32 /*ch*/) const { + return nullptr; } // diff --git a/deps/icu-small/source/common/rbbitblb.cpp b/deps/icu-small/source/common/rbbitblb.cpp index 034d7fbf6d8b..44d9b3d7b017 100644 --- a/deps/icu-small/source/common/rbbitblb.cpp +++ b/deps/icu-small/source/common/rbbitblb.cpp @@ -10,6 +10,7 @@ // rbbitblb.cpp // +#include #include "unicode/utypes.h" @@ -28,6 +29,53 @@ U_NAMESPACE_BEGIN +namespace { + +// Given the `RBBITableBuilder::fDStates` vector of `RBBIStateDescriptor`s, returns +// true if a state for which `isSink` returns true is reachable from state `source` by following +// transitions without going through any state for which `excludedState` returns true. +// Note that “going through” is distinct from “reaching”, and means entering and then leaving: A +// state can be both a sink and excluded, and can still be reachable. +bool reachableByTransitions(const UVector &states, const int32_t source, + const std::function isSink, + const std::function excludedState, UErrorCode &status) { + UStack boundary(status); + { + UVector32 &transitionsFromSource = + *static_cast(states.elementAt(source))->fDtran; + // We do not initialize boundary to `{source}`, but instead to the set of states one + // transition away from `source`; if `source` sets lookahead l and accepts lookahead k, we + // only need k and l to occupy distinct slots if there is a `source`-to-`source` path. + for (int32_t symbol = 0; symbol < transitionsFromSource.size(); ++symbol) { + const int32_t state = transitionsFromSource.elementAti(symbol); + if (state != 0) { + boundary.push(state, status); + } + } + } + const auto visited = prv::make_unique(states.size(), status); + while (U_SUCCESS(status) && !boundary.empty()) { + const int32_t s = boundary.popi(); + if (isSink(s)) { + return true; + } + if (excludedState(s) || visited[s]) { + continue; + } + visited[s] = true; + UVector32 &transitions = *static_cast(states.elementAt(s))->fDtran; + for (int32_t symbol = 0; symbol < transitions.size(); ++symbol) { + const int32_t t = transitions.elementAti(symbol); + if (t != 0 && !visited[t]) { + boundary.push(t, status); + } + } + } + return false; +} + +} // namespace + const int32_t kMaxStateFor8BitsTable = 255; RBBITableBuilder::RBBITableBuilder(RBBIRuleBuilder *rb, RBBINode **rootNode, UErrorCode &status) : @@ -92,38 +140,6 @@ void RBBITableBuilder::buildForwardTable() { } #endif - // - // If the rules contained any references to {bof} - // add a {bof} to the - // tree. Means that all matches must start out with the - // {bof} fake character. - // - if (fRB->fSetBuilder->sawBOF()) { - RBBINode *bofTop = new RBBINode(RBBINode::opCat, *fStatus); - if (bofTop == nullptr) { - *fStatus = U_MEMORY_ALLOCATION_ERROR; - } - if (U_FAILURE(*fStatus)) { - delete bofTop; - return; - } - RBBINode *bofLeaf = new RBBINode(RBBINode::leafChar, *fStatus); - // Delete and exit if memory allocation failed. - if (bofLeaf == nullptr) { - *fStatus = U_MEMORY_ALLOCATION_ERROR; - } - if (U_FAILURE(*fStatus)) { - delete bofLeaf; - delete bofTop; - return; - } - bofTop->fLeftChild = bofLeaf; - bofTop->fRightChild = fTree; - bofLeaf->fParent = bofTop; - bofLeaf->fVal = 2; // Reserved value for {bof}. - fTree = bofTop; - } - // // Add a unique right-end marker to the expression. // Appears as a cat-node, left child being the original tree, @@ -157,6 +173,9 @@ void RBBITableBuilder::buildForwardTable() { // expression. // fTree->flattenSets(*fStatus, 0); + if (U_FAILURE(*fStatus)) { + return; + } #ifdef RBBI_DEBUG if (fRB->fDebugEnv && uprv_strstr(fRB->fDebugEnv, "stree")) { RBBIDebugPuts("\nParse tree after flattening Unicode Set references."); @@ -188,13 +207,6 @@ void RBBITableBuilder::buildForwardTable() { calcChainedFollowPos(fTree, endMarkerNode); } - // - // BOF (start of input) test fixup. - // - if (fRB->fSetBuilder->sawBOF()) { - bofFixup(); - } - // // Build the DFA state transition tables. // @@ -561,7 +573,7 @@ void RBBITableBuilder::bofFixup() { // transition tables for these states, by the algorithm // of fig. 3.44 in Aho. // -// Most of the comments are quotes of Aho's psuedo-code. +// Most of the comments are quotes of Aho's pseudo-code. // //----------------------------------------------------------------------------- void RBBITableBuilder::buildStateTable() { @@ -1001,6 +1013,247 @@ void RBBITableBuilder::mergeRuleStatusVals() { +//----------------------------------------------------------------------------- +// +// minimizeStates Minimize the number of states of the DFA, by Algorithm +// 3.6 in Aho. The one twist is that instead of starting +// from a partition in two groups (accepting and non- +// accepting states), we partition according to all +// relevant properties of the states, namely the values of: +// - fAccepting—which may be non-accepting, +// unconditionally accepting, or the index of a +// lookahead—; +// - fLookAhead; +// - fTagsIdx. +// +//----------------------------------------------------------------------------- + +void RBBITableBuilder::minimizeStates() { + if (U_FAILURE(*fStatus)) { + return; + } + +#if UPRV_HAS_SANITIZER + if (fDStates->size() > 512) { + // This algorithm is sluggish on large state machines, and even more sluggish with + // sanitizers, which leads the fuzzer into the weeds, see + // https://github.com/unicode-org/icu/pull/3948#issuecomment-4335461360. + *fStatus = U_REGEX_PATTERN_TOO_BIG; + return; + } +#endif + struct StateType { + uint32_t fAccepting; + uint32_t fLookAhead; + int32_t fTagsIdx; + bool operator==(StateType const &other) const { + return fAccepting == other.fAccepting && + fLookAhead == other.fLookAhead && + fTagsIdx == other.fTagsIdx; + } + }; + // We wrap `UVector`s in `unique_ptr``s throughout so we can move them, + // including into `UVector`s (by releasing them from the `unique_ptr` + // and having the enclosing `UVector` adopt them). + // Group the states by types (but we have no maps so this is verbose). + // If there are no lookaheads and no tags, there are only two types + // (accepting and non-accepting) in which case this is exactly step 1 + // of Algorithm 3.6. + struct TypeToStates : UMemory { + TypeToStates(const StateType &type, UErrorCode &status) + : type(type), states(prv::make_unique(status, status)) {} + StateType type; + prv::unique_ptr states; + }; + UVector initialPartition(*fStatus); + initialPartition.setDeleter( + [](void *p) { delete static_cast(p); }); + for (int32_t i = 0; i < fDStates->size(); ++i) { + const RBBIStateDescriptor &state = + *static_cast(fDStates->elementAt(i)); + const StateType type{state.fAccepting, + state.fLookAhead, + state.fTagsIdx}; + int32_t j = 0; + for (; j < initialPartition.size(); ++j) { + auto &[type_j, states] = + *static_cast(initialPartition.elementAt(j)); + if (type_j == type) { + states->addElement(i, *fStatus); + break; + } + } + if (j == initialPartition.size()) { + auto newEntry = prv::make_unique(type, *fStatus, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } + newEntry->states->addElement(i, *fStatus); + initialPartition.adoptElement(newEntry.release(), *fStatus); + } + } + // The partition Π from Algorithm 3.6. + // (We could call it Π, but some member companies that integrate the ICU + // code base prohibit non-ASCII identifiers…). + auto partition = prv::make_unique(*fStatus, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } + partition->setDeleter( + [](void *p) { delete static_cast(p); }); + + for (int32_t i = 0; i < initialPartition.size(); ++i) { + partition->adoptElement( + static_cast(initialPartition.elementAt(i))->states.release(), + *fStatus); + } + // Given the index of a state 𝑠 in `fDStates`, returns a UVector of integers + // σ(𝑠) such that 𝑠.fDtran[i] (the index of the state reached by the + // transition from 𝑠 on the character class with index i) is in Π[σ(𝑠)[i]]. + // We then have σ(𝑠) == σ(𝑡) if and only if “for all input symbols 𝑎, states + // 𝑠 and 𝑡 have transitions on 𝑎 to states in the same group of Π” (which is + // what defines the refinement of 𝐺 in Fig. 3.45). + auto partition_signature = [&partition, this](int32_t stateIndex) -> prv::unique_ptr { + const RBBIStateDescriptor &state = + *static_cast(fDStates->elementAt(stateIndex)); + auto result = prv::make_unique(state.fDtran->size(), *fStatus, *fStatus); + if (U_FAILURE(*fStatus)) { + return nullptr; + } + for (int32_t i = 0; i < state.fDtran->size(); ++i) { + int32_t toState = state.fDtran->elementAti(i); + for (int32_t partIndex = 0; partIndex < partition->size(); ++partIndex) { + const UVector &part = *static_cast(partition->elementAt(partIndex)); + if (part.contains(toState)) { + result->addElement(partIndex, *fStatus); + break; + } + } + } + result->setComparer([](const UElement left, const UElement right) -> UBool { + return left.integer == right.integer; + }); + return result; + }; + // The loop between steps 2. and 3. of Algorithm 3.6. + for (;;) { + // Π_new. + auto partitionNew = prv::make_unique(*fStatus, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } + partitionNew->setDeleter( + [](void *p) { delete static_cast(p); }); + // The procedure from Figure 3.45, Construction of Π_new. + bool refined = false; + for (int32_t i = 0; i < partition->size(); ++i) { + // Group 𝐺 in Π (=`partition`). + const UVector &group = *static_cast(partition->elementAt(i)); + // Partition 𝐺 based on the signature, see above. + struct SignatureToStates : UMemory { + SignatureToStates(prv::unique_ptr signature, UErrorCode &status) + : signature(std::move(signature)), states(prv::make_unique(status, status)) { + } + prv::unique_ptr signature; + prv::unique_ptr states; + }; + UVector groupRefinement(*fStatus); + groupRefinement.setDeleter([](void *p) { delete static_cast(p); }); + for (int32_t j = 0; j < group.size(); ++j) { + // Index of a state in the group. + const int32_t s = group.elementAti(j); + auto signature = partition_signature(s); + int32_t k = 0; + for (; k < groupRefinement.size(); ++k) { + const auto &[subgroupSignature, subgroup] = + *static_cast(groupRefinement.elementAt(k)); + if (*subgroupSignature == *signature) { + subgroup->addElement(s, *fStatus); + break; + } + } + if (k == groupRefinement.size()) { + const auto newEntry = + new SignatureToStates(std::move(signature), *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } + if (newEntry == nullptr) { + *fStatus = U_MEMORY_ALLOCATION_ERROR; + return; + } + newEntry->states->addElement(s, *fStatus); + groupRefinement.adoptElement(newEntry, *fStatus); + } + } + refined |= groupRefinement.size() > 1; + for (int32_t j = 0; j < groupRefinement.size(); ++j) { + auto &[_, subgroup] = *static_cast( + groupRefinement.elementAt(j)); + partitionNew->adoptElement(subgroup.release(), *fStatus); + } + } + if (refined) { + partition = std::move(partitionNew); + } else { + break; + } + } + // We will use the indices in `partition` as the new state indices. Make + // sure that the start (1) and stop (0) states remain in their correct + // places; everything else can merrily be scrambled. + for (int i = 0; i < partition->size(); ++i) { + UVector *const part_i = static_cast(partition->elementAt(i)); + if (part_i->contains(0)) { + void *const part_0 = partition->elementAt(0); + // No swap on UVector, so we briefly remove the deleter. + const auto deleter = partition->setDeleter(nullptr); + partition->setElementAt(part_i, 0); + partition->setElementAt(part_0, i); + partition->setDeleter(deleter); + } else if (part_i->contains(1)) { + void *const part_1 = partition->elementAt(1); + const auto deleter = partition->setDeleter(nullptr); + partition->setElementAt(part_i, 1); + partition->setElementAt(part_1, i); + partition->setDeleter(deleter); + } + } + if (U_FAILURE(*fStatus)) { + return; + } + auto oldStateToPart = prv::make_unique_for_overwrite(fDStates->size(), *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } + for (int i = 0; i < partition->size(); ++i) { + const UVector &part = *static_cast(partition->elementAt(i)); + for (int j = 0; j < part.size(); ++j) { + oldStateToPart[part.elementAti(j)] = i; + } + } + auto const oldStates = prv::unique_ptr(fDStates); + fDStates = prv::make_unique(*fStatus, *fStatus).release(); + if (U_FAILURE(*fStatus)) { + return; + } + for (int i = 0; i < partition->size(); ++i) { + const UVector &part = *static_cast(partition->elementAt(i)); + RBBIStateDescriptor *const state = + static_cast(oldStates->elementAt(part.elementAti(0))); + fDStates->addElement(state, *fStatus); + for (int j = 0; j < state->fDtran->size(); ++j) { + state->fDtran->setElementAt(oldStateToPart[state->fDtran->elementAti(j)], j); + } + oldStates->setElementAt(nullptr, part.elementAti(0)); + } + oldStates->setDeleter([](void *p) { delete static_cast(p); }); +} + + + + + //----------------------------------------------------------------------------- @@ -1196,41 +1449,6 @@ void RBBITableBuilder::removeColumn(int32_t column) { } } -/* - * findDuplicateState - */ -bool RBBITableBuilder::findDuplicateState(IntPair *states) { - int32_t numStates = fDStates->size(); - int32_t numCols = fRB->fSetBuilder->getNumCharCategories(); - - for (; states->firstfirst++) { - RBBIStateDescriptor* firstSD = static_cast(fDStates->elementAt(states->first)); - for (states->second=states->first+1; states->secondsecond++) { - RBBIStateDescriptor* duplSD = static_cast(fDStates->elementAt(states->second)); - if (firstSD->fAccepting != duplSD->fAccepting || - firstSD->fLookAhead != duplSD->fLookAhead || - firstSD->fTagsIdx != duplSD->fTagsIdx) { - continue; - } - bool rowsMatch = true; - for (int32_t col=0; col < numCols; ++col) { - int32_t firstVal = firstSD->fDtran->elementAti(col); - int32_t duplVal = duplSD->fDtran->elementAti(col); - if (!((firstVal == duplVal) || - ((firstVal == states->first || firstVal == states->second) && - (duplVal == states->first || duplVal == states->second)))) { - rowsMatch = false; - break; - } - } - if (rowsMatch) { - return true; - } - } - } - return false; -} - bool RBBITableBuilder::findDuplicateSafeState(IntPair *states) { int32_t numStates = fSafeTable->size(); @@ -1259,34 +1477,6 @@ bool RBBITableBuilder::findDuplicateSafeState(IntPair *states) { return false; } - -void RBBITableBuilder::removeState(IntPair duplStates) { - const int32_t keepState = duplStates.first; - const int32_t duplState = duplStates.second; - U_ASSERT(keepState < duplState); - U_ASSERT(duplState < fDStates->size()); - - RBBIStateDescriptor* duplSD = static_cast(fDStates->elementAt(duplState)); - fDStates->removeElementAt(duplState); - delete duplSD; - - int32_t numStates = fDStates->size(); - int32_t numCols = fRB->fSetBuilder->getNumCharCategories(); - for (int32_t state=0; state(fDStates->elementAt(state)); - for (int32_t col=0; colfDtran->elementAti(col); - int32_t newVal = existingVal; - if (existingVal == duplState) { - newVal = keepState; - } else if (existingVal > duplState) { - newVal = existingVal - 1; - } - sd->fDtran->setElementAt(newVal, col); - } - } -} - void RBBITableBuilder::removeSafeState(IntPair duplStates) { const int32_t keepState = duplStates.first; const int32_t duplState = duplStates.second; @@ -1317,15 +1507,160 @@ void RBBITableBuilder::removeSafeState(IntPair duplStates) { * RemoveDuplicateStates */ int32_t RBBITableBuilder::removeDuplicateStates() { - IntPair dupls = {3, 0}; - int32_t numStatesRemoved = 0; + const int32_t oldStateCount = fDStates->size(); + minimizeStates(); + return fDStates->size() - oldStateCount; +} + + +/* + * Minimizes the number of slots used by the lookaheads. + * + * When the state machine is first generated, every lookahead rule occupies a different slot, for instance, + * given + * x / z; # Lookahead 1 below. + * y / z; # Lookahead 2 below. + * [xyz]*; + * the following state machine is produced, + * x + * x ⮏ z + * → 𝑠₁ → 𝑎₁ + * START x⇅y + * ↻z → 𝑠₂ → 𝑎₂ + * y ↻ z + * y + * + * where 𝑠ᵢ sets the current position for lookahead i (assigning pᵢ=p_current), and 𝑎ᵢ accepts + * lookahead i if set, i.e., on state 𝑎ᵢ,the break iterator returns pᵢ if set. Because they accept + * different lookaheads, states 𝑎₁ and 𝑎₂ are distinct in the initial partition constructed by + * `minimizeStates`, and cannot be merged, and the state machine cannot be simplified. + * + * However, there is no need for lookaheads 1 and 2 to occupy different slots, i.e., there is no + * need for the state machine to separately store the positions set by 𝑠₁ and 𝑠₂ (for p₁ and p₂ to + * be distinct variables). Indeed, if state 𝑠₁ is encountered, state 𝑎₂ cannot be reached without + * going through state 𝑠₂, and vice versa, so if p₁ and p₂ are backed by the same variable p, the + * value set by p=p₁=p_current on 𝑠₁ will have been overriden by p=p₂=p_current on 𝑠₂, so that the + * p₁-p₂ merger has no effect. + * + * If the lookaheads are merged, states 𝑎₁ and 𝑎₂ are no longer initially distinct in + * `minimizeStates` (they both accept the only lookahead), and indeed the whole state machine + * simplifies to + * [xy] z + * START → 𝑠 → 𝑎 + * ↻z ↻ + * [xy] + * + * Lookaheads i and j can be merged if: + * 1. From any state that sets lookahead i, no state that accepts lookahead j can be reached without + * going through a state that sets lookahead j; and + * 2. From any state that sets lookahead j, no state that accepts lookahead i can be reached without + * going through a state that sets lookahead i. + * This reachability relation defines a directed graph of lookaheads, and an optimal merging of + * lookaheads is then a colouring of that graph. (In the example above, the graph of lookaheads has + * no edges, and is thus 1-colourable; more interesting examples can be found in the test + * TestLookaheadPolychromy.) + * + * This function first computes the adjacency matrix of lookahead reachability, and then colours the + * graph of lookaheads and reassigns lookahead slots accordingly. + */ +void RBBITableBuilder::minimizeLookaheads() { + if (fLASlotsInUse == ACCEPTING_UNCONDITIONAL) { + return; + } + const int32_t lookaheadCount = fLASlotsInUse - ACCEPTING_UNCONDITIONAL; + // The last lookahead is fLASlotsInUse. + const int32_t firstLookahead = ACCEPTING_UNCONDITIONAL + 1; + const auto stateDescriptor = [this](const int32_t state) -> RBBIStateDescriptor & { + return *static_cast(fDStates->elementAt(state)); + }; + + const auto lookaheadReachability = + prv::make_unique(lookaheadCount * lookaheadCount, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } + for (int32_t l = firstLookahead; l <= fLASlotsInUse; ++l) { + for (int32_t k = firstLookahead; k <= fLASlotsInUse; ++k) { + if (k != l) { + for (int32_t source = 1; source < fDStates->size(); ++source) { + if (static_cast(stateDescriptor(source).fLookAhead) != l) { + continue; + } + if (reachableByTransitions( + *fDStates, source, /*isSink=*/ + [&](const int32_t state) { + return static_cast(stateDescriptor(state).fAccepting) == k; + }, + /*excludedState=*/ + [&](const int32_t state) { + return static_cast(stateDescriptor(state).fLookAhead) == k; + }, + *fStatus)) { + lookaheadReachability[(l - firstLookahead) * lookaheadCount + k - + firstLookahead] = true; + } + } + } + } + } - while (findDuplicateState(&dupls)) { - // printf("Removing duplicate states (%d, %d)\n", dupls.first, dupls.second); - removeState(dupls); - ++numStatesRemoved; + const auto colours = prv::make_unique_for_overwrite(lookaheadCount, *fStatus); + if (U_FAILURE(*fStatus)) { + return; + } + // Brute-force colouring: the number of lookaheads is in practice small, and the chromatic + // number is in practice 1, so this usually terminates in one iteration of the first two loops. + // Of course the worst case is exponential, but exponentials are everywhere in regular + // expressions anyway. + // The outer loop terminates after at most `lookaheadCount` iterations + // (when the chromatic number equals the number of lookaheads being coloured). + for (int32_t chromaticNumber = 1;; ++chromaticNumber) { + uprv_memset(colours.get(), 0, sizeof(int32_t) * lookaheadCount); + // This loop terminates after at most chromaticNumber ** lookaheadCount iterations. + for (;;) { + // Here `source` and `sink` correspond to lookaheads, not states. + for (int source = 0; source < lookaheadCount; ++source) { + for (int sink = 0; sink < lookaheadCount; ++sink) { + if (lookaheadReachability[source * lookaheadCount + sink] && + colours[source] == colours[sink]) { + goto nextColouring; + } + } + } + + // We have found a valid colouring of the graph of lookaheads. Assign lookahead slots + // accordingly. + for (int i = 0; i < fDStates->size(); ++i) { + if (stateDescriptor(i).fAccepting > ACCEPTING_UNCONDITIONAL) { + stateDescriptor(i).fAccepting = + firstLookahead + + colours[stateDescriptor(i).fAccepting - firstLookahead]; + } + if (stateDescriptor(i).fLookAhead != 0) { + stateDescriptor(i).fLookAhead = + ACCEPTING_UNCONDITIONAL + 1 + + colours[stateDescriptor(i).fLookAhead - firstLookahead]; + } + } + fLASlotsInUse = ACCEPTING_UNCONDITIONAL + chromaticNumber; + return; + + nextColouring: + // Increment the colour of the first lookahead, and then carry if we reach + // `chromaticNumber` (which is one more than the greatest colour). + ++colours[0]; + for (int32_t i = 0; i < lookaheadCount - 1 && colours[i] == chromaticNumber; + ++i) { + colours[i] = 0; + ++colours[i + 1]; + } + if (colours[lookaheadCount - 1] == chromaticNumber) { + // We tried all assignments of colours in {0, …, chromaticNumber - 1}, + // we need more colours. + break; + } + } } - return numStatesRemoved; } @@ -1399,9 +1734,6 @@ void RBBITableBuilder::exportTable(void *where) { if (fRB->fLookAheadHardBreak) { table->fFlags |= RBBI_LOOKAHEAD_HARD_BREAK; } - if (fRB->fSetBuilder->sawBOF()) { - table->fFlags |= RBBI_BOF_REQUIRED; - } for (state=0; statefNumStates; state++) { RBBIStateDescriptor* sd = static_cast(fDStates->elementAt(state)); @@ -1442,8 +1774,15 @@ void RBBITableBuilder::buildSafeReverseTable(UErrorCode &status) { // 1. Identify pairs of character classes that are "safe." Safe means that boundaries // following the pair do not depend on context or state before the pair. To test // whether a pair is safe, run it through the main forward state table, starting - // from each state. If the final state is the same, no matter what the starting state, - // the pair is safe. + // from each possible configuration. If the final configuration is the same, no matter what the + // starting configuration, the pair is safe. + // Note that the configuration includes not only the state, but also the last accepting position + // and the lookaheads. Some differences in final lookaheads can be ignored when it can be shown + // that they do not affect breaks after the pair: this happens when we come back out of the pair + // with a matching configuration when the lookahead matches. + // TODO(egg): It is possible for pairs to be safe even if the outgoing states differ depending + // on the state before the pair; this would require a more thorough analysis to handle, probably + // in the style of what happens in minimizeStates. // // 2. Build a state table that recognizes the safe pairs. It's similar to their // forward table, with a column for each input character [class], and a row for @@ -1467,31 +1806,200 @@ void RBBITableBuilder::buildSafeReverseTable(UErrorCode &status) { int32_t numCharClasses = fRB->fSetBuilder->getNumCharCategories(); int32_t numStates = fDStates->size(); - - for (int32_t c1=0; c1(fLASlotsInUse + 1, status); + const auto wantedLookaheadsInPair = + prv::make_unique_for_overwrite(fLASlotsInUse + 1, status); + if (U_FAILURE(status)) { + return; + } + // Same as in rbbi.cpp. + // TODO(egg): Maybe this should move to rbbidata.h like ACCEPTING_UNCONDITIONAL? + constexpr int32_t START_STATE = 1; + // Index -2 is used to signify a text position before the pair (c1, c2). + constexpr int32_t BEFORE_PAIR = -2; + // In lookaheadPositions, index -1 is used to signify that the lookahead has not been set. + constexpr int8_t LOOKAHEAD_NOT_SET = -1; + for (int32_t c1 = 1; c1 < numCharClasses; ++c1) { + if (fRB->fSetBuilder->getFirstChar(c1) < 0) { + continue; + } + for (int32_t c2 = 1; c2 < numCharClasses; ++c2) { + if (fRB->fSetBuilder->getFirstChar(c2) < 0) { + continue; + } int32_t wantedEndState = -1; - int32_t endState = 0; - for (int32_t startState = 1; startState < numStates; ++startState) { - RBBIStateDescriptor *startStateD = static_cast(fDStates->elementAt(startState)); - int32_t s2 = startStateD->fDtran->elementAti(c1); - RBBIStateDescriptor *s2StateD = static_cast(fDStates->elementAt(s2)); - endState = s2StateD->fDtran->elementAti(c2); - if (wantedEndState < 0) { - wantedEndState = endState; - } else { - if (wantedEndState != endState) { - break; + int32_t wantedLastAcceptingPosition; + bool mustCheckConsistentWithStartC2 = false; + const int32_t text[2] = {c1, c2}; + for (int32_t injectedState = START_STATE; injectedState < numStates; ++injectedState) { + for (int32_t injectedLookahead = ACCEPTING_UNCONDITIONAL; + injectedLookahead <= fLASlotsInUse; ++injectedLookahead) { + int32_t lastBreak = BEFORE_PAIR; + int32_t lastAcceptingPosition = BEFORE_PAIR; + uprv_memset(lookaheadPositions.get(), LOOKAHEAD_NOT_SET, fLASlotsInUse + 1); + if (injectedLookahead != ACCEPTING_UNCONDITIONAL) { + lookaheadPositions[injectedLookahead] = BEFORE_PAIR; + } + { + const RBBIStateDescriptor &injectedStateDescriptor = + *static_cast(fDStates->elementAt(injectedState)); + if (injectedStateDescriptor.fAccepting == ACCEPTING_UNCONDITIONAL) { + lastAcceptingPosition = 0; + } else if (static_cast(injectedStateDescriptor.fAccepting) == + injectedLookahead) { + continue; + } + if (injectedStateDescriptor.fLookAhead != 0) { + lookaheadPositions[injectedStateDescriptor.fLookAhead] = 0; + } + } + int32_t s = injectedState; + int32_t i = 0; + goto dfaStep; + // Loop Run_DFA in L2/26-135, without the termination condition (we do not need + // to simulate the end of text). + for (;;) { + s = START_STATE; + uprv_memset(lookaheadPositions.get(), LOOKAHEAD_NOT_SET, fLASlotsInUse + 1); + i = lastBreak; + // Loop Find_Next_Break in L2/26-135. + for (;;) { + dfaStep: + if (i == BEFORE_PAIR || i == 2) { + goto inspectFinalState; + } + const int32_t symbolAhead = text[i]; + ++i; + const RBBIStateDescriptor *sDescriptor = + static_cast(fDStates->elementAt(s)); + if (sDescriptor->fDtran->elementAti(symbolAhead) != 0) { + s = sDescriptor->fDtran->elementAti(symbolAhead); + sDescriptor = + static_cast(fDStates->elementAt(s)); + } else { + if (lastBreak != BEFORE_PAIR && + lastAcceptingPosition == lastBreak) { + // The pair (c1, c2) puts us in an infinite loop from the + // current configuration, presumably because some one-character + // strings are not in the language recognized by the rules). + // This should never happen for a segmentation algorithm. The + // RBBI implementation forcefully advances the iterator in that + // case; let’s just say the pair is unsafe and move on. + goto nextSymbolPair; + } + lastBreak = lastAcceptingPosition; + break; + } + + if (sDescriptor->fAccepting == ACCEPTING_UNCONDITIONAL) { + lastAcceptingPosition = i; + } else if (sDescriptor->fAccepting > ACCEPTING_UNCONDITIONAL && + lookaheadPositions[sDescriptor->fAccepting] != + LOOKAHEAD_NOT_SET) { + lastBreak = lookaheadPositions[sDescriptor->fAccepting]; + break; + } + if (sDescriptor->fLookAhead != 0) { + lookaheadPositions[sDescriptor->fLookAhead] = i; + } + } + } + inspectFinalState: + if (i == BEFORE_PAIR) { + // Starting on `injectedState` with `injectedLookahead` set, with the pair + // (c1, c2) ahead, the state machine finds a break before the pair; it will + // thus come back to the pair in a different configuration, which is covered + // by some other iteration of the loop over `injectedState` and + // `injectedLookahead`. + continue; + } + if (wantedEndState < 0) { + wantedEndState = s; + wantedLastAcceptingPosition = lastAcceptingPosition; + for (int32_t l = ACCEPTING_UNCONDITIONAL + 1; l <= fLASlotsInUse; ++l) { + if (lookaheadPositions[l] != LOOKAHEAD_NOT_SET && + lookaheadPositions[l] != BEFORE_PAIR && + lookaheadPositions[l] != 0) { + wantedLookaheadsInPair[l] = lookaheadPositions[i]; + } else { + wantedLookaheadsInPair[l] = LOOKAHEAD_NOT_SET; + } + } + } else { + if (wantedEndState != s) { + // We can get out of the pair on different states depending on the + // initial configuration. + goto nextSymbolPair; + } + if (wantedLastAcceptingPosition != lastAcceptingPosition) { + goto nextSymbolPair; + } + } + // A lookahead some distance before the pair (set to BEFORE_PAIR) means we + // will come back to the pair in a different configuration if it matches, a + // lookahead at position 0 means we get back to the pair on the start state + // if it matches; either way, this is covered by other iterations of the + // loop over injected states and lookaheads. + // For lookaheads at position 1 (in the middle of the pair) and 2 (after the + // pair), these have two ways of being safe: either they are always set, or it + // does not matter if they are set, because if they match we come back with the + // same state. + for (int32_t l = ACCEPTING_UNCONDITIONAL + 1; l <= fLASlotsInUse; ++l) { + if (lookaheadPositions[l] == BEFORE_PAIR || lookaheadPositions[l] == 0 || + lookaheadPositions[l] == wantedLookaheadsInPair[l]) { + continue; + } + if (lookaheadPositions[l] == 2 || wantedLookaheadsInPair[l] == 2) { + // A lookahead after the pair means we will come back to the end of the + // pair on the start state if it matches, so in order for the pair to be + // safe if that lookahead is not consistently set, we must have left it + // on the start state. + if (wantedEndState != START_STATE) { + goto nextSymbolPair; + } + } + if (lookaheadPositions[l] == 1 || wantedLookaheadsInPair[l] == 1) { + // If a lookahead in the middle of the pair matches, we will come back + // to c2 on the start state. + mustCheckConsistentWithStartC2 = true; + } } } } - if (wantedEndState == endState) { - safePairs.append(static_cast(c1)); - safePairs.append(static_cast(c2)); - // printf("(%d, %d) ", c1, c2); + if (mustCheckConsistentWithStartC2) { + const RBBIStateDescriptor& startDescriptor = + *static_cast(fDStates->elementAt(START_STATE)); + const auto c2State = startDescriptor.fDtran->elementAti(c2); + if (c2State != wantedEndState) { + goto nextSymbolPair; + } + const RBBIStateDescriptor& c2StateDescriptor = + *static_cast(fDStates->elementAt(c2State)); + // In a segmentation algorithm, any single symbol transitions to an + // accepting state from the start state (a single character is a + // possible segment), so we know c2State is accepting. + U_ASSERT(c2StateDescriptor.fAccepting == ACCEPTING_UNCONDITIONAL); + if (wantedLastAcceptingPosition != 2) { + goto nextSymbolPair; + } + // If that in turn sets a lookahead, we have a lookahead after the + // pair. If we consistently have that the pair is safe. Otherwise, if we match + // that lookahead, we end up on the start state. + for (int32_t l = ACCEPTING_UNCONDITIONAL + 1; l <= fLASlotsInUse; ++l) { + if (((wantedLookaheadsInPair[l] == 2) != + (static_cast(c2StateDescriptor.fLookAhead) == l)) && + wantedEndState != START_STATE) { + goto nextSymbolPair; + } + } } + safePairs.append(static_cast(c1)); + safePairs.append(static_cast(c2)); + nextSymbolPair: + continue; } - // printf("\n"); } // Populate the initial safe table. diff --git a/deps/icu-small/source/common/rbbitblb.h b/deps/icu-small/source/common/rbbitblb.h index 01eee3da4ef0..6adfbed90c68 100644 --- a/deps/icu-small/source/common/rbbitblb.h +++ b/deps/icu-small/source/common/rbbitblb.h @@ -79,6 +79,13 @@ class RBBITableBuilder : public UMemory { */ int32_t removeDuplicateStates(); + /** + * Minimizes the number of slots used by the lookaheads. + * This must be called before `removeDuplicateStates`: by merging lookaheads, it removes + * distinctions between states that would be preserved by `removeDuplicateStates`. + */ + void minimizeLookaheads(); + /** Build the safe reverse table from the already-constructed forward table. */ void buildSafeReverseTable(UErrorCode &status); @@ -105,6 +112,7 @@ class RBBITableBuilder : public UMemory { void flagLookAheadStates(); void flagTaggedStates(); void mergeRuleStatusVals(); + void minimizeStates(); /** * Merge redundant state table columns, eliminating character classes with identical behavior. @@ -114,23 +122,6 @@ class RBBITableBuilder : public UMemory { void addRuleRootNodes(UVector *dest, RBBINode *node); - /** - * Find duplicate (redundant) states, beginning at the specified pair, - * within this state table. This is an iterator-like function, used to - * identify states (state table rows) that can be eliminated. - * @param states in/out parameter, specifies where to start looking for duplicates, - * and returns the first pair of duplicates found, if any. - * @return true if duplicate states were found, false otherwise. - */ - bool findDuplicateState(IntPair *states); - - /** Remove a duplicate state. - * @param duplStates The duplicate states. The first is kept, the second is removed. - * All references to the second in the state table are retargeted - * to the first. - */ - void removeState(IntPair duplStates); - /** Find the next duplicate state in the safe reverse table. An iterator function. * @param states in/out parameter, specifies where to start looking for duplicates, * and returns the first pair of duplicates found, if any. diff --git a/deps/icu-small/source/common/resbund.cpp b/deps/icu-small/source/common/resbund.cpp index 4c14dae133ee..fc26e55b7f94 100644 --- a/deps/icu-small/source/common/resbund.cpp +++ b/deps/icu-small/source/common/resbund.cpp @@ -213,7 +213,7 @@ ResourceBundle::ResourceBundle(const char* path, const Locale& locale, UErrorCod } -ResourceBundle& ResourceBundle::operator=(const ResourceBundle& other) +ResourceBundle& ResourceBundle::operator=(const ResourceBundle& other) U_LIFETIME_BOUND { if(this == &other) { return *this; @@ -249,17 +249,18 @@ ResourceBundle::clone() const { return new ResourceBundle(*this); } -UnicodeString ResourceBundle::getString(UErrorCode& status) const { +UnicodeString ResourceBundle::getString(UErrorCode& status) const U_LIFETIME_BOUND { int32_t len = 0; const char16_t *r = ures_getString(fResource, &len, &status); return UnicodeString(true, r, len); } -const uint8_t *ResourceBundle::getBinary(int32_t& len, UErrorCode& status) const { +const uint8_t* ResourceBundle::getBinary(int32_t& len, UErrorCode& status) const U_LIFETIME_BOUND { return ures_getBinary(fResource, &len, &status); } -const int32_t *ResourceBundle::getIntVector(int32_t& len, UErrorCode& status) const { +const int32_t* ResourceBundle::getIntVector(int32_t& len, + UErrorCode& status) const U_LIFETIME_BOUND { return ures_getIntVector(fResource, &len, &status); } @@ -271,11 +272,11 @@ int32_t ResourceBundle::getInt(UErrorCode& status) const { return ures_getInt(fResource, &status); } -const char *ResourceBundle::getName() const { +const char* ResourceBundle::getName() const U_LIFETIME_BOUND { return ures_getName(fResource); } -const char *ResourceBundle::getKey() const { +const char* ResourceBundle::getKey() const U_LIFETIME_BOUND { return ures_getKey(fResource); } @@ -307,13 +308,13 @@ ResourceBundle ResourceBundle::getNext(UErrorCode& status) { return res; } -UnicodeString ResourceBundle::getNextString(UErrorCode& status) { +UnicodeString ResourceBundle::getNextString(UErrorCode& status) U_LIFETIME_BOUND { int32_t len = 0; const char16_t* r = ures_getNextString(fResource, &len, nullptr, &status); return UnicodeString(true, r, len); } -UnicodeString ResourceBundle::getNextString(const char ** key, UErrorCode& status) { +UnicodeString ResourceBundle::getNextString(const char** key, UErrorCode& status) U_LIFETIME_BOUND { int32_t len = 0; const char16_t* r = ures_getNextString(fResource, &len, key, &status); return UnicodeString(true, r, len); @@ -331,7 +332,8 @@ ResourceBundle ResourceBundle::get(int32_t indexR, UErrorCode& status) const { return res; } -UnicodeString ResourceBundle::getStringEx(int32_t indexS, UErrorCode& status) const { +UnicodeString ResourceBundle::getStringEx(int32_t indexS, + UErrorCode& status) const U_LIFETIME_BOUND { int32_t len = 0; const char16_t* r = ures_getStringByIndex(fResource, indexS, &len, &status); return UnicodeString(true, r, len); @@ -359,15 +361,15 @@ ResourceBundle ResourceBundle::getWithFallback(const char* key, UErrorCode& stat } return res; } -UnicodeString ResourceBundle::getStringEx(const char* key, UErrorCode& status) const { + +UnicodeString ResourceBundle::getStringEx(const char* key, + UErrorCode& status) const U_LIFETIME_BOUND { int32_t len = 0; const char16_t* r = ures_getStringByKey(fResource, key, &len, &status); return UnicodeString(true, r, len); } -const char* -ResourceBundle::getVersionNumber() const -{ +const char* ResourceBundle::getVersionNumber() const U_LIFETIME_BOUND { return ures_getVersionNumberInternal(fResource); } @@ -375,7 +377,7 @@ void ResourceBundle::getVersion(UVersionInfo versionInfo) const { ures_getVersion(fResource, versionInfo); } -const Locale &ResourceBundle::getLocale() const { +const Locale& ResourceBundle::getLocale() const U_LIFETIME_BOUND { static UMutex gLocaleLock; Mutex lock(&gLocaleLock); if (fLocale != nullptr) { diff --git a/deps/icu-small/source/common/schriter.cpp b/deps/icu-small/source/common/schriter.cpp index d4bac8fd4f27..362ae2367839 100644 --- a/deps/icu-small/source/common/schriter.cpp +++ b/deps/icu-small/source/common/schriter.cpp @@ -71,7 +71,7 @@ StringCharacterIterator::~StringCharacterIterator() { } StringCharacterIterator& -StringCharacterIterator::operator=(const StringCharacterIterator& that) { +StringCharacterIterator::operator=(const StringCharacterIterator& that) U_LIFETIME_BOUND { UCharCharacterIterator::operator=(that); text = that.text; // we had set the input parameter's array, now we need to set our copy's array diff --git a/deps/icu-small/source/common/servloc.h b/deps/icu-small/source/common/servloc.h index 47c8ac38ae27..ea97d0d55266 100644 --- a/deps/icu-small/source/common/servloc.h +++ b/deps/icu-small/source/common/servloc.h @@ -518,7 +518,7 @@ class U_COMMON_API_CLASS ICULocaleService : public ICUService * Convenience method for callers using locales. This returns the standard * service ID enumeration. */ - U_COMMON_API virtual StringEnumeration* getAvailableLocales() const; + U_COMMON_API virtual StringEnumeration* getAvailableLocales() const U_LIFETIME_BOUND; protected: diff --git a/deps/icu-small/source/common/servls.cpp b/deps/icu-small/source/common/servls.cpp index 33a113896233..bb26a6fc3f31 100644 --- a/deps/icu-small/source/common/servls.cpp +++ b/deps/icu-small/source/common/servls.cpp @@ -159,7 +159,7 @@ class ServiceEnumeration : public StringEnumeration { int32_t _pos; private: - ServiceEnumeration(const ICULocaleService* service, UErrorCode &status) + ServiceEnumeration(const ICULocaleService* service U_LIFETIME_BOUND, UErrorCode& status) : _service(service) , _timestamp(service->getTimestamp()) , _ids(uprv_deleteUObject, nullptr, status) @@ -190,7 +190,7 @@ class ServiceEnumeration : public StringEnumeration { } public: - static ServiceEnumeration* create(const ICULocaleService* service) { + static ServiceEnumeration* create(const ICULocaleService* service U_LIFETIME_BOUND) { UErrorCode status = U_ZERO_ERROR; ServiceEnumeration* result = new ServiceEnumeration(service, status); if (U_SUCCESS(status)) { @@ -226,7 +226,7 @@ class ServiceEnumeration : public StringEnumeration { return upToDate(status) ? _ids.size() : 0; } - virtual const UnicodeString* snext(UErrorCode& status) override { + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override { if (upToDate(status) && (_pos < _ids.size())) { return static_cast(_ids[_pos++]); } @@ -254,7 +254,7 @@ ServiceEnumeration::~ServiceEnumeration() {} UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ServiceEnumeration) StringEnumeration* -ICULocaleService::getAvailableLocales() const +ICULocaleService::getAvailableLocales() const U_LIFETIME_BOUND { return ServiceEnumeration::create(this); } diff --git a/deps/icu-small/source/common/simpleformatter.cpp b/deps/icu-small/source/common/simpleformatter.cpp index 66074938943e..09e0c8ef3fd2 100644 --- a/deps/icu-small/source/common/simpleformatter.cpp +++ b/deps/icu-small/source/common/simpleformatter.cpp @@ -50,7 +50,7 @@ inline UBool isInvalidArray(const void *array, int32_t length) { } // namespace -SimpleFormatter &SimpleFormatter::operator=(const SimpleFormatter& other) { +SimpleFormatter& SimpleFormatter::operator=(const SimpleFormatter& other) U_LIFETIME_BOUND { if (this == &other) { return *this; } @@ -156,33 +156,39 @@ UBool SimpleFormatter::applyPatternMinMaxArguments( } UnicodeString& SimpleFormatter::format( - const UnicodeString &value0, - UnicodeString &appendTo, UErrorCode &errorCode) const { + const UnicodeString& value0, + UnicodeString& appendTo U_LIFETIME_BOUND, + UErrorCode& errorCode) const { const UnicodeString *values[] = { &value0 }; return formatAndAppend(values, 1, appendTo, nullptr, 0, errorCode); } UnicodeString& SimpleFormatter::format( - const UnicodeString &value0, - const UnicodeString &value1, - UnicodeString &appendTo, UErrorCode &errorCode) const { + const UnicodeString& value0, + const UnicodeString& value1, + UnicodeString& appendTo U_LIFETIME_BOUND, + UErrorCode& errorCode) const { const UnicodeString *values[] = { &value0, &value1 }; return formatAndAppend(values, 2, appendTo, nullptr, 0, errorCode); } UnicodeString& SimpleFormatter::format( - const UnicodeString &value0, - const UnicodeString &value1, - const UnicodeString &value2, - UnicodeString &appendTo, UErrorCode &errorCode) const { + const UnicodeString& value0, + const UnicodeString& value1, + const UnicodeString& value2, + UnicodeString& appendTo U_LIFETIME_BOUND, + UErrorCode& errorCode) const { const UnicodeString *values[] = { &value0, &value1, &value2 }; return formatAndAppend(values, 3, appendTo, nullptr, 0, errorCode); } UnicodeString& SimpleFormatter::formatAndAppend( - const UnicodeString *const *values, int32_t valuesLength, - UnicodeString &appendTo, - int32_t *offsets, int32_t offsetsLength, UErrorCode &errorCode) const { + const UnicodeString* const* values, + int32_t valuesLength, + UnicodeString& appendTo U_LIFETIME_BOUND, + int32_t* offsets, + int32_t offsetsLength, + UErrorCode& errorCode) const { if (U_FAILURE(errorCode)) { return appendTo; } @@ -196,10 +202,13 @@ UnicodeString& SimpleFormatter::formatAndAppend( offsets, offsetsLength, errorCode); } -UnicodeString &SimpleFormatter::formatAndReplace( - const UnicodeString *const *values, int32_t valuesLength, - UnicodeString &result, - int32_t *offsets, int32_t offsetsLength, UErrorCode &errorCode) const { +UnicodeString& SimpleFormatter::formatAndReplace( + const UnicodeString* const* values, + int32_t valuesLength, + UnicodeString& result U_LIFETIME_BOUND, + int32_t* offsets, + int32_t offsetsLength, + UErrorCode& errorCode) const { if (U_FAILURE(errorCode)) { return result; } @@ -271,12 +280,16 @@ UnicodeString SimpleFormatter::getTextWithNoArguments( return sb; } -UnicodeString &SimpleFormatter::format( - const char16_t *compiledPattern, int32_t compiledPatternLength, - const UnicodeString *const *values, - UnicodeString &result, const UnicodeString *resultCopy, UBool forbidResultAsValue, - int32_t *offsets, int32_t offsetsLength, - UErrorCode &errorCode) { +UnicodeString& SimpleFormatter::format( + const char16_t* compiledPattern, + int32_t compiledPatternLength, + const UnicodeString* const* values, + UnicodeString& result U_LIFETIME_BOUND, + const UnicodeString* resultCopy, + UBool forbidResultAsValue, + int32_t* offsets, + int32_t offsetsLength, + UErrorCode& errorCode) { if (U_FAILURE(errorCode)) { return result; } diff --git a/deps/icu-small/source/common/stringpiece.cpp b/deps/icu-small/source/common/stringpiece.cpp index eb9766c01803..519ec30f761d 100644 --- a/deps/icu-small/source/common/stringpiece.cpp +++ b/deps/icu-small/source/common/stringpiece.cpp @@ -15,10 +15,10 @@ U_NAMESPACE_BEGIN -StringPiece::StringPiece(const char* str) +StringPiece::StringPiece(const char* str U_LIFETIME_BOUND) : ptr_(str), length_((str == nullptr) ? 0 : static_cast(uprv_strlen(str))) { } -StringPiece::StringPiece(const StringPiece& x, int32_t pos) { +StringPiece::StringPiece(const StringPiece& x U_LIFETIME_BOUND, int32_t pos) { if (pos < 0) { pos = 0; } else if (pos > x.length_) { @@ -28,7 +28,7 @@ StringPiece::StringPiece(const StringPiece& x, int32_t pos) { length_ = x.length_ - pos; } -StringPiece::StringPiece(const StringPiece& x, int32_t pos, int32_t len) { +StringPiece::StringPiece(const StringPiece& x U_LIFETIME_BOUND, int32_t pos, int32_t len) { if (pos < 0) { pos = 0; } else if (pos > x.length_) { diff --git a/deps/icu-small/source/common/stringtriebuilder.cpp b/deps/icu-small/source/common/stringtriebuilder.cpp index 686703906289..e5dc7e123b75 100644 --- a/deps/icu-small/source/common/stringtriebuilder.cpp +++ b/deps/icu-small/source/common/stringtriebuilder.cpp @@ -204,8 +204,11 @@ StringTrieBuilder::writeBranchSubNode(int32_t start, int32_t limit, int32_t unit // Requires start + #include "cmemory.h" +#include "unicode/unistr.h" #include "unicode/utypes.h" #include "unicode/ustring.h" #include "unicode/uchar.h" @@ -196,19 +199,25 @@ ubidi_openSized(int32_t maxLength, int32_t maxRunCount, UErrorCode *pErrorCode) * is this the best way to do this?? */ U_CFUNC UBool -ubidi_getMemory(BidiMemoryForAllocation *bidiMem, int32_t *pSize, UBool mayAllocate, int32_t sizeNeeded) { +ubidi_getMemory(BidiMemoryForAllocation *bidiMem, int32_t *pSize, UBool mayAllocate, size_t sizeNeeded) { + if (sizeNeeded > std::numeric_limits::max()) { + // TODO(egg): Ugly guard for ICU-23397. A cleaner fix would be to change the pSize to size_t* + // and update callers throughout to use size_t for sizes (just like uprv_malloc already does). + // Not that anyone should be running the UBA on text with that many runs… + return false; + } void **pMemory = (void **)bidiMem; /* check for existing memory */ if(*pMemory==nullptr) { /* we need to allocate memory */ if(mayAllocate && (*pMemory=uprv_malloc(sizeNeeded))!=nullptr) { - *pSize=sizeNeeded; + *pSize=static_cast(sizeNeeded); return true; } else { return false; } } else { - if(sizeNeeded<=*pSize) { + if(sizeNeeded<=static_cast(*pSize)) { /* there is already enough memory */ return true; } @@ -224,7 +233,7 @@ ubidi_getMemory(BidiMemoryForAllocation *bidiMem, int32_t *pSize, UBool mayAlloc */ if((memory=uprv_realloc(*pMemory, sizeNeeded))!=nullptr) { *pMemory=memory; - *pSize=sizeNeeded; + *pSize=static_cast(sizeNeeded); return true; } else { /* we failed to grow */ @@ -2417,9 +2426,16 @@ setParaRunsOnly(UBiDi *pBiDi, const char16_t *text, int32_t length, * to ubidi_setPara (but must make provision for possible removal of * BiDi controls. Alternatively, only use the dirProps array via * customized classifier callback. + * + * Note: We pass UBIDI_INTERNAL_RUNS_ONLY so that if mirroring changes code point + * length (e.g., U+1DB10 contracting back to U+221D), doWriteReverse() uses legacy + * 1-to-1 code unit stepping (j += k) rather than character stepping (j += origBaseLen). + * This ensures visualLength remains synchronized with pBiDi->length and allows the + * trailing surrogate half (Bidi class LTR) to act as a run boundary splitter in the + * subsequent ubidi_setPara call. */ visualLength=ubidi_writeReordered(pBiDi, visualText, length, - UBIDI_DO_MIRRORING, pErrorCode); + (saveOptions & UBIDI_DO_MIRRORING) | UBIDI_INTERNAL_RUNS_ONLY, pErrorCode); ubidi_getVisualMap(pBiDi, visualMap, pErrorCode); if(U_FAILURE(*pErrorCode)) { goto cleanup2; @@ -2471,6 +2487,7 @@ setParaRunsOnly(UBiDi *pBiDi, const char16_t *text, int32_t length, runs=pBiDi->runs=pBiDi->runsMemory; pBiDi->runCount+=addedRuns; } else { + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; goto cleanup1; } } @@ -2879,8 +2896,8 @@ ubidi_getDirection(const UBiDi *pBiDi) { } } -U_CAPI const char16_t * U_EXPORT2 -ubidi_getText(const UBiDi *pBiDi) { +U_CAPI const char16_t* U_EXPORT2 +ubidi_getText(const UBiDi* pBiDi) { if(IS_VALID_PARA_OR_LINE(pBiDi)) { return pBiDi->text; } else { @@ -3034,3 +3051,105 @@ ubidi_getCustomizedClass(UBiDi *pBiDi, UChar32 c) } return dir; } + +/* Utilities for MessageFormat ------------------------------------------------*/ + +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + +U_CAPI UMFBidiOption U_EXPORT2 +ubidi_getMFOption(const UnicodeString& s) { + if (s == u"ltr") { + return U_MF_BIDI_OPTION_LTR; + } + if (s == u"rtl") { + return U_MF_BIDI_OPTION_RTL; + } + if (s == u"auto") { + return U_MF_BIDI_OPTION_AUTO; + } + return U_MF_BIDI_OPTION_INHERIT; // inherit is default +} + +// BiDi isolation +// -------------- +// `uDirOption` is the directionality from a u:dir annotation on the expression +// that produced this formatted value, if present. +// `dir` is the directionality of `fmt`. This is determined from the resolved +// value that `fmt` is part of; that is, each function can set the directionality +// of the resolved value of its result. +U_CAPI UnicodeString* U_EXPORT2 +ubidi_isolate(UMFBidiIsolationStrategy bidiIsolationStrategy, + UMFDirectionality msgdir, + UMFBidiIsolationStyle bidiIsolationStyle, + UMFBidiOption uDirOption, + UMFDirectionality dir, + UnicodeString& fmt) { + // See "The Default Bidi Strategy" at: + // https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#handling-bidirectional-text + + // If strategy is 'none', just return the string + if (bidiIsolationStrategy == U_MF_BIDI_OFF) + return &fmt; + + /* 1. Let msgdir be the directionality of the whole message, one of « 'LTR', 'RTL', 'unknown' ». These correspond to the message having left-to-right directionality, right-to-left directionality, and to the message's directionality not being known. */ + + // 2i Let fmt be the formatted string representation of the resolved value of exp. + // (Passed as argument) + + // 2ii Let dir be the directionality of fmt, one of « 'LTR', 'RTL', 'unknown' », with the same meanings as for msgdir + // (Passed as argument) + + // 2iii. Let the boolean value isolate be True if the u:dir option of the resolved value of exp has a value other than 'inherit', or False otherwise. + bool isolate = uDirOption != U_MF_BIDI_OPTION_INHERIT; + + UnicodeString bdiOpen(""); + UnicodeString bdiClose(""); + + // 2iv. If dir is 'LTR' + switch (dir) { + case U_MF_DIRECTIONALITY_LTR: + if (msgdir == U_MF_DIRECTIONALITY_LTR && !isolate) { + // 2iv(a). If msgdir is 'LTR' in the formatted output, let fmt be itself + return &fmt; + } + // 2iii(b) Else, in the formatted output, prefix fmt with U+2066 LEFT-TO-RIGHT ISOLATE and postfix it with U+2069 POP DIRECTIONAL ISOLATE. + if (bidiIsolationStyle == U_MF_BIDI_STYLE_CONTROL) { + fmt.insert(0, LRI_CHAR); + fmt.insert(fmt.length(), PDI_CHAR); + } else { + fmt.insert(0, bdiOpen); + fmt.insert(fmt.length(), bdiClose); + } + break; // End of 2iii + // 2iv. Else, if dir is 'RTL': + case U_MF_DIRECTIONALITY_RTL: + // 2iv(a). In the formatted output, prefix fmt with U+2067 RIGHT-TO-LEFT ISOLATE and postfix it with U+2069 POP DIRECTIONAL ISOLATE. + if (bidiIsolationStyle == U_MF_BIDI_STYLE_CONTROL) { + fmt.insert(0, RLI_CHAR); + fmt.insert(fmt.length(), PDI_CHAR); + } else { + fmt.insert(0, bdiOpen); + fmt.insert(fmt.length(), bdiClose); + } + break; // End of 2iv. + // 2v. Else: + default: + // 2v(a). In the formatted output, prefix fmt with U+2068 FIRST STRONG ISOLATE and postfix it with U+2069 POP DIRECTIONAL ISOLATE. + if (bidiIsolationStyle == U_MF_BIDI_STYLE_CONTROL) { + fmt.insert(0, FSI_CHAR); + fmt.insert(fmt.length(), PDI_CHAR); + } else { + fmt.insert(0, bdiOpen); + fmt.insert(fmt.length(), bdiClose); + } + break; // End of 2v + } // `fmt` now contains the isolated string + return &fmt; +} + +U_NAMESPACE_END + +#endif // #if SHOW_CPLUSPLUS_API + diff --git a/deps/icu-small/source/common/ubidi_props_data.h b/deps/icu-small/source/common/ubidi_props_data.h index 90d1fba117e5..9e3817d9c709 100644 --- a/deps/icu-small/source/common/ubidi_props_data.h +++ b/deps/icu-small/source/common/ubidi_props_data.h @@ -9,445 +9,443 @@ #ifdef INCLUDED_FROM_UBIDI_PROPS_C -static const UVersionInfo ubidi_props_dataVersion={0x11,0,0,0}; +static const UVersionInfo ubidi_props_dataVersion={0x12,0,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x703c,0x68a8,0x28,0x620,0x8cc,0x10ac0,0x10ec8,0,0,0,0,0,0,0,0x6902b6}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x7058,0x6898,0x2a,0x620,0x8c9,0x10ac0,0x10eef,0,0,0,0,0,0,0,0x7302b6}; -static const uint16_t ubidi_props_trieIndex[13388]={ -0x395,0x39d,0x3a5,0x3ad,0x3c5,0x3cd,0x3d5,0x3dd,0x3b5,0x3bd,0x3b5,0x3bd,0x3b5,0x3bd,0x3b5,0x3bd, -0x3b5,0x3bd,0x3b5,0x3bd,0x3e3,0x3eb,0x3f3,0x3fb,0x403,0x40b,0x407,0x40f,0x417,0x41f,0x41a,0x422, -0x3b5,0x3bd,0x3b5,0x3bd,0x42a,0x432,0x3b5,0x3bd,0x3b5,0x3bd,0x3b5,0x3bd,0x438,0x440,0x448,0x450, -0x458,0x460,0x468,0x470,0x476,0x47e,0x486,0x48e,0x496,0x49e,0x4a4,0x4ac,0x4b4,0x4bc,0x4c4,0x4cc, -0x4d8,0x4d4,0x4e0,0x4e8,0x4f0,0x500,0x507,0x4f8,0x50f,0x511,0x519,0x521,0x529,0x52a,0x532,0x53a, -0x542,0x52a,0x54a,0x54f,0x542,0x52a,0x557,0x55f,0x529,0x567,0x56f,0x521,0x577,0x3b5,0x57f,0x583, -0x58b,0x58d,0x595,0x59d,0x529,0x5a5,0x5ad,0x521,0x42c,0x5b1,0x532,0x521,0x529,0x3b5,0x5b9,0x3b5, -0x3b5,0x5bf,0x5c7,0x3b5,0x3b5,0x5cb,0x5d3,0x3b5,0x5d7,0x5de,0x3b5,0x5e6,0x5ee,0x5f5,0x576,0x3b5, -0x3b5,0x5fd,0x605,0x60d,0x615,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x61d,0x3b5,0x625,0x3b5,0x3b5,0x3b5, -0x62d,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x635,0x3b5,0x3b5,0x3b5,0x63d,0x536,0x536,0x536,0x3b5,0x643,0x64b,0x625, -0x661,0x653,0x653,0x669,0x670,0x659,0x3b5,0x3b5,0x3b5,0x678,0x680,0x3b5,0x3b5,0x3b5,0x682,0x68a, -0x692,0x3b5,0x699,0x6a1,0x3b5,0x6a9,0x6b6,0x6ae,0x566,0x6be,0x577,0x6c6,0x42c,0x6ce,0x3b5,0x6d5, -0x3b5,0x6da,0x3b5,0x3b5,0x3b5,0x3b5,0x6e0,0x6e8,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x403,0x403, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x6ef,0x6f7,0x6fb, -0x713,0x719,0x703,0x70b,0x721,0x729,0x72d,0x5f8,0x735,0x73d,0x745,0x3b5,0x74d,0x68a,0x68a,0x68a, -0x75d,0x765,0x76d,0x775,0x77a,0x782,0x78a,0x755,0x792,0x79a,0x3b5,0x7a0,0x7a7,0x68a,0x68a,0x68a, -0x68a,0x79d,0x7ad,0x68a,0x7b5,0x3b5,0x3b5,0x687,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x7bd,0x68a,0x68a,0x68a,0x68a,0x68a,0x7c3,0x68a,0x68a,0x7cb,0x7d3, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a,0x68a,0x68a,0x7e3,0x7eb,0x7f3,0x7db, -0x803,0x80b,0x813,0x81a,0x821,0x829,0x82d,0x7fb,0x68a,0x68a,0x68a,0x835,0x68a,0x68a,0x68a,0x83b, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x843,0x3b5,0x3b5,0x3b5,0x84b,0x3b5,0x3b5,0x3b5,0x403, -0x853,0x85b,0x85e,0x3b5,0x866,0x68a,0x68a,0x68d,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x86d,0x873, -0x883,0x87b,0x3b5,0x3b5,0x88b,0x62d,0x3b5,0x3dc,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x893, -0x3ea,0x3b5,0x873,0x897,0x3b5,0x89f,0x8a7,0x3b5,0x3b5,0x3b5,0x3b5,0x8ab,0x3b5,0x3b5,0x682,0x3db, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x873,0x68a,0x5a3,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x8b2,0x3b5,0x3b5,0x8b7,0x8bf,0x3b5,0x3b5,0x5d9,0x68a,0x681,0x3b5,0x3b5,0x8c7,0x3b5,0x3b5,0x3b5, -0x8cf,0x8d6,0x653,0x8de,0x3b5,0x3b5,0x5af,0x8e6,0x3b5,0x8ee,0x8f5,0x3b5,0x50f,0x8fa,0x3b5,0x528, -0x3b5,0x902,0x90a,0x52a,0x3b5,0x90e,0x529,0x916,0x3b5,0x3b5,0x3b5,0x91c,0x3b5,0x3b5,0x3b5,0x923, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x937,0x92b,0x92f,0x4b4,0x4b4,0x4b4,0x93f,0x4b4, -0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x944,0x94c,0x4b4,0x950,0x4b4,0x956,0x95a, -0x962,0x96a,0x96e,0x976,0x4b4,0x4b4,0x4b4,0x97a,0x982,0x3a5,0x98a,0x992,0x3b5,0x3b5,0x3b5,0x99a, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0xed4,0xed4,0xf14,0xf54,0xed4,0xed4,0xed4,0xed4,0xed4,0xed4,0xf8c,0xfcc,0x100c,0x101c,0x105c,0x1068, -0xed4,0xed4,0x10a8,0xed4,0xed4,0xed4,0x10e0,0x1120,0x1160,0x11a0,0x11d8,0x1218,0x1258,0x1290,0x12d0,0x1310, +static const uint16_t ubidi_props_trieIndex[13380]={ +0x394,0x39c,0x3a4,0x3ac,0x3c4,0x3cc,0x3d4,0x3dc,0x3b4,0x3bc,0x3b4,0x3bc,0x3b4,0x3bc,0x3b4,0x3bc, +0x3b4,0x3bc,0x3b4,0x3bc,0x3e2,0x3ea,0x3f2,0x3fa,0x402,0x40a,0x406,0x40e,0x416,0x41e,0x419,0x421, +0x3b4,0x3bc,0x3b4,0x3bc,0x429,0x431,0x3b4,0x3bc,0x3b4,0x3bc,0x3b4,0x3bc,0x437,0x43f,0x447,0x44f, +0x457,0x45f,0x467,0x46f,0x475,0x47d,0x485,0x48d,0x495,0x49d,0x4a3,0x4ab,0x4b3,0x4bb,0x4c3,0x4cb, +0x4d7,0x4d3,0x4df,0x4e7,0x4ef,0x4ff,0x506,0x4f7,0x50e,0x510,0x518,0x520,0x528,0x529,0x531,0x539, +0x541,0x529,0x549,0x54e,0x541,0x529,0x556,0x55e,0x528,0x566,0x56e,0x520,0x576,0x3b4,0x57e,0x582, +0x58a,0x58c,0x594,0x59c,0x528,0x5a4,0x5ac,0x520,0x42b,0x5b0,0x531,0x520,0x528,0x3b4,0x5b8,0x3b4, +0x3b4,0x5be,0x5c6,0x3b4,0x3b4,0x5ca,0x5d2,0x3b4,0x5d6,0x5dd,0x3b4,0x5e5,0x5ed,0x5f4,0x575,0x3b4, +0x3b4,0x5fc,0x604,0x60c,0x614,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x61c,0x3b4,0x624,0x3b4,0x3b4,0x3b4, +0x62c,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x634,0x3b4,0x3b4,0x3b4,0x63c,0x535,0x535,0x535,0x3b4,0x642,0x64a,0x624, +0x660,0x652,0x652,0x668,0x66f,0x658,0x3b4,0x3b4,0x3b4,0x677,0x67f,0x3b4,0x3b4,0x3b4,0x681,0x689, +0x691,0x3b4,0x698,0x6a0,0x3b4,0x6a8,0x402,0x5f7,0x565,0x6b0,0x6b8,0x6be,0x42b,0x6c6,0x3b4,0x6cd, +0x3b4,0x6d2,0x3b4,0x3b4,0x3b4,0x3b4,0x6d8,0x6e0,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x402,0x402, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x6e7,0x6ef,0x6f3, +0x70b,0x711,0x6fb,0x703,0x719,0x721,0x725,0x5f7,0x72d,0x735,0x73d,0x3b4,0x745,0x689,0x689,0x689, +0x755,0x75d,0x765,0x76d,0x772,0x77a,0x782,0x74d,0x78a,0x792,0x3b4,0x798,0x79f,0x689,0x689,0x689, +0x689,0x795,0x7a5,0x689,0x7ad,0x3b4,0x3b4,0x686,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689, +0x689,0x689,0x689,0x689,0x689,0x7b5,0x689,0x689,0x689,0x689,0x689,0x7bb,0x689,0x689,0x7c3,0x7cb, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x689,0x689,0x689,0x689,0x7db,0x7e3,0x7eb,0x7d3, +0x7fb,0x803,0x80b,0x812,0x819,0x821,0x825,0x7f3,0x689,0x689,0x689,0x82d,0x689,0x689,0x689,0x833, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x83b,0x3b4,0x3b4,0x3b4,0x6b9,0x3b4,0x3b4,0x3b4,0x402, +0x84b,0x853,0x856,0x843,0x85e,0x689,0x689,0x68c,0x689,0x689,0x689,0x689,0x689,0x689,0x865,0x86b, +0x87b,0x873,0x3b4,0x3b4,0x883,0x62c,0x3b4,0x3db,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x689,0x88b, +0x3e9,0x3b4,0x86b,0x88f,0x3b4,0x897,0x89f,0x3b4,0x3b4,0x3b4,0x3b4,0x8a3,0x3b4,0x3b4,0x681,0x3da, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x689,0x689, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x86b,0x689,0x5a2,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x8aa,0x3b4,0x3b4,0x8af,0x8b7,0x3b4,0x3b4,0x5d8,0x689,0x680,0x3b4,0x3b4,0x8bf,0x3b4,0x3b4,0x3b4, +0x8c7,0x8ce,0x652,0x8d6,0x3b4,0x3b4,0x5ae,0x8de,0x3b4,0x8e6,0x8ed,0x3b4,0x50e,0x8f2,0x3b4,0x527, +0x3b4,0x8fa,0x902,0x529,0x3b4,0x906,0x528,0x90e,0x3b4,0x3b4,0x3b4,0x914,0x3b4,0x3b4,0x3b4,0x91b, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x92f,0x923,0x927,0x4b3,0x4b3,0x4b3,0x937,0x4b3, +0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x93c,0x944,0x4b3,0x948,0x4b3,0x94e,0x952, +0x95a,0x962,0x966,0x96e,0x4b3,0x4b3,0x4b3,0x972,0x97a,0x3a4,0x982,0x98a,0x3b4,0x3b4,0x3b4,0x992, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0xed0,0xed0,0xf10,0xf50,0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xf88,0xfc8,0x1008,0x1018,0x1058,0x1064, +0xed0,0xed0,0x10a4,0xed0,0xed0,0xed0,0x10dc,0x111c,0x115c,0x119c,0x11d4,0x1214,0x1254,0x128c,0x12cc,0x130c, 0xa40,0xa80,0xac0,0xaff,0x1a0,0x1a0,0xb3f,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb77,0xba0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xbe0,0x1a0,0xc06,0xc41,0xc81,0xcc1,0xd01,0xd41,0xd81, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xbe0,0x1a0,0xc06,0xc41,0xc81,0xcc1,0xd01,0xd41,0xd80, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, -0xe01,0xe11,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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, +0xe00,0xe10,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,0xdc0, 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,0xdc1, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, 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,0xdc1, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x9a2,0x3b5,0x68a,0x68a,0x9aa,0x62d,0x3b5,0x522, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x9b2,0x3b5,0x3b5,0x3b5,0x9b9,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x9c1,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a, -0x9c9,0x9cd,0x44a,0x44a,0x44a,0x44a,0x9dd,0x9d5,0x44a,0x9e5,0x44a,0x44a,0x9ed,0x9f3,0x44a,0x44a, -0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0xa03,0x9fb,0xa13,0xa0b,0x44a,0x44a,0x44a,0x44a, -0x44a,0x44a,0x44a,0xa1b,0x44a,0xa23,0xa2b,0x4b7,0x44a,0xa33,0xa3a,0xa40,0xa48,0xa4c,0xa54,0x44a, -0x529,0xa5c,0xa63,0xa6a,0x42c,0xa72,0x577,0x3b5,0x50f,0xa79,0x3b5,0xa7f,0x42c,0xa84,0xa8c,0x3b5, -0x3b5,0xa91,0x529,0x3b5,0x3b5,0x3b5,0x84b,0xa99,0x42c,0x5b1,0x58c,0xaa0,0x3b5,0xaa6,0xaae,0x542, -0x3b5,0xa5c,0xab6,0x3b5,0x3b5,0xabe,0xac6,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xaca,0xad2,0x3b5, -0x3b5,0xada,0x58c,0xae2,0x3b5,0xae8,0x3b5,0x3b5,0xaee,0xaf6,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0xafb,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xb02,0xb0a,0x3b5,0x3b5,0x3b5,0xb0d,0x58c,0xb15, -0xb19,0xb21,0x3b5,0xb28,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xb30,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0xb34,0x3b5,0x3b5,0xb42,0xb3c,0x3b5,0x3b5,0x3b5,0xb4a,0xaec,0x3b5,0xb52,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x5b3,0x42c,0x9b9,0xab7,0x3b5,0x3b5,0x3b5,0xb5f,0xb5a,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0xb67,0xb6f,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x8bf, -0xb77,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xb7b,0x3b5,0xb81,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xa80,0x3b5,0xb87,0x3b5,0x3b5,0xb8f, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x543,0xb97,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x86d,0xb9b,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0xba3,0xbaa,0xbaa,0x403,0xbb2, -0x50e,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xbba,0xbc2,0xbc8,0x3b5, -0xbce,0x68a,0x68a,0xbd6,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a,0xbde,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xbe6,0x3dc,0xbed,0xbf3,0xbe9,0x3d7,0xbf0,0xbe4,0xbfb, -0xbff,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x403,0xc07,0x403,0xc0e,0xc15,0xc1d,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0xc25,0xc2d,0x3b5,0x3b5,0xa80,0x3b5,0x3b5,0x3b5,0x3b5,0xb81,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xaba,0x3b5,0xc32,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xc3a,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0xc3f,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0xc47,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0xc4f,0x44a,0xc57,0xc57,0xc5e,0x44a,0x44a,0x44a,0x44a, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xdc0, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x99a,0x3b4,0x689,0x689,0x9a2,0x62c,0x3b4,0x521, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x9aa,0x3b4,0x3b4,0x3b4,0x9b1,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x9b9,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a, +0x9c1,0x9c5,0x44a,0x44a,0x44a,0x44a,0x9d5,0x9cd,0x44a,0x9dd,0x44a,0x44a,0x9e5,0x9eb,0x44a,0x44a, +0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x9fb,0x9f3,0xa0b,0xa03,0x44a,0x44a,0x44a,0x44a, +0x44a,0x44a,0x44a,0xa13,0x44a,0xa1b,0xa2b,0xa23,0x44a,0xa33,0xa3a,0xa40,0xa48,0xa4c,0xa54,0x44a, +0x528,0xa5c,0xa63,0xa6a,0x42b,0xa72,0x576,0x3b4,0x50e,0xa79,0x3b4,0xa7f,0x42b,0xa84,0xa8c,0x3b4, +0x3b4,0xa91,0x528,0x3b4,0x3b4,0x3b4,0x6b9,0xa99,0x42b,0x5b0,0x58b,0xaa0,0x3b4,0x6ba,0xaa5,0x541, +0x3b4,0xa5c,0xaad,0x3b4,0x3b4,0xab5,0xabd,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xac1,0xac9,0x3b4, +0x3b4,0xad1,0x58b,0xad9,0x3b4,0xadf,0x3b4,0x3b4,0xae5,0xaed,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0xaf2,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xaf9,0xb01,0x3b4,0x3b4,0x3b4,0xb04,0x58b,0xb0c, +0xb10,0xb18,0x3b4,0xb1f,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xb27,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0xb2b,0x3b4,0x3b4,0xb39,0xb33,0x3b4,0x3b4,0x3b4,0xb41,0xae3,0x3b4,0xb49,0x3b4,0x3b4,0xb4f,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x5b2,0x42b,0x9b1,0xaae,0x3b4,0x3b4,0x3b4,0xb5c,0xb57,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0xb64,0xb6c,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x8b7, +0xb74,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xb78,0x3b4,0xb7e,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xa80,0x3b4,0xb84,0x3b4,0x3b4,0xb8c, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x542,0xb94,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x689,0x689,0x689,0x689,0x689,0x689,0x865,0xb98,0x689,0x689, +0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0xba0,0xbaf,0xba7,0x402,0xbb7, +0x50d,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xbbf,0x3b4,0xbc6,0xbce,0xbd4,0x3b4, +0xbda,0x689,0x689,0xbe2,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x689,0x689,0xbea,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xbf2,0x3db,0xbf9,0xbff,0xbf5,0x3d6,0xbfc,0xbf0,0xc07, +0xc0b,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x402,0xc13,0x402,0xc1a,0xc21,0xc29,0x3b4,0x3b4,0xc39,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0xc31,0xc41,0x3b4,0x3b4,0xa80,0x3b4,0x3b4,0x3b4,0x3b4,0xb7e,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xab1,0x3b4,0xc46,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xc4e,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0xc53,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xc5b,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0xc63,0x44a,0xc6b,0xc6b,0xc72,0x44a,0x44a,0x44a,0x44a, 0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a, -0x44a,0x44a,0x44a,0x44a,0x92f,0x4b4,0x4b4,0x44a,0x44a,0x4b4,0x4b4,0xc66,0x44a,0x44a,0x44a,0x44a, -0x44a,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x4b4,0x950,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a, -0x44a,0x68a,0xc6e,0x68a,0x68a,0x68d,0xc73,0xc77,0x86d,0xc7f,0x3d7,0x3b5,0xc85,0x3b5,0xc8a,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x79e,0x3b5,0x3b5,0x3b5,0x3b5,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0xc92,0x9aa,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0xc99, -0xca1,0xc6e,0x68a,0xca9,0x68a,0xcb1,0xcb6,0xcbe,0x3b5,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a,0x68a, -0x68a,0x68a,0x68a,0x68c,0xcc6,0xcce,0x68a,0xcd5,0xcdd,0x68a,0x68a,0x68a,0x68a,0xce5,0x68a,0x68a, -0xcea,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0xcf1,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5,0x3b5, -0xcf1,0xd01,0xcf9,0xcf9,0xcf9,0xd02,0xd02,0xd02,0xd02,0x403,0x403,0x403,0x403,0x403,0x403,0x403, -0xd0a,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd02,0x394,0x394,0x394,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, +0x44a,0x44a,0x44a,0x44a,0x927,0x4b3,0x4b3,0x44a,0x44a,0x4b3,0x4b3,0xc7a,0x44a,0x44a,0x44a,0x44a, +0x44a,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x4b3,0x948,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a, +0x44a,0x689,0xc82,0x689,0x689,0x68c,0xc87,0xc8b,0x865,0xc93,0x3d6,0x3b4,0xc99,0x3b4,0xc9e,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x796,0x3b4,0x3b4,0x3b4,0x3b4,0x689,0x689,0x689,0x689,0x689,0x689,0x689, +0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689, +0x689,0x689,0x689,0x689,0x689,0x689,0x689,0xba8,0x9a2,0x689,0x689,0x689,0x689,0x689,0x689,0xca6, +0xc82,0x689,0xcae,0x689,0xcb6,0xcbb,0xcc3,0x3b4,0x689,0x689,0x689,0x689,0x689,0x689,0x689,0x689, +0x689,0x689,0x68b,0xccb,0x689,0x689,0xcd3,0xcdb,0x689,0x689,0x689,0x689,0xce3,0x689,0x689,0xce8, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xcef, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0xcef, +0xcff,0xcf7,0xcf7,0xcf7,0xd00,0xd00,0xd00,0xd00,0x402,0x402,0x402,0x402,0x402,0x402,0x402,0xd08, +0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00, +0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00, +0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00, +0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00,0xd00, +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, -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, +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,0,0,0,0,0xa,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,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, +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,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, +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,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,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,0xa,0,0,0xa,0xa,4, -1,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,0, +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,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, +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,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,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,0x4d,0x4d,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,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, +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,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, +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,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, +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,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,0x81,0x81,0x81,0xb1,0xb1,0xb1,1,1,1,1, -0x4d,0xd,0x4d,0x4d,0x4d,0x4d,0xd,0x8d,0x4d,0x8d,0x8d,0xd,0xd,0xd,0xd,0xd, -0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x2d,0x2d,0x2d,0x4d,0xd,0xd,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d, -5,5,0xd,0xd,0xd,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,5,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +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,0x81,0x81,0x81,0xb1,0xb1,0xb1,1,1,1,1,0x4d,0xd,0x4d,0x4d, +0x4d,0x4d,0xd,0x8d,0x4d,0x8d,0x8d,0xd,0xd,0xd,0xd,0xd,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x2d, +0x2d,0x2d,0x4d,0xd,0xd,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,5,5,0xd,0xd, +0xd,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,5,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,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, -0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0xb1,0xb1,0xb1,0xb1,0xb1,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,0x4d,0x4d,0x4d,0x4d,0x8d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d, +0x4d,0xd,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,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,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,0,0,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,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, +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,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,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,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,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,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, +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,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,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,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,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,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,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,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,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,0xb1,0xb1,0xb1,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,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,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, -0,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,0xb1,0xb1,0,0,0,0, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,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,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, +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,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, 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, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, +0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -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, +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,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1, -0xb1,0xb1,0x12,0xb1,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,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, -0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, -0xa,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,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,0xb1, 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, +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,0,0, +0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,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,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +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,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,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,0,0,0, +0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xa0,0,0xa0,0,0,0, +0,0,0xa0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,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, @@ -471,7 +469,7 @@ static const uint16_t ubidi_props_trieIndex[13388]={ 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, +0xa,0x310a,0xf20a,0xa,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 4,4,4,4,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, @@ -487,7 +485,7 @@ static const uint16_t ubidi_props_trieIndex[13388]={ 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,0x900a,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, @@ -544,9 +542,9 @@ static const uint16_t ubidi_props_trieIndex[13388]={ 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,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,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a, 0,0,0,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, +0,0,0,0,0,0,0,0,0,0,0,0,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, @@ -664,9 +662,11 @@ static const uint16_t ubidi_props_trieIndex[13388]={ 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1, 1,1,1,1,1,1,1,0xb1,0xb1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0x8d,0x4d, -0x4d,0xd,0x4d,0x4d,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x6d,0x6d,0x6d,0x6d, +0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0xd,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xd,0xd,0x8d,0x4d, +0x4d,0xd,0x4d,0x4d,0xd,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0x4d,0x4d,0x4d,0x8d, 0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0xd,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x8d,0xd,0xd,0xd, @@ -696,75 +696,78 @@ static const uint16_t ubidi_props_trieIndex[13388]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, 0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xb1,0,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0xb1,0,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,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,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0, +0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,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,0xb1,0xb1, -0xb1,0,0xb1,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0xb1,0,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,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,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0, +0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0,0xb1,0,0,0,0,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,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, -0xb1,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -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,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,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,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,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,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,0xa0,0xa0,0xa0,0xa0, -0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xb1,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,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0xb1,0xb1,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,0xb1,0,0xb1,0xb1, +0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,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, -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,0xb2,0xb2,0xb2,0xb2, +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,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,0,0,0, +0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, -2,2,2,2,2,2,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, +0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0, +0xb1,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, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,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,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,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, +0xb2,0xb2,0xb2,0xb2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,0xa,0xa,0xa,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,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,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0xb1, +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,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,0,0xa,0xa, +0xa,0,0,0,0,0,0,0,0,0x100a,0x100a,0x100a,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,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,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, @@ -773,7 +776,7 @@ static const uint16_t ubidi_props_trieIndex[13388]={ 0,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,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,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0xb1,0xb1,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, 0,0,0,0,0,0,0,0,0,0xa,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -793,7 +796,9 @@ static const uint16_t ubidi_props_trieIndex[13388]={ 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,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x300a,0xf00a,0xa,0xa, +0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0x100a, +0xa,0,0,0,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,0,0,0,0,0,0,0,0, @@ -820,46 +825,41 @@ static const uint16_t ubidi_props_trieIndex[13388]={ 0,0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,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, -0,0,0,0,0xa,0,0,0,0,0,0,0,0,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,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0,0,0,0,0,0, +0xa,0xa,0,0xa,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,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,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0,0, -0,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,0, -0,0,0,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,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,2,2,2,2,2,2,2,2, -2,2,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, +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,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,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,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0,0xa,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,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,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, +2,2,2,2,2,2,2,2,2,2,0xa,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, +0,0,0,0,0,0,0,0,0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, -0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +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, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0,0,0,0 +0,0,0,0 }; -static const uint32_t ubidi_props_mirrors[40]={ -0x2000ab,0xbb,0x4202215,0x4e0221f,0x3e02220,0x3a02221,0x3c02222,0x4c02224,0x2202243,0x1402245,0x120224c,0x4002298,0x44022a6,0x48022a8,0x46022a9,0x4a022ab, -0x38022b8,0x10022cd,0x2e022f2,0x30022f3,0x32022f4,0x34022f6,0x36022f7,0x24022fa,0x26022fb,0x28022fc,0x2a022fd,0x2c022fe,0x20027dc,0xa0299b,0xc029a0,0x8029a3, -0x16029b8,0x4029f5,0x1802ade,0x1c02ae3,0x1a02ae4,0x1e02ae5,0xe02aee,0x602bfe +static const uint32_t ubidi_props_mirrors[42]={ +0x2000ab,0xbb,0x4402215,0x520221d,0x500221f,0x4002220,0x3c02221,0x3e02222,0x4e02224,0x2402243,0x1602245,0x140224c,0x4202298,0x46022a6,0x4a022a8,0x48022a9, +0x4c022ab,0x3a022b8,0x12022cd,0x30022f2,0x32022f3,0x34022f4,0x36022f6,0x38022f7,0x26022fa,0x28022fb,0x2a022fc,0x2c022fd,0x2e022fe,0x22027dc,0xc0299b,0xe029a0, +0xa029a3,0x18029b8,0x4029f5,0x1a02ade,0x1e02ae3,0x1c02ae4,0x2002ae5,0x1002aee,0x802bfe,0x61db10 }; -static const uint8_t ubidi_props_jgArray[684]={ +static const uint8_t ubidi_props_jgArray[681]={ 0x68,0,3,3,0x2c,3,0x2d,3,4,0x2a,4,4,0xd,0xd,0xd,6, 6,0x1f,0x1f,0x23,0x23,0x21,0x21,0x28,0x28,1,1,0xb,0xb,0x37,0x37,0x37, 0,9,0x1d,0x13,0x16,0x18,0x1a,0x10,0x2c,0x2d,0x2d,0,0,0,0,0, @@ -902,10 +902,10 @@ static const uint8_t ubidi_props_jgArray[684]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 4,4,0xd,0x28,9,0x1d,0x16,0x18,0x2d,0x2d,0x1f,0x2c,0x39,0,6,0x21, 0xb,0x55,0x1f,1,0x13,0x1d,4,4,4,0x1f,0x2d,0x56,0x58,0x57,4,4, -4,0xd,0xb,1,0x58,0xd,0xd,0x16,0xb,0,0,0 +4,0xd,0xb,1,0x58,0xd,0xd,0x16,0xb }; -static const uint8_t ubidi_props_jgArray2[1032]={ +static const uint8_t ubidi_props_jgArray2[1071]={ 0x3a,0x3c,0x3c,0x40,0x40,0x3d,0,0x52,0,0x54,0x54,0,0,0x41,0x4f,0x53, 0x43,0x43,0x43,0x44,0x3e,0x50,0x45,0x46,0x4c,0x3b,0x3b,0x48,0x48,0x4b,0x49,0x49, 0x49,0x4a,0,0,0x4d,0,0,0,0,0,0,0x47,0x3f,0x4e,0x51,0x42, @@ -970,7 +970,9 @@ static const uint8_t ubidi_props_jgArray2[1032]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,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,0x28,0x13,0,0x69,0x2d +0,0,6,0x28,0x13,0,0x69,0x2d,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x6b,0x6b,0x6b,0x6b,0x6d,0x6d,0x6d, +0x72,0x72,0x71,0x71,0x73,0x73,0x6a,0x6a,0x6c,0x6c,0x6f,0x70,0x6b,0x6e,0x6b }; static const UBiDiProps ubidi_props_singleton={ @@ -981,16 +983,16 @@ static const UBiDiProps ubidi_props_singleton={ ubidi_props_jgArray2, { ubidi_props_trieIndex, - ubidi_props_trieIndex+3668, + ubidi_props_trieIndex+3664, nullptr, - 3668, - 9720, + 3664, + 9716, 0x1a0, - 0xed4, + 0xed0, 0x0, 0x0, 0x110000, - 0x3448, + 0x3440, nullptr, 0, false, false, 0, nullptr }, { 2,2,0,0 } diff --git a/deps/icu-small/source/common/ubidiimp.h b/deps/icu-small/source/common/ubidiimp.h index e48fc6f94162..4a3b516a9709 100644 --- a/deps/icu-small/source/common/ubidiimp.h +++ b/deps/icu-small/source/common/ubidiimp.h @@ -25,6 +25,20 @@ #include "ubidi_props.h" /* miscellaneous definitions ---------------------------------------------- */ +/* + * Internal option bit for ubidi_writeReordered() and doWriteReverse(): + * Used exclusively by setParaRunsOnly() during Scheme 9 (LOGICAL, RTL => LOGICAL, LTR) + * BidiTransform transformations. When mirroring changes code point length (e.g., U+1DB10 + * contracting back to U+221D), setParaRunsOnly() requires that the temporary visualText + * buffer maintain 1-to-1 code unit synchronization with pBiDi->length (4) to prevent + * array desynchronization in the subsequent ubidi_setPara call. + * + * When this flag is set, doWriteReverse() steps source indices by destination code unit + * length (j += k) instead of original base character length (j += origBaseLen), preserving + * legacy ICU behavior where the trailing surrogate half (which has Bidi class LTR) is copied + * into visualText, allowing ubidi_setPara to correctly split the run for reordering. + */ +#define UBIDI_INTERNAL_RUNS_ONLY 64 // ICU-20853=ICU-20935 Solaris #defines CS and ES in sys/regset.h #ifdef CS @@ -441,7 +455,7 @@ typedef union { /* helper function to (re)allocate memory if allowed */ U_CFUNC UBool -ubidi_getMemory(BidiMemoryForAllocation *pMemory, int32_t *pSize, UBool mayAllocate, int32_t sizeNeeded); +ubidi_getMemory(BidiMemoryForAllocation *pMemory, int32_t *pSize, UBool mayAllocate, size_t sizeNeeded); /* helper macros for each allocated array in UBiDi */ #define getDirPropsMemory(pBiDi, length) \ diff --git a/deps/icu-small/source/common/ubidiln.cpp b/deps/icu-small/source/common/ubidiln.cpp index 65e1212c7b26..df9d1165096a 100644 --- a/deps/icu-small/source/common/ubidiln.cpp +++ b/deps/icu-small/source/common/ubidiln.cpp @@ -258,8 +258,8 @@ ubidi_getLevelAt(const UBiDi *pBiDi, int32_t charIndex) { } } -U_CAPI const UBiDiLevel * U_EXPORT2 -ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { +U_CAPI const UBiDiLevel* U_EXPORT2 +ubidi_getLevels(UBiDi* pBiDi, UErrorCode* pErrorCode) { int32_t start, length; RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, nullptr); @@ -544,7 +544,7 @@ static int32_t getRunFromLogicalIndex(UBiDi *pBiDi, int32_t logicalIndex) { * negative number of BiDi control characters within this run. */ U_CFUNC UBool -ubidi_getRuns(UBiDi *pBiDi, UErrorCode*) { +ubidi_getRuns(UBiDi *pBiDi, UErrorCode* pErrorCode) { /* * This method returns immediately if the runs are already set. This * includes the case of length==0 (handled in setPara).. @@ -607,6 +607,7 @@ ubidi_getRuns(UBiDi *pBiDi, UErrorCode*) { if(getRunsMemory(pBiDi, runCount)) { runs=pBiDi->runsMemory; } else { + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; return false; } diff --git a/deps/icu-small/source/common/ubiditransform.cpp b/deps/icu-small/source/common/ubiditransform.cpp index a39cc3100d2b..e317815882cc 100644 --- a/deps/icu-small/source/common/ubiditransform.cpp +++ b/deps/icu-small/source/common/ubiditransform.cpp @@ -308,17 +308,25 @@ action_mirror(UBiDiTransform *pTransform, UErrorCode *pErrorCode) if (0 == (pTransform->reorderingOptions & UBIDI_DO_MIRRORING)) { return false; } - if (pTransform->destSize < pTransform->srcLength) { - *pErrorCode = U_BUFFER_OVERFLOW_ERROR; - return false; - } do { UBool isOdd = ubidi_getLevelAt(pTransform->pBidi, i) & 1; U16_NEXT(pTransform->src, i, pTransform->srcLength, c); - U16_APPEND_UNSAFE(pTransform->dest, j, isOdd ? u_charMirror(c) : c); + if (isOdd) { + c = u_charMirror(c); + } + uint32_t k = U16_LENGTH(c); + if (j + k <= pTransform->destSize) { + U16_APPEND_UNSAFE(pTransform->dest, j, c); + } else { + j += k; + } } while (i < pTransform->srcLength); - *pTransform->pDestLength = pTransform->srcLength; + *pTransform->pDestLength = j; + if (pTransform->destSize < j) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + return false; + } pTransform->reorderingOptions = UBIDI_REORDER_DEFAULT; return true; } @@ -526,5 +534,5 @@ ubiditransform_transform(UBiDiTransform *pBiDiTransform, pBiDiTransform->srcLength = 0; pBiDiTransform->destSize = 0; } - return U_FAILURE(*pErrorCode) ? 0 : destLength; + return (U_FAILURE(*pErrorCode) && *pErrorCode != U_BUFFER_OVERFLOW_ERROR) ? 0 : destLength; } diff --git a/deps/icu-small/source/common/ubidiwrt.cpp b/deps/icu-small/source/common/ubidiwrt.cpp index 209b140722cb..d2d60c9211a9 100644 --- a/deps/icu-small/source/common/ubidiwrt.cpp +++ b/deps/icu-small/source/common/ubidiwrt.cpp @@ -37,8 +37,7 @@ * ("minimum-length-problem" of UTF-8) * - The BiDi control characters need only one code unit each * - * Further assumptions for all UTFs: - * - u_charMirror(c) needs the same number of code units as c + * Note: Since Unicode 18, u_charMirror(c) may change the number of code units. */ #if defined(UTF_SIZE) && UTF_SIZE==8 # error reimplement ubidi_writeReordered() for UTF-8, see comment above @@ -60,6 +59,10 @@ doWriteForward(const char16_t *src, int32_t srcLength, char16_t *dest, int32_t destSize, uint16_t options, UErrorCode *pErrorCode) { + if (srcLength<=0) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } /* optimize for several combinations of options */ switch(options&(UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING)) { case 0: { @@ -78,16 +81,30 @@ doWriteForward(const char16_t *src, int32_t srcLength, /* do mirroring */ int32_t i=0, j=0; UChar32 c; - - if(destSize srcLength) { + return j; + } + /* If mirroring caused code unit contraction (e.g., U+1DB10 contracting to U+221D), + * pad trailing array slots up to srcLength to avoid leaving uninitialized memory. + * If j > 0, repeat the preceding code unit; if j == 0, fallback to 0x0020 (ASCII space). + */ + while(j < srcLength && j < destSize) { + dest[j] = j > 0 ? dest[j - 1] : 0x0020; + j++; + } return srcLength; } case UBIDI_REMOVE_BIDI_CONTROLS: { @@ -116,7 +133,6 @@ doWriteForward(const char16_t *src, int32_t srcLength, } default: { /* remove BiDi control characters and do mirroring */ - int32_t remaining=destSize; int32_t i, j=0; UChar32 c; do { @@ -125,24 +141,18 @@ doWriteForward(const char16_t *src, int32_t srcLength, src+=i; srcLength-=i; if(!IS_BIDI_CONTROL_CHAR(c)) { - remaining-=i; - if(remaining<0) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - - /* preflight the length */ - while(srcLength>0) { - c=*src++; - if(!IS_BIDI_CONTROL_CHAR(c)) { - --remaining; - } - --srcLength; - } - return destSize-remaining; - } c=u_charMirror(c); - U16_APPEND_UNSAFE(dest, j, c); + int32_t charLen = U16_LENGTH(c); + if(j + charLen <= destSize) { + int32_t temp = j; + U16_APPEND_UNSAFE(dest, temp, c); + } + j += charLen; } } while(srcLength>0); + if(destSize < j) { + *pErrorCode = U_BUFFER_OVERFLOW_ERROR; + } return j; } } /* end of switch */ @@ -174,6 +184,11 @@ doWriteReverse(const char16_t *src, int32_t srcLength, int32_t i, j; UChar32 c; + if(srcLength<=0) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + /* optimize for several combinations of options */ switch(options&(UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING|UBIDI_KEEP_BASE_COMBINING)) { case 0: @@ -195,7 +210,7 @@ doWriteReverse(const char16_t *src, int32_t srcLength, i=srcLength; /* collect code units for one base character */ - U16_BACK_1(src, 0, srcLength); + U16_PREV(src, 0, srcLength, c); /* copy this base character */ j=srcLength; @@ -234,74 +249,133 @@ doWriteReverse(const char16_t *src, int32_t srcLength, } while(j0); break; - default: + default: { /* - * With several "complicated" options set, this is the most - * general and the slowest copying of an RTL run. - * We will do mirroring, remove BiDi controls, and - * keep combining characters with their base characters - * as requested. + * Note on UBIDI_INTERNAL_RUNS_ONLY: + * This internal flag is passed exclusively by setParaRunsOnly() in ubidi.cpp during + * Scheme 9 (LOGICAL, RTL => LOGICAL, LTR) BidiTransform transformations. + * When mirroring contracts a code point (e.g., U+1DB10 contracting to U+221D), + * setParaRunsOnly() requires legacy ICU 1-to-1 code unit stepping (j += k) and + * returning destSize (which equals srcLength). This prevents array desynchronization + * between visualLength and pBiDi->length, and allows the trailing surrogate half + * of U+1DB10 (which has Bidi class LTR) to be copied into visualText to split + * the run for reordering. + * + * For all other calls (direct user API calls to ubidi_writeReverse, or normal + * reordering), we use character stepping (j += origBaseLen) and return destLength, + * which correctly handles expansion and contraction without leaking broken surrogates. */ - if(!(options&UBIDI_REMOVE_BIDI_CONTROLS)) { - i=srcLength; - } else { - /* we need to find out the destination length of the run, - which will not include the BiDi control characters */ - int32_t length=srcLength; - char16_t ch; - - i=0; + if(options&UBIDI_INTERNAL_RUNS_ONLY) { + if(!(options&UBIDI_REMOVE_BIDI_CONTROLS)) { + i=srcLength; + } else { + int32_t length=srcLength; + char16_t ch; + i=0; + /* Loop over all code units in the source run to count those that are not Bidi control characters, + * determining the required destination buffer length for preflighting when UBIDI_REMOVE_BIDI_CONTROLS is set. + */ + do { + ch=*src++; + if(!IS_BIDI_CONTROL_CHAR(ch)) { + ++i; + } + } while(--length>0); + src-=srcLength; + } + if(destSize0 && IS_COMBINING(u_charType(c))) { + U16_PREV(src, 0, srcLength, c); + } } - } while(--length>0); - src-=srcLength; - } - - if(destSize0); + if(destSize0 && IS_COMBINING(u_charType(c))) { U16_PREV(src, 0, srcLength, c); } } - if(options&UBIDI_REMOVE_BIDI_CONTROLS && IS_BIDI_CONTROL_CHAR(c)) { - /* do not copy this BiDi control character */ continue; } - /* copy this "user character" */ + int32_t origBaseLen=U16_LENGTH(c); j=srcLength; if(options&UBIDI_DO_MIRRORING) { /* mirror only the base character */ - int32_t k=0; c=u_charMirror(c); - U16_APPEND_UNSAFE(dest, k, c); - dest+=k; - j+=k; + int32_t k=U16_LENGTH(c); + if(destLength+k<=destSize) { + int32_t temp=destLength; + U16_APPEND_UNSAFE(dest, temp, c); + } + destLength+=k; + j+=origBaseLen; } while(j0); - break; - } /* end of switch */ + + if(destSize0 &&*/ runLength > 0 && // doWriteForward may return 0 if src // only include bidi control chars - !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+runLength-1]))) { + !(MASK_R_AL&DIRPROP_FLAG(dirProps[logicalStart+originalRunLength-1]))) { if(destSize>0) { *dest++=RLM_CHAR; } diff --git a/deps/icu-small/source/common/ubrk.cpp b/deps/icu-small/source/common/ubrk.cpp index 712ce497161c..c2f95c5d7629 100644 --- a/deps/icu-small/source/common/ubrk.cpp +++ b/deps/icu-small/source/common/ubrk.cpp @@ -300,7 +300,7 @@ ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, U_CAPI const char* U_EXPORT2 -ubrk_getLocaleByType(const UBreakIterator *bi, +ubrk_getLocaleByType(const UBreakIterator* bi U_LIFETIME_BOUND, ULocDataLocaleType type, UErrorCode* status) { diff --git a/deps/icu-small/source/common/ucase_props_data.h b/deps/icu-small/source/common/ucase_props_data.h index a34fdd318e35..67462c2b46c9 100644 --- a/deps/icu-small/source/common/ucase_props_data.h +++ b/deps/icu-small/source/common/ucase_props_data.h @@ -9,11 +9,11 @@ #ifdef INCLUDED_FROM_UCASE_CPP -static const UVersionInfo ucase_props_dataVersion={0x11,0,0,0}; +static const UVersionInfo ucase_props_dataVersion={0x12,0,0,0}; -static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x7a14,0x69e0,0x688,0x172,0,0,0,0,0,0,0,0,0,0,3}; +static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x7cc4,0x6b40,0x69c,0x206,0,0,0,0,0,0,0,0,0,0,3}; -static const uint16_t ucase_props_trieIndex[13544]={ +static const uint16_t ucase_props_trieIndex[13720]={ 0x363,0x36b,0x373,0x37b,0x389,0x391,0x399,0x3a1,0x3a9,0x3b1,0x3b8,0x3c0,0x3c8,0x3d0,0x3d8,0x3e0, 0x3e6,0x3ee,0x3f6,0x3fe,0x406,0x40e,0x416,0x41e,0x426,0x42e,0x436,0x43e,0x446,0x44e,0x456,0x45e, 0x466,0x46e,0x476,0x47e,0x486,0x48e,0x496,0x49e,0x49a,0x4a2,0x4a7,0x4af,0x4b6,0x4be,0x4c6,0x4ce, @@ -99,7 +99,7 @@ static const uint16_t ucase_props_trieIndex[13544]={ 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x72a,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x8a0,0x382,0x8a8,0x8ad,0x8b5,0x382,0x382,0x8bd,0x8c5,0x8cd,0x3a9,0x8d2,0x8da,0x8e0,0x8e7,0x8ef, 0x8f7,0x8fe,0x382,0x382,0x382,0x382,0x905,0x90d,0x382,0x915,0x91c,0x382,0x55e,0x921,0x929,0x6be, -0x382,0x92f,0x937,0x93b,0x382,0x943,0x94b,0x953,0x382,0x959,0x95d,0x965,0x975,0x96d,0x382,0x97d, +0x382,0x92f,0x937,0x93b,0x382,0x943,0x94b,0x953,0x382,0x959,0x95f,0x967,0x977,0x96f,0x382,0x97f, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, @@ -139,9 +139,9 @@ static const uint16_t ucase_props_trieIndex[13544]={ 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x985,0x382,0x382,0x382,0x382,0x98d,0x55e,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x987,0x382,0x382,0x382,0x382,0x98f,0x55e,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x992,0x99a,0x99e,0x382,0x382,0x382,0x382,0x365,0x36b,0x9a6,0x9ae,0x9b5,0x519,0x382,0x382,0x9bd, +0x994,0x99c,0x9a0,0x382,0x382,0x382,0x382,0x365,0x36b,0x9a8,0x9b0,0x9b7,0x519,0x382,0x382,0x9bf, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0xe0c,0xe0c,0xe24,0xe64,0xea4,0xee0,0xf20,0xf60,0xf98,0xfd8,0x1018,0x1058,0x1098,0x10d8,0x1118,0x1158, @@ -173,61 +173,61 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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, 0xd4b,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x9c4,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x9cc,0x382,0x382,0x382,0x9cf,0x382,0x382,0x382, -0x382,0x9d7,0x9dd,0x9e1,0x382,0x382,0x9e5,0x9e9,0x9ef,0x382,0x382,0x382,0x9f6,0x9fa,0xa02,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa12,0xa0a,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa1a, -0xa1e,0x382,0x382,0x382,0x382,0x382,0xa26,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0xa2e,0xa32,0xa3a,0xa3e,0x382,0xa45,0xa4a,0xa51,0xa58,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0xa5e,0x573,0xa62,0x382,0x382,0xa6a,0x382,0xa72,0x382,0x382,0x382,0x574, -0xa74,0xa7b,0xa7f,0x5f3,0xa87,0xa8f,0x382,0xa97,0xa9e,0x382,0xaa4,0x5f3,0xaa9,0xab1,0x382,0x382, -0xab6,0x574,0x382,0x382,0x382,0x365,0xabe,0x5f3,0x5f5,0xac6,0xacd,0x382,0xa99,0xad5,0x58d,0x382, -0xa74,0xadd,0x382,0x382,0xae5,0xaed,0x382,0x382,0x382,0x382,0x382,0x382,0xaf1,0xaf9,0x382,0x382, -0xb01,0x4dd,0x382,0x382,0xb09,0x382,0x382,0xb0f,0xb17,0x382,0x382,0x382,0x382,0x382,0x382,0xb1c, -0x382,0x382,0x382,0xb24,0xb2c,0x382,0x382,0xb34,0xb3c,0x382,0x382,0x382,0xb3f,0x9cc,0xb47,0xb4b, -0xb53,0x382,0xb5a,0x382,0x382,0x382,0x382,0x382,0x382,0xb62,0x382,0x382,0x382,0x382,0x382,0xb66, -0x382,0x382,0x98d,0xb6e,0x382,0x382,0x382,0xb74,0xb7c,0x382,0xb80,0x382,0x94c,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0xb86,0x5f3,0xb8c,0xb94,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x9c6,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x9ce,0x382,0x382,0x382,0x9d1,0x382,0x382,0x382, +0x382,0x9d9,0x9df,0x9e3,0x382,0x382,0x9e7,0x9eb,0x9f1,0x382,0x382,0x382,0x9f8,0x9fc,0xa04,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa14,0xa0c,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa1c, +0xa20,0x382,0x382,0x382,0x382,0x382,0xa28,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0xa30,0xa34,0xa3c,0xa40,0x382,0xa47,0xa4c,0xa53,0xa5a,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0xa60,0xa67,0xa6b,0x382,0x382,0xa73,0x382,0xa7b,0x382,0x382,0x382,0x574, +0xa7d,0xa84,0xa88,0x5f3,0xa90,0xa98,0x382,0xaa0,0xaa7,0x382,0xaad,0x5f3,0xab2,0xaba,0x382,0x382, +0xabf,0x574,0x382,0x382,0x382,0x365,0xac7,0x5f3,0x5f5,0xacf,0xad6,0x382,0xaa2,0xade,0x58d,0x382, +0xa7d,0xae6,0x382,0x382,0xaee,0xaf6,0x382,0x382,0x382,0x382,0x382,0x382,0xafa,0xb02,0x382,0x382, +0xb0a,0x4dd,0x382,0x382,0xb12,0x382,0x382,0xb18,0xb20,0x382,0x382,0x382,0x382,0x382,0x382,0xb25, +0x382,0x382,0x382,0xb2d,0xb35,0x382,0x382,0xb3d,0xb45,0x382,0x382,0x382,0xb48,0x9ce,0xb50,0xb54, +0xb5c,0x382,0xb63,0x382,0x382,0x382,0x382,0x382,0x382,0xb6b,0x382,0x382,0x382,0x382,0x382,0xb6f, +0x382,0x382,0x98f,0xb77,0x382,0x382,0x382,0xb7d,0xb85,0x382,0xb89,0x382,0x94c,0x9b7,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0xb8f,0x5f3,0xb95,0xb9d,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xb9b,0xba3,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xba4,0xbac,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x519,0xbab,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x519,0xbb4,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0xbaf,0x382,0xbb5,0x5b1,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x55e,0xb88,0x382,0x382,0x382,0x382,0x382,0x382,0xb24,0xb2c,0x382,0xbbd, -0xbc4,0x382,0x382,0x382,0x6b4,0x382,0xbc9,0x382,0x382,0xbd1,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0xbb8,0x382,0xbbe,0x5b1,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x55e,0xb91,0x382,0x382,0x382,0x382,0x382,0x382,0xb2d,0xb35,0x382,0xbc6, +0xbcd,0x382,0x382,0x382,0x6b4,0x382,0xbd2,0x382,0x382,0xbda,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbd6,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbdf,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbde,0x5b1, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xbe7,0x5b1, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8c5,0xbe6,0xbed,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0xbf4,0xbfc,0xc02,0x382,0x382,0x382,0x382,0xc0a,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xc12,0xc1a,0xc1f,0xc25,0xc2d, -0xc35,0xc3d,0xc16,0xc45,0xc4d,0xc55,0xc5c,0xc17,0xc12,0xc1a,0xc15,0xc25,0xc18,0xc13,0xc64,0xc16, -0xc6c,0xc74,0xc7c,0xc83,0xc6f,0xc77,0xc7f,0xc86,0xc72,0xc8e,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8c5,0xc96,0x8c5,0xc9d,0xca4,0xcac, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8c5,0xbef,0xbf6,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0xbfd,0x382,0xc04,0xc0c,0xc12,0x382,0x382,0x382,0x382,0xc1a,0x382,0xc22, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xc2a,0xc32,0xc37,0xc3d,0xc45, +0xc4d,0xc55,0xc2e,0xc5d,0xc65,0xc6d,0xc74,0xc2f,0xc2a,0xc32,0xc2d,0xc3d,0xc30,0xc2b,0xc7c,0xc2e, +0xc84,0xc8c,0xc94,0xc9b,0xc87,0xc8f,0xc97,0xc9e,0xc8a,0xca6,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x8c5,0xcae,0x8c5,0xcb5,0xcbc,0xcc4, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0xcbc,0xcc4,0x382,0x382,0x382,0x382,0x382,0x382,0xcb4,0xccc,0xcdf,0xcd2,0xcd7,0x382, -0x382,0x382,0x382,0xce7,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xae1, -0x382,0xa43,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0xcef,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xcf4,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0xcfc,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xd04,0x382,0xd0c,0xd14,0xd1b,0x382, +0x382,0x382,0xccc,0x74e,0xcd4,0xcda,0xce2,0x382,0xce8,0x756,0xcf0,0xcf8,0xd0b,0xcfe,0xd03,0x382, +0x382,0x382,0x382,0xd13,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xaea, +0x382,0xa45,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0xd1b,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xd20,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0xd28,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xd30,0x382,0xd38,0xd40,0xd47,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0xc0e,0xd23,0xd23,0xd29,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, -0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xa99,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0xc26,0xd4f,0xd4f,0xd55,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0xaa2,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x574,0x8c5,0x8c5,0x8c5,0x382, -0x382,0x382,0x382,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0xd31,0x382,0x382,0x382,0x382,0x382, +0x382,0x382,0x382,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0x8c5,0xd5d,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382, 0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x382,0x362,0,0,0,0, @@ -246,62 +246,62 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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, +0x1012,0x1012,0x1012,0x239,0xf011,0xf011,0xf011,0xf011,0xf011,0x2f9,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,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,0x33a,0xff91,0x92,0xff91, +0x92,0xff91,0x33a,0xffb1,0x35a,0x3a9,0x92,0xff91,0x92,0xff91,0x92,0xff91,1,0x92,0xff91,0x92, +0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x3f9,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, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0xc392,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x479, 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,0x489,0x6992,0x6a92,0x4111,0x6b12, +0x6592,0x92,0xff91,0x6692,0x6792,0x3091,0x6992,0x6892,0x92,0xff91,0x5191,0x4a9,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,0x4aa,0x4db,0x519,0x54a,0x57b,0x5b9,0x5ea,0x61b,0x659,0x92,0xff91,0x92, +0,0,0,0,0x4ca,0x4fb,0x539,0x56a,0x59b,0x5d9,0x60a,0x63b,0x679,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, -0x689,0x70a,0x73b,0x779,0x92,0xff91,0xcf92,0xe412,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x6a9,0x72a,0x75b,0x799,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,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,0x7aa,0x92,0xff91,0xae92,0x7ca,0x7e9,0x7e9,0x92,0xff91,0x9e92,0x2292,0x2392,0x92,0xff91, -0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x809,0x829,0x849,0x9711,0x9911,1,0x9991,0x9991, -1,0x9b11,1,0x9a91,0x869,1,1,1,0x9991,0x889,1,0x9891,0x8a9,0x8c9,0x8e9,1, -0x97b1,0x9691,0x8e9,0x909,0x929,1,1,0x9691,1,0x949,0x9591,1,1,0x9511,1,1, -1,1,1,1,1,0x969,1,1,0x9311,1,0x989,0x9311,1,1,1,0x9a9, +1,1,0x7ca,0x92,0xff91,0xae92,0x7ea,0x809,0x809,0x92,0xff91,0x9e92,0x2292,0x2392,0x92,0xff91, +0x92,0xffb1,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x829,0x849,0x869,0x9711,0x9911,1,0x9991,0x9991, +1,0x9b11,1,0x9a91,0x889,1,1,1,0x9991,0x8a9,1,0x9891,0x8c9,0x8e9,0x909,1, +0x97b1,0x9691,0x909,0x929,0x949,1,1,0x9691,1,0x969,0x9591,1,1,0x9511,1,0x989, +1,1,1,1,0x989,0x9a9,1,1,0x9311,1,0x9c9,0x9311,1,1,1,0x9e9, 0x9311,0xdd91,0x9391,0x9391,0xdc91,1,1,1,1,1,0x9291,1,0,0,1,1, -1,1,1,1,1,0x9c9,0x9e9,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xa09,0xa29,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,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0xa0c, +4,4,4,4,4,4,4,4,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0xa4c, 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,0xa1d,0x44,0x64, +0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0xa5d,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,0xa69,0x1012,0xb3a,0x1012,0x1012,0xb7a,0x1012,0x1012, -0xbba,0xc0a,0xc5a,0x1012,0xc9a,0x1012,0x1012,0x1012,0xcda,0xd1a,0,0xd5a,0x1012,0x1012,0xd9a,0x1012, -0x1012,0xdda,0x1012,0x1012,0xed11,0xed91,0xed91,0xed91,0xe19,0xf011,0xee9,0xf011,0xf011,0xf29,0xf011,0xf011, -0xf69,0xfb9,0x1009,0xf011,0x1049,0xf011,0xf011,0xf011,0x1089,0x10c9,0x1109,0x1139,0xf011,0xf011,0x1179,0xf011, -0xf011,0x11b9,0xf011,0xf011,0xe011,0xe091,0xe091,0x412,0x11f9,0x1229,2,2,2,0x1279,0x12a9,0xfc11, +0x1292,0x1292,0x1292,0,0x2012,0,0x1f92,0x1f92,0xaa9,0x1012,0xb7a,0x1012,0x1012,0xbba,0x1012,0x1012, +0xbfa,0xc4a,0xc9a,0x1012,0xcda,0x1012,0x1012,0x1012,0xd1a,0xd5a,0,0xd9a,0x1012,0x1012,0xdda,0x1012, +0x1012,0xe1a,0x1012,0x1012,0xed11,0xed91,0xed91,0xed91,0xe59,0xf011,0xf29,0xf011,0xf011,0xf69,0xf011,0xf011, +0xfa9,0xff9,0x1049,0xf011,0x1089,0xf011,0xf011,0xf011,0x10c9,0x1109,0x1149,0x1179,0xf011,0xf011,0x11b9,0xf011, +0xf011,0x11f9,0xf011,0xf011,0xe011,0xe091,0xe091,0x412,0x1239,0x1269,2,2,2,0x12b9,0x12e9,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,0x12d9,0x1309,0x391,0xc631,0x133a,0x1389,0,0x92, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x1319,0x1349,0x391,0xc631,0x137a,0x13c9,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,0x13ba,0x1012,0x13fa,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x143a,0x1012,0x1012,0x147a,0x14ba,0x1012,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x150a,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0x1549,0xf011,0x1589,0xf011,0xf011,0xf011, -0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x15c9,0xf011,0xf011,0x1609,0x1649,0xf011,0xf011,0xf011,0xf011,0xf011, -0xf011,0xf011,0x1699,0xf011,0xf011,0xf011,0xf011,0xf011,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd831,0xd811, -0xd831,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0x92,0xff91,0x16da,0x1719,0x92,0xff91,0x92,0xff91, +0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x2812,0x1012,0x1012,0x13fa,0x1012,0x143a,0x1012,0x1012,0x1012, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x147a,0x1012,0x1012,0x14ba,0x14fa,0x1012,0x1012,0x1012,0x1012,0x1012, +0x1012,0x1012,0x154a,0x1012,0x1012,0x1012,0x1012,0x1012,0xf011,0xf011,0x1589,0xf011,0x15c9,0xf011,0xf011,0xf011, +0xf011,0xf011,0xf011,0xf011,0xf011,0xf011,0x1609,0xf011,0xf011,0x1649,0x1689,0xf011,0xf011,0xf011,0xf011,0xf011, +0xf011,0xf011,0x16d9,0xf011,0xf011,0xf011,0xf011,0xf011,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd831,0xd811, +0xd831,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0xd811,0x92,0xff91,0x171a,0x1759,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, @@ -313,14 +313,14 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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,4,1,0xe811,0xe811,0xe811, +0x1812,0x1812,0x1812,0,5,4,0,0,0,0,0,4,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,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x1759, -1,0,0,0,0,0,0,0,0,0x64,0x44,0x44,0x44,0x44,0x64,0x44, +0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x1799, +1,0,0,5,5,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, +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,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, @@ -381,7 +381,7 @@ static const uint16_t ucase_props_trieIndex[13544]={ 0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0x64,0,0,4,0,4,4,4,4,0,0,0, -0,0,0,0,0,0x64,0,0,0,0,0,0,0,4,4,0, +0,0,0,0,0,0x64,0,0,0,0,0,4,4,4,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,0,0,0,0,0,0,0,0,4,0,0,0,0,0, @@ -423,18 +423,18 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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,5,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, +0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da, +0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da,0x17da, +0x17da,0x17da,0,0x17da,0,0,0,0,0,0x17da,0,0,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,0x1fa9,0x1fd9,0,5,0x2009,0x2039,0x2069,0,0,0,0, +0,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,0x209a,0x209a,0x209a,0x209a, +0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x20ba,0x20ba,0x20ba,0x20ba, +0x20ba,0x20ba,0,0,0x20d9,0x2109,0x2139,0x2169,0x2199,0x21c9,0,0,0x209a,0x209a,0x209a,0x209a, +0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a, +0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0x209a,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, 0x64,0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,4,4,0x60,0,0,0,0,0,0,0, @@ -459,10 +459,10 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44, -0x44,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x44,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x64,0x44,0x44,0x64,0x64,0x44,0x44,0x44, 0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0,0, +0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,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, @@ -474,10 +474,10 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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,0x92,0xff91,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, +4,4,4,4,4,4,0,0,0x21f9,0x2229,0x2259,0x2289,0x22b9,0x2309,0x2359,0x2389, +0x23b9,0x92,0xff91,0,0,0,0,0,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea, +0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea,0x23ea, +0x23ea,0x23ea,0x23ea,0,0,0x23ea,0x23ea,0x23ea,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, @@ -487,52 +487,52 @@ static const uint16_t ucase_props_trieIndex[13544]={ 5,5,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,0x23c9,1,1,1,0x23e9,1,1,5,5,5,5,0x25,5,5,5, +5,0x2409,1,1,1,0x2429,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,1,1,1,0x2449,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,0x64,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,0x246a,0x24a9,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,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,0x24e9,0x2569,0x25e9,0x2669,0x26e9,0x2769, +1,1,0x279a,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,0x27a9,0x411,0x2829,0x411,0x28d9,0x411,0x2989,0x411,0,0xfc12,0,0xfc12, +0xfc12,0xfc12,0,0,0x2819,0x411,0x2899,0x411,0x2949,0x411,0x29f9,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,0x4719,0x4799,0xfc12,0xfc12,0xce12,0xce12, -0,4,4,4,0x411,0x411,0x4849,0x48f9,0x49b9,0x391,0x4a39,0x4ab9,0xfc12,0xfc12,0xc812,0xc812, -0xfc92,4,4,4,0,0,0x4b69,0x4be9,0x4c59,0,0x4cd9,0x4d59,0xc012,0xc012,0xc112,0xc112, -0x4e0b,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4, +0x3f11,0x3f11,0,0,0x2aa9,0x2b19,0x2b89,0x2bf9,0x2c69,0x2cd9,0x2d49,0x2db9,0x2e2b,0x2e9b,0x2f0b,0x2f7b, +0x2feb,0x305b,0x30cb,0x313b,0x31a9,0x3219,0x3289,0x32f9,0x3369,0x33d9,0x3449,0x34b9,0x352b,0x359b,0x360b,0x367b, +0x36eb,0x375b,0x37cb,0x383b,0x38a9,0x3919,0x3989,0x39f9,0x3a69,0x3ad9,0x3b49,0x3bb9,0x3c2b,0x3c9b,0x3d0b,0x3d7b, +0x3deb,0x3e5b,0x3ecb,0x3f3b,0x411,0x411,0x3fa9,0x4029,0x4099,0,0x4119,0x4199,0xfc12,0xfc12,0xdb12,0xdb12, +0x424b,4,0x42b9,4,4,4,0x4309,0x4389,0x43f9,0,0x4479,0x44f9,0xd512,0xd512,0xd512,0xd512, +0x45ab,4,4,4,0x411,0x411,0x4619,0x46c9,0,0,0x4789,0x4809,0xfc12,0xfc12,0xce12,0xce12, +0,4,4,4,0x411,0x411,0x48b9,0x4969,0x4a29,0x391,0x4aa9,0x4b29,0xfc12,0xfc12,0xc812,0xc812, +0xfc92,4,4,4,0,0,0x4bd9,0x4c59,0x4cc9,0,0x4d49,0x4dc9,0xc012,0xc012,0xc112,0xc112, +0x4e7b,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,4, +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, 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,0x4e7a,0,2,0,0x4eba,0x4efa,2,2,0,1, +0,0,0,0,2,0,0x4eea,0,2,0,0x4f2a,0x4f6a,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, @@ -547,14 +547,14 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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,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,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x92,0xff91,0x4f3a,0x4f5a, -0x4f7a,0x4f99,0x4fb9,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x4fda,0x4ffa,0x501a,0x503a,1,0x92,0xff91, -1,0x92,0xff91,1,1,1,1,1,0x25,5,0x505a,0x505a,0x92,0xff91,0x92,0xff91, +0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0xe811,0x92,0xff91,0x4faa,0x4fca, +0x4fea,0x5009,0x5029,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x504a,0x506a,0x508a,0x50aa,1,0x92,0xff91, +1,0x92,0xff91,1,1,1,1,1,0x25,5,0x50ca,0x50ca,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,0x5079,0x5079,0x5079,0x5079, -0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079, -0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0x5079,0,0x5079, -0,0,0,0,0,0x5079,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x50e9,0x50e9,0x50e9,0x50e9, +0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9, +0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0x50e9,0,0x50e9, +0,0,0,0,0,0x50e9,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, @@ -568,7 +568,7 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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,0x509a,0x50d9,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x510a,0x5149,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, @@ -580,12 +580,12 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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,0x511a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -4,4,4,0x92,0xff91,0x513a,1,0,0x92,0xff91,0x92,0xff91,0x1811,1,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x515a,0x517a,0x519a,0x51ba,0x515a,1, -0x51da,0x51fa,0x521a,0x523a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0xe812,0x525a,0x527a,0x92,0xff91,0x92,0xff91,0x529a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, -0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x52ba,0,0,0,0,0,0,0, +1,0x92,0xff91,0x92,0xff91,0x518a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +4,4,4,0x92,0xff91,0x51aa,1,0,0x92,0xff91,0x92,0xff91,0x1811,1,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x51ca,0x51ea,0x520a,0x522a,0x51ca,1, +0x524a,0x526a,0x528a,0x52aa,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0xe812,0x52ca,0x52ea,0x92,0xff91,0x92,0xff91,0x530a,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0x532a,0x534a,0,0,0,0,0x534a,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5, 5,0x92,0xff91,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, @@ -614,170 +614,174 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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,0x52d9,1,1,1,1,1,1,1,4, -5,5,5,5,1,1,1,1,1,1,1,1,1,5,4,4, -0,0,0,0,0x52f9,0x5329,0x5359,0x5389,0x53b9,0x53e9,0x5419,0x5449,0x5479,0x54a9,0x54d9,0x5509, -0x5539,0x5569,0x5599,0x55c9,0x5bf9,0x5c29,0x5c59,0x5c89,0x5cb9,0x5ce9,0x5d19,0x5d49,0x5d79,0x5da9,0x5dd9,0x5e09, -0x5e39,0x5e69,0x5e99,0x5ec9,0x5ef9,0x5f29,0x5f59,0x5f89,0x5fb9,0x5fe9,0x6019,0x6049,0x6079,0x60a9,0x60d9,0x6109, -0x6139,0x6169,0x6199,0x61c9,0x55f9,0x5629,0x5659,0x5689,0x56b9,0x56e9,0x5719,0x5749,0x5779,0x57a9,0x57d9,0x5809, -0x5839,0x5869,0x5899,0x58c9,0x58f9,0x5929,0x5959,0x5989,0x59b9,0x59e9,0x5a19,0x5a49,0x5a79,0x5aa9,0x5ad9,0x5b09, -0x5b39,0x5b69,0x5b99,0x5bc9,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,0x61f9,0x6279,0x62f9,0x6379,0x6429,0x64d9,0x6569,0,0,0,0,0, -0,0,0,0,0,0,0,0x6609,0x6689,0x6709,0x6789,0x6809,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,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,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, +1,1,1,1,1,1,1,0x1091,0x1091,1,1,1,1,1,1,0x5369, +1,1,1,1,1,1,1,4,5,5,5,5,1,1,1,1, +1,1,1,1,1,5,4,4,0xef92,0xef92,0,0,0x5389,0x53b9,0x53e9,0x5419, +0x5449,0x5479,0x54a9,0x54d9,0x5509,0x5539,0x5569,0x5599,0x55c9,0x55f9,0x5629,0x5659,0x5c89,0x5cb9,0x5ce9,0x5d19, +0x5d49,0x5d79,0x5da9,0x5dd9,0x5e09,0x5e39,0x5e69,0x5e99,0x5ec9,0x5ef9,0x5f29,0x5f59,0x5f89,0x5fb9,0x5fe9,0x6019, +0x6049,0x6079,0x60a9,0x60d9,0x6109,0x6139,0x6169,0x6199,0x61c9,0x61f9,0x6229,0x6259,0x5689,0x56b9,0x56e9,0x5719, +0x5749,0x5779,0x57a9,0x57d9,0x5809,0x5839,0x5869,0x5899,0x58c9,0x58f9,0x5929,0x5959,0x5989,0x59b9,0x59e9,0x5a19, +0x5a49,0x5a79,0x5aa9,0x5ad9,0x5b09,0x5b39,0x5b69,0x5b99,0x5bc9,0x5bf9,0x5c29,0x5c59,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,0x6289,0x6309,0x6389,0x6409, +0x64b9,0x6569,0x65f9,0,0,0,0,0,0,0,0,0,0,0,0,0x6699, +0x6719,0x6799,0x6819,0x6899,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,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,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,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,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,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,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,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,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,0,0,0,0,0xec11,0xec11,0xec11,0xec11, +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, 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,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392, -0x1392,0x1392,0x1392,0,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0,0x1392,0x1392,0,0xec91, -0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0,0xec91,0xec91,0xec91,0xec91,0xec91, -0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0,0xec91,0xec91,0xec91,0xec91,0xec91, -0xec91,0xec91,0,0xec91,0xec91,0,0,0,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,0,0,0,0,5,4,4,5,5,5,0,5, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0,0x1392,0x1392,0x1392,0x1392, +0x1392,0x1392,0x1392,0,0x1392,0x1392,0,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91, +0xec91,0xec91,0,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91, +0xec91,0xec91,0,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0xec91,0,0xec91,0xec91,0,0,0, +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,4,4,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,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,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, -0x44,0x64,0x64,0,0,0,0,0x64,0,0,0,0,0,0x44,0x64,0, +0,0,0,0,0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64, +0,0,0,0,0,0x44,0x64,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,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,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011,0xe011, +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,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,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, +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,4,0, +0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, +0x1012,0x1012,0,0,0,0x44,0x44,0x44,0x44,0x44,0,4,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,0, -0,0,0,0,0,0,4,0,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012, -0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0x1012,0,0,0,0x44,0x44,0x44, -0x44,0x44,0,4,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,0,0,0,0,0x44,0x44,0,0,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,4,0,0,0,4,4,0x44,0x64,0x64,0x44,0x44,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x44, +0x64,0x44,0x64,0x44,0x44,0x44,0x64,0x64,4,0x64,0x64,0x64,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,0x44,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,0,0,0,4,4,4,4, +4,4,4,4,4,4,0x64,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x64,0x64,4,0x64,0x64,0x64,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,0x44,0x64,0x44,0x64,0,0, +0x64,0,0,4,4,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,4,4,4,4,4,4,4,4, -4,4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x64,0,0,4, -4,0,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,4,0,0,0x64,0x64,0,0,4,0,0,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,0x44,0x44,0x44,0, +0,0,0,4,4,4,4,0,0,0x64,0x64,0,0,4,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,0,0,0,0,0,0,0,0,0,0,0,4, -4,4,4,4,0,4,4,4,4,4,4,0x64,0x64,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4, -4,4,4,0,0x60,0,0,0,0,0,0,0,0,4,0x64,4, -4,0,0,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,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, +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,4,4,4,4,4,0,4,4,4,4,4,4,0x64, +0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, +4,4,4,4,4,4,4,0,0x60,0,0,0,0,0,0,0, +0,4,0x64,4,4,0,0,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,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,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,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,4,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x64,0x60,0x64,0,4,0,0,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,0x64,0x60,0x64,0,4,0,0,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,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,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, 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,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,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,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,0,0, -0,0,0,0,0,0,0,0,0,4,0,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, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,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, +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, -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,0,0,0,0,0,0,0,0,0,0,4,4,0x60,0x64,0, -0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -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, +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,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,4,0,4,4,4,0,4,0, +4,0x60,0x64,0,0,0,0,0x64,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,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,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,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,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,4,0,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,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, -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,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,0,0,0,0,0,0,4,4,4,4,4,0, +0,0,0,0,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,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,4,4,4,4,0,0,0,0,0, -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,4,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,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, +4,4,4,4,4,4,4,4,4,4,0,0,0,4,4,0x64, +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,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, +0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, +0xd92,0,0,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291, +0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,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,0,4,4,0,0,0, +0,0,0,0,0,0,0,0,0x60,0x60,4,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0, -0,0,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,4,4,4,4, -4,4,4,4,4,4,0,0,0,4,4,0x64,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,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, -0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0,0,0xf291, -0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291,0xf291, -0xf291,0xf291,0xf291,0xf291,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,0,4,4,0,0,0,0,0,0,0, -0,0,0,0,0x60,0x60,4,4,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,4,4,0,4,4,0,0,0,0,0,0,0,0,0, +0,4,4,4,4,4,4,4,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,4,0x64,0,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,0,0,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0x64,0,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,0,0,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,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,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, @@ -785,6 +789,8 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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,0x60,0x60,0x60,0,0,0,0,0, +0,0,0,0x64,0x64,0,0,0x60,0x60,0x60,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,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, @@ -809,7 +815,7 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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, +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,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, @@ -827,12 +833,17 @@ static const uint16_t ucase_props_trieIndex[13544]={ 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, +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,0x21,1,1,1,1,1, +0x92,0xff91,1,1,1,1,1,1,0x92,0xff91,0x92,0xff91,1,0x92,0xff91,1, +1,0x92,0xff91,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xffb1,0x21,0x21,0x92,0xff91,0x92,0xff91,0x92,0xff91, +0x92,0xff91,0x92,0xff91,0x92,0xff91,0x92,0xff91,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,1,1,1,1,0x6919,1,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,0x25,5,5,5,5,5,5, 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, -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,0x21,1,1,1,1,0, -0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x44,0x44,0,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 0x25,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, @@ -863,139 +874,149 @@ static const uint16_t ucase_props_trieIndex[13544]={ 0,0,0,0,0,0,0,0 }; -static const uint16_t ucase_props_exceptions[1672]={ +static const uint16_t ucase_props_exceptions[1692]={ 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, -0x212b,0x4810,1,0xce50,0xc7,2,0x49,0x131,0x844,0x49,2,0x69,0x130,0x880,0x2220,0x2bc, -0x6e,0x2bc,0x4e,0x2bc,0x4e,0x806,0x73,0x53,0x810,0xa641,0x809,0x1c6,0x1c5,0x80d,0x1c6,0x1c4, -0x1c5,0x80c,0x1c4,0x1c5,0x809,0x1c9,0x1c8,0x80d,0x1c9,0x1c7,0x1c8,0x80c,0x1c7,0x1c8,0x809,0x1cc, -0x1cb,0x80d,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,0xa567,0x810,0xa528,0x810,0xa544, -0x810,0x29f7,0x810,0xa541,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,0x4880,0x20,0x565,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,0x882,0x390,0x3330,0x3b9,0x308,0x301,0x399,0x308,0x301,0x399,0x308, -0x301,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,0x882, -0x3b0,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5,0x308,0x301,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,0xa567,0xc10,0xa641,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,0x882,0xfb06,0x2220, -0x73,0x74,0x53,0x54,0x53,0x74,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 +0xe5,1,0x212b,0x8c0,3,0x2220,0x73,0x73,0x53,0x53,0x53,0x73,0x1e9e,0xd837,0xdf95,0x844, +0xc5,1,0x212b,0x4810,1,0xce50,0xc7,2,0x49,0x131,0x844,0x49,2,0x69,0x130,0x880, +0x2220,0x2bc,0x6e,0x2bc,0x4e,0x2bc,0x4e,0x806,0x73,0x53,0x810,0xa641,0x809,0x1c6,0x1c5,0x80d, +0x1c6,0x1c4,0x1c5,0x80c,0x1c4,0x1c5,0x809,0x1c9,0x1c8,0x80d,0x1c9,0x1c7,0x1c8,0x80c,0x1c7,0x1c8, +0x809,0x1cc,0x1cb,0x80d,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,0xa567,0x810,0xa528, +0x810,0xa544,0x810,0x29f7,0x810,0xa541,0x810,0x29fd,0x810,0xa566,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,0x4880,0x20,0x565,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,0xcd0,0x1dbf,2,0x20,0x73,0x73,0xd837, +0xdf95,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,0x882,0x390,0x3330,0x3b9, +0x308,0x301,0x399,0x308,0x301,0x399,0x308,0x301,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,0x882,0x3b0,0x3330,0x3c5,0x308,0x301,0x3a5,0x308,0x301,0x3a5, +0x308,0x301,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,0xa567,0xc10,0xa641,0xc10,0xa566,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,0x882,0xfb06,0x2220,0x73,0x74,0x53,0x54,0x53,0x74,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,0x8c2,0xdf,1,0x2220,0x73,0x73,0x53,0x53,0x53,0x73,0x1e9e }; -static const uint16_t ucase_props_unfold[370]={ -0x49,5,3,0,0,0x61,0x2be,0,0x1e9a,0,0x66,0x66,0,0xfb00,0,0x66, -0x66,0x69,0xfb03,0,0x66,0x66,0x6c,0xfb04,0,0x66,0x69,0,0xfb01,0,0x66,0x6c, -0,0xfb02,0,0x68,0x331,0,0x1e96,0,0x69,0x307,0,0x130,0,0x6a,0x30c,0, -0x1f0,0,0x73,0x73,0,0xdf,0x1e9e,0x73,0x74,0,0xfb05,0xfb06,0x74,0x308,0,0x1e97, -0,0x77,0x30a,0,0x1e98,0,0x79,0x30a,0,0x1e99,0,0x2bc,0x6e,0,0x149,0, -0x3ac,0x3b9,0,0x1fb4,0,0x3ae,0x3b9,0,0x1fc4,0,0x3b1,0x342,0,0x1fb6,0,0x3b1, -0x342,0x3b9,0x1fb7,0,0x3b1,0x3b9,0,0x1fb3,0x1fbc,0x3b7,0x342,0,0x1fc6,0,0x3b7,0x342, -0x3b9,0x1fc7,0,0x3b7,0x3b9,0,0x1fc3,0x1fcc,0x3b9,0x308,0x300,0x1fd2,0,0x3b9,0x308,0x301, -0x390,0x1fd3,0x3b9,0x308,0x342,0x1fd7,0,0x3b9,0x342,0,0x1fd6,0,0x3c1,0x313,0,0x1fe4, -0,0x3c5,0x308,0x300,0x1fe2,0,0x3c5,0x308,0x301,0x3b0,0x1fe3,0x3c5,0x308,0x342,0x1fe7,0, -0x3c5,0x313,0,0x1f50,0,0x3c5,0x313,0x300,0x1f52,0,0x3c5,0x313,0x301,0x1f54,0,0x3c5, -0x313,0x342,0x1f56,0,0x3c5,0x342,0,0x1fe6,0,0x3c9,0x342,0,0x1ff6,0,0x3c9,0x342, -0x3b9,0x1ff7,0,0x3c9,0x3b9,0,0x1ff3,0x1ffc,0x3ce,0x3b9,0,0x1ff4,0,0x565,0x582,0, -0x587,0,0x574,0x565,0,0xfb14,0,0x574,0x56b,0,0xfb15,0,0x574,0x56d,0,0xfb17, -0,0x574,0x576,0,0xfb13,0,0x57e,0x576,0,0xfb16,0,0x1f00,0x3b9,0,0x1f80,0x1f88, -0x1f01,0x3b9,0,0x1f81,0x1f89,0x1f02,0x3b9,0,0x1f82,0x1f8a,0x1f03,0x3b9,0,0x1f83,0x1f8b,0x1f04, -0x3b9,0,0x1f84,0x1f8c,0x1f05,0x3b9,0,0x1f85,0x1f8d,0x1f06,0x3b9,0,0x1f86,0x1f8e,0x1f07,0x3b9, -0,0x1f87,0x1f8f,0x1f20,0x3b9,0,0x1f90,0x1f98,0x1f21,0x3b9,0,0x1f91,0x1f99,0x1f22,0x3b9,0, -0x1f92,0x1f9a,0x1f23,0x3b9,0,0x1f93,0x1f9b,0x1f24,0x3b9,0,0x1f94,0x1f9c,0x1f25,0x3b9,0,0x1f95, -0x1f9d,0x1f26,0x3b9,0,0x1f96,0x1f9e,0x1f27,0x3b9,0,0x1f97,0x1f9f,0x1f60,0x3b9,0,0x1fa0,0x1fa8, -0x1f61,0x3b9,0,0x1fa1,0x1fa9,0x1f62,0x3b9,0,0x1fa2,0x1faa,0x1f63,0x3b9,0,0x1fa3,0x1fab,0x1f64, -0x3b9,0,0x1fa4,0x1fac,0x1f65,0x3b9,0,0x1fa5,0x1fad,0x1f66,0x3b9,0,0x1fa6,0x1fae,0x1f67,0x3b9, -0,0x1fa7,0x1faf,0x1f70,0x3b9,0,0x1fb2,0,0x1f74,0x3b9,0,0x1fc2,0,0x1f7c,0x3b9,0, -0x1ff2,0 +static const uint16_t ucase_props_unfold[518]={ +0x49,7,3,0,0,0,0,0x61,0x2be,0,0x1e9a,0,0,0,0x66,0x66, +0,0xfb00,0,0,0,0x66,0x66,0x69,0xfb03,0,0,0,0x66,0x66,0x6c,0xfb04, +0,0,0,0x66,0x69,0,0xfb01,0,0,0,0x66,0x6c,0,0xfb02,0,0, +0,0x68,0x331,0,0x1e96,0,0,0,0x69,0x307,0,0x130,0,0,0,0x6a, +0x30c,0,0x1f0,0,0,0,0x73,0x73,0,0xdf,0x1e9e,0xd837,0xdf95,0x73,0x74,0, +0xfb05,0xfb06,0,0,0x74,0x308,0,0x1e97,0,0,0,0x77,0x30a,0,0x1e98,0, +0,0,0x79,0x30a,0,0x1e99,0,0,0,0x2bc,0x6e,0,0x149,0,0,0, +0x3ac,0x3b9,0,0x1fb4,0,0,0,0x3ae,0x3b9,0,0x1fc4,0,0,0,0x3b1,0x342, +0,0x1fb6,0,0,0,0x3b1,0x342,0x3b9,0x1fb7,0,0,0,0x3b1,0x3b9,0,0x1fb3, +0x1fbc,0,0,0x3b7,0x342,0,0x1fc6,0,0,0,0x3b7,0x342,0x3b9,0x1fc7,0,0, +0,0x3b7,0x3b9,0,0x1fc3,0x1fcc,0,0,0x3b9,0x308,0x300,0x1fd2,0,0,0,0x3b9, +0x308,0x301,0x390,0x1fd3,0,0,0x3b9,0x308,0x342,0x1fd7,0,0,0,0x3b9,0x342,0, +0x1fd6,0,0,0,0x3c1,0x313,0,0x1fe4,0,0,0,0x3c5,0x308,0x300,0x1fe2,0, +0,0,0x3c5,0x308,0x301,0x3b0,0x1fe3,0,0,0x3c5,0x308,0x342,0x1fe7,0,0,0, +0x3c5,0x313,0,0x1f50,0,0,0,0x3c5,0x313,0x300,0x1f52,0,0,0,0x3c5,0x313, +0x301,0x1f54,0,0,0,0x3c5,0x313,0x342,0x1f56,0,0,0,0x3c5,0x342,0,0x1fe6, +0,0,0,0x3c9,0x342,0,0x1ff6,0,0,0,0x3c9,0x342,0x3b9,0x1ff7,0,0, +0,0x3c9,0x3b9,0,0x1ff3,0x1ffc,0,0,0x3ce,0x3b9,0,0x1ff4,0,0,0,0x565, +0x582,0,0x587,0,0,0,0x574,0x565,0,0xfb14,0,0,0,0x574,0x56b,0, +0xfb15,0,0,0,0x574,0x56d,0,0xfb17,0,0,0,0x574,0x576,0,0xfb13,0, +0,0,0x57e,0x576,0,0xfb16,0,0,0,0x1f00,0x3b9,0,0x1f80,0x1f88,0,0, +0x1f01,0x3b9,0,0x1f81,0x1f89,0,0,0x1f02,0x3b9,0,0x1f82,0x1f8a,0,0,0x1f03,0x3b9, +0,0x1f83,0x1f8b,0,0,0x1f04,0x3b9,0,0x1f84,0x1f8c,0,0,0x1f05,0x3b9,0,0x1f85, +0x1f8d,0,0,0x1f06,0x3b9,0,0x1f86,0x1f8e,0,0,0x1f07,0x3b9,0,0x1f87,0x1f8f,0, +0,0x1f20,0x3b9,0,0x1f90,0x1f98,0,0,0x1f21,0x3b9,0,0x1f91,0x1f99,0,0,0x1f22, +0x3b9,0,0x1f92,0x1f9a,0,0,0x1f23,0x3b9,0,0x1f93,0x1f9b,0,0,0x1f24,0x3b9,0, +0x1f94,0x1f9c,0,0,0x1f25,0x3b9,0,0x1f95,0x1f9d,0,0,0x1f26,0x3b9,0,0x1f96,0x1f9e, +0,0,0x1f27,0x3b9,0,0x1f97,0x1f9f,0,0,0x1f60,0x3b9,0,0x1fa0,0x1fa8,0,0, +0x1f61,0x3b9,0,0x1fa1,0x1fa9,0,0,0x1f62,0x3b9,0,0x1fa2,0x1faa,0,0,0x1f63,0x3b9, +0,0x1fa3,0x1fab,0,0,0x1f64,0x3b9,0,0x1fa4,0x1fac,0,0,0x1f65,0x3b9,0,0x1fa5, +0x1fad,0,0,0x1f66,0x3b9,0,0x1fa6,0x1fae,0,0,0x1f67,0x3b9,0,0x1fa7,0x1faf,0, +0,0x1f70,0x3b9,0,0x1fb2,0,0,0,0x1f74,0x3b9,0,0x1fc2,0,0,0,0x1f7c, +0x3b9,0,0x1ff2,0,0,0 }; static const UCaseProps ucase_props_singleton={ @@ -1008,13 +1029,13 @@ static const UCaseProps ucase_props_singleton={ ucase_props_trieIndex+3468, nullptr, 3468, - 10076, + 10252, 0x188, 0xe08, 0x0, 0x0, 0xe0800, - 0x34e4, + 0x3594, nullptr, 0, false, false, 0, nullptr }, { 4,0,0,0 } diff --git a/deps/icu-small/source/common/ucasemap.cpp b/deps/icu-small/source/common/ucasemap.cpp index 8e60671c3a25..07f99a3b67f0 100644 --- a/deps/icu-small/source/common/ucasemap.cpp +++ b/deps/icu-small/source/common/ucasemap.cpp @@ -46,26 +46,33 @@ U_NAMESPACE_USE /* UCaseMap service object -------------------------------------------------- */ -UCaseMap::UCaseMap(const char *localeID, uint32_t opts, UErrorCode *pErrorCode) : +// The public type, unicode/ucasemap.h struct UCaseMap, is an opaque C type. +// We define a parallel C++ type in the ICU namespace for entry point renaming. + +U_NAMESPACE_BEGIN + +UCaseMapImpl::UCaseMapImpl(const char *localeID, uint32_t opts, UErrorCode *pErrorCode) : #if !UCONFIG_NO_BREAK_ITERATION iter(nullptr), #endif caseLocale(UCASE_LOC_UNKNOWN), options(opts) { - ucasemap_setLocale(this, localeID, pErrorCode); + ucasemap_setLocale(reinterpret_cast(this), localeID, pErrorCode); } -UCaseMap::~UCaseMap() { +UCaseMapImpl::~UCaseMapImpl() { #if !UCONFIG_NO_BREAK_ITERATION delete iter; #endif } +U_NAMESPACE_END + U_CAPI UCaseMap * U_EXPORT2 ucasemap_open(const char *locale, uint32_t options, UErrorCode *pErrorCode) { if(U_FAILURE(*pErrorCode)) { return nullptr; } - UCaseMap *csm = new UCaseMap(locale, options, pErrorCode); + UCaseMapImpl *csm = new UCaseMapImpl(locale, options, pErrorCode); if(csm==nullptr) { *pErrorCode = U_MEMORY_ALLOCATION_ERROR; return nullptr; @@ -73,22 +80,22 @@ ucasemap_open(const char *locale, uint32_t options, UErrorCode *pErrorCode) { delete csm; return nullptr; } - return csm; + return reinterpret_cast(csm); } U_CAPI void U_EXPORT2 ucasemap_close(UCaseMap *csm) { - delete csm; + delete reinterpret_cast(csm); } -U_CAPI const char * U_EXPORT2 -ucasemap_getLocale(const UCaseMap *csm) { - return csm->locale; +U_CAPI const char* U_EXPORT2 +ucasemap_getLocale(const UCaseMap* csm U_LIFETIME_BOUND) { + return reinterpret_cast(csm)->locale; } U_CAPI uint32_t U_EXPORT2 ucasemap_getOptions(const UCaseMap *csm) { - return csm->options; + return reinterpret_cast(csm)->options; } U_CAPI void U_EXPORT2 @@ -96,29 +103,30 @@ ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode) { if(U_FAILURE(*pErrorCode)) { return; } + auto *impl = reinterpret_cast(csm); if (locale != nullptr && *locale == 0) { - csm->locale[0] = 0; - csm->caseLocale = UCASE_LOC_ROOT; + impl->locale[0] = 0; + impl->caseLocale = UCASE_LOC_ROOT; return; } UErrorCode bufferStatus = U_ZERO_ERROR; - int32_t length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), &bufferStatus); - if(bufferStatus==U_BUFFER_OVERFLOW_ERROR || (U_SUCCESS(bufferStatus) && length==sizeof(csm->locale))) { + int32_t length=uloc_getName(locale, impl->locale, (int32_t)sizeof(impl->locale), &bufferStatus); + if(bufferStatus==U_BUFFER_OVERFLOW_ERROR || (U_SUCCESS(bufferStatus) && length==sizeof(impl->locale))) { bufferStatus = U_ZERO_ERROR; /* we only really need the language code for case mappings */ - length=uloc_getLanguage(locale, csm->locale, (int32_t)sizeof(csm->locale), &bufferStatus); + length=uloc_getLanguage(locale, impl->locale, (int32_t)sizeof(impl->locale), &bufferStatus); } if(U_FAILURE(bufferStatus)) { *pErrorCode=bufferStatus; - } else if(length==sizeof(csm->locale)) { + } else if(length==sizeof(impl->locale)) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } if(U_SUCCESS(*pErrorCode)) { - csm->caseLocale = ucase_getCaseLocale(csm->locale); + impl->caseLocale = ucase_getCaseLocale(impl->locale); } else { - csm->locale[0]=0; - csm->caseLocale = UCASE_LOC_ROOT; + impl->locale[0]=0; + impl->caseLocale = UCASE_LOC_ROOT; } } @@ -127,7 +135,7 @@ ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode) { if(U_FAILURE(*pErrorCode)) { return; } - csm->options=options; + reinterpret_cast(csm)->options=options; } /* UTF-8 string case mappings ----------------------------------------------- */ @@ -942,8 +950,9 @@ ucasemap_utf8ToLower(const UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { + auto *impl = reinterpret_cast(csm); return ucasemap_mapUTF8( - csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL + impl->caseLocale, impl->options, UCASEMAP_BREAK_ITERATOR_NULL dest, destCapacity, src, srcLength, ucasemap_internalUTF8ToLower, nullptr, *pErrorCode); @@ -954,8 +963,9 @@ ucasemap_utf8ToUpper(const UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { + auto *impl = reinterpret_cast(csm); return ucasemap_mapUTF8( - csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL + impl->caseLocale, impl->options, UCASEMAP_BREAK_ITERATOR_NULL dest, destCapacity, src, srcLength, ucasemap_internalUTF8ToUpper, nullptr, *pErrorCode); @@ -966,8 +976,9 @@ ucasemap_utf8FoldCase(const UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { + auto *impl = reinterpret_cast(csm); return ucasemap_mapUTF8( - UCASE_LOC_ROOT, csm->options, UCASEMAP_BREAK_ITERATOR_NULL + UCASE_LOC_ROOT, impl->options, UCASEMAP_BREAK_ITERATOR_NULL dest, destCapacity, src, srcLength, ucasemap_internalUTF8Fold, nullptr, *pErrorCode); diff --git a/deps/icu-small/source/common/ucasemap_imp.h b/deps/icu-small/source/common/ucasemap_imp.h index bc83c6bd7883..9d5d8fe78ec0 100644 --- a/deps/icu-small/source/common/ucasemap_imp.h +++ b/deps/icu-small/source/common/ucasemap_imp.h @@ -10,6 +10,7 @@ #include "unicode/utypes.h" #include "unicode/ucasemap.h" #include "unicode/uchar.h" +#include "unicode/unistr.h" // for UStringCaseMapper #include "ucase.h" /** @@ -92,25 +93,24 @@ inline UBool ustrcase_isLNS(UChar32 c) { /** Returns nullptr if error. Pass in either locale or locID, not both. */ U_CFUNC -BreakIterator *ustrcase_getTitleBreakIterator( - const Locale *locale, const char *locID, uint32_t options, BreakIterator *iter, - LocalPointer &ownedIter, UErrorCode &errorCode); +BreakIterator* ustrcase_getTitleBreakIterator(const Locale* locale, + const char* locID, + uint32_t options, + BreakIterator* iter U_LIFETIME_BOUND, + LocalPointer& ownedIter, + UErrorCode& errorCode); #endif -U_NAMESPACE_END - -#include "unicode/unistr.h" // for UStringCaseMapper - /* * Internal string casing functions implementing * ustring.h/ustrcase.cpp and UnicodeString case mapping functions. */ -struct UCaseMap : public icu::UMemory { +struct UCaseMapImpl : public icu::UMemory { /** Implements most of ucasemap_open(). */ - UCaseMap(const char *localeID, uint32_t opts, UErrorCode *pErrorCode); - ~UCaseMap(); + UCaseMapImpl(const char *localeID, uint32_t opts, UErrorCode *pErrorCode); + ~UCaseMapImpl(); #if !UCONFIG_NO_BREAK_ITERATION icu::BreakIterator *iter; /* We adopt the iterator, so we own it. */ @@ -120,6 +120,8 @@ struct UCaseMap : public icu::UMemory { uint32_t options; }; +U_NAMESPACE_END + #if UCONFIG_NO_BREAK_ITERATION # define UCASEMAP_BREAK_ITERATOR_PARAM # define UCASEMAP_BREAK_ITERATOR_UNUSED @@ -201,7 +203,6 @@ ustrcase_mapWithOverlap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITE * UTF-8 string case mapping function type, used by ucasemap_mapUTF8(). * UTF-8 version of UStringCaseMapper. * All error checking must be done. - * The UCaseMap must be fully initialized, with locale and/or iter set as needed. */ typedef void U_CALLCONV UTF8CaseMapper(int32_t caseLocale, uint32_t options, diff --git a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp index ebc952a97975..90f507f1d926 100644 --- a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp @@ -84,9 +84,10 @@ U_NAMESPACE_END U_NAMESPACE_USE -U_CAPI const UBreakIterator * U_EXPORT2 -ucasemap_getBreakIterator(const UCaseMap *csm) { - return reinterpret_cast(csm->iter); +U_CAPI const UBreakIterator* U_EXPORT2 +ucasemap_getBreakIterator(const UCaseMap* csm U_LIFETIME_BOUND) { + auto *impl = reinterpret_cast(csm); + return reinterpret_cast(impl->iter); } U_CAPI void U_EXPORT2 @@ -94,8 +95,9 @@ ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode if(U_FAILURE(*pErrorCode)) { return; } - delete csm->iter; - csm->iter=reinterpret_cast(iterToAdopt); + auto *impl = reinterpret_cast(csm); + delete impl->iter; + impl->iter=reinterpret_cast(iterToAdopt); } U_CAPI int32_t U_EXPORT2 @@ -111,19 +113,20 @@ ucasemap_utf8ToTitle(UCaseMap *csm, if (U_FAILURE(*pErrorCode)) { return 0; } - if(csm->iter==nullptr) { + auto *impl = reinterpret_cast(csm); + if(impl->iter==nullptr) { LocalPointer ownedIter; BreakIterator *iter = ustrcase_getTitleBreakIterator( - nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode); + nullptr, impl->locale, impl->options, nullptr, ownedIter, *pErrorCode); if (iter == nullptr) { utext_close(&utext); return 0; } - csm->iter = ownedIter.orphan(); + impl->iter = ownedIter.orphan(); } - csm->iter->setText(&utext, *pErrorCode); + impl->iter->setText(&utext, *pErrorCode); int32_t length=ucasemap_mapUTF8( - csm->caseLocale, csm->options, csm->iter, + impl->caseLocale, impl->options, impl->iter, dest, destCapacity, src, srcLength, ucasemap_internalUTF8ToTitle, nullptr, *pErrorCode); diff --git a/deps/icu-small/source/common/ucat.cpp b/deps/icu-small/source/common/ucat.cpp index 2f7fdcd980c4..4e46b6f25963 100644 --- a/deps/icu-small/source/common/ucat.cpp +++ b/deps/icu-small/source/common/ucat.cpp @@ -28,7 +28,7 @@ static const char SEPARATOR = '%'; * MAX_KEY_LEN or more. */ static char* -_catkey(char* buffer, int32_t set_num, int32_t msg_num) { +_catkey(char* buffer U_LIFETIME_BOUND, int32_t set_num, int32_t msg_num) { int32_t i = 0; i = T_CString_integerToString(buffer, set_num, 10); buffer[i++] = SEPARATOR; @@ -47,9 +47,12 @@ u_catclose(u_nl_catd catd) { } U_CAPI const char16_t* U_EXPORT2 -u_catgets(u_nl_catd catd, int32_t set_num, int32_t msg_num, - const char16_t* s, - int32_t* len, UErrorCode* ec) { +u_catgets(u_nl_catd catd U_LIFETIME_BOUND, + int32_t set_num, + int32_t msg_num, + const char16_t* s U_LIFETIME_BOUND, + int32_t* len, + UErrorCode* ec) { char key[MAX_KEY_LEN]; const char16_t* result; diff --git a/deps/icu-small/source/common/uchar_props_data.h b/deps/icu-small/source/common/uchar_props_data.h index 98af874f0cbc..23a8823058fd 100644 --- a/deps/icu-small/source/common/uchar_props_data.h +++ b/deps/icu-small/source/common/uchar_props_data.h @@ -9,146 +9,147 @@ #ifdef INCLUDED_FROM_UCHAR_C -static const UVersionInfo dataVersion={0x11,0,0,0}; +static const UVersionInfo dataVersion={0x12,0,0,0}; -static const uint16_t propsTrie_index[24108]={ -0x485,0x48d,0x495,0x49d,0x4b5,0x4bd,0x4c5,0x4cd,0x4d5,0x4dd,0x4e3,0x4eb,0x4f3,0x4fb,0x503,0x50b, -0x511,0x519,0x521,0x529,0x52c,0x534,0x53c,0x544,0x54c,0x554,0x550,0x558,0x560,0x568,0x56d,0x575, -0x57d,0x585,0x589,0x591,0x599,0x5a1,0x5a9,0x5b1,0x5ad,0x5b5,0x5ba,0x5c2,0x5c8,0x5d0,0x5d8,0x5e0, -0x5e8,0x5f0,0x5f8,0x600,0x605,0x60d,0x610,0x618,0x620,0x628,0x62e,0x636,0x635,0x63d,0x645,0x64d, -0x65d,0x655,0x665,0x66d,0x673,0x5f0,0x683,0x67b,0x693,0x695,0x69d,0x68b,0x6ad,0x6b3,0x6bb,0x6a5, -0x6cb,0x6d1,0x6d9,0x6c3,0x6e9,0x6ef,0x6f7,0x6e1,0x707,0x70d,0x715,0x6ff,0x725,0x72d,0x735,0x71d, -0x745,0x74b,0x753,0x73d,0x763,0x769,0x771,0x75b,0x781,0x786,0x78e,0x779,0x79e,0x7a5,0x7ad,0x796, -0x631,0x7b5,0x7bd,0x4a5,0x7c5,0x7cc,0x7d4,0x4a5,0x7dc,0x7e4,0x7ec,0x7f1,0x7f9,0x800,0x808,0x4a5, -0x5f0,0x810,0x818,0x820,0x828,0x57d,0x838,0x830,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x840,0x5f0,0x848,0x84c,0x854,0x5f0,0x85a,0x5f0,0x860,0x868,0x870,0x57d,0x57d,0x878, -0x880,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x885,0x88d,0x5f0,0x5f0,0x895,0x89d,0x8a5,0x8ad,0x8b5,0x5f0,0x8bd,0x8c5,0x8cd, -0x8dd,0x5f0,0x8e5,0x8e7,0x8ef,0x8d5,0x5f0,0x8f2,0x906,0x8fa,0x902,0x90e,0x5f0,0x916,0x91c,0x924, -0x92c,0x5f0,0x93c,0x944,0x94c,0x934,0x95c,0x954,0x96c,0x96f,0x977,0x964,0x987,0x97f,0x5f0,0x98e, -0x5f0,0x99d,0x996,0x9a5,0x9ad,0x9b1,0x9b9,0x9c1,0x525,0x9c9,0x9cc,0x9d2,0x9d9,0x9cc,0x54c,0x54c, -0x4d5,0x4d5,0x4d5,0x4d5,0x9e1,0x4d5,0x4d5,0x4d5,0x9f1,0x9f9,0xa01,0xa09,0xa11,0xa15,0xa1d,0x9e9, -0xa35,0xa3d,0xa25,0xa2d,0xa45,0xa4d,0xa55,0xa5d,0xa75,0xa65,0xa6d,0xa7d,0xa85,0xa94,0xa99,0xa8c, -0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa9,0xab1,0x924,0xab4,0xabc,0xac3,0xac8,0xad0, -0x924,0xad6,0xade,0xaee,0xaf1,0x924,0x924,0xae6,0x924,0x924,0x924,0x924,0x924,0xb00,0xb08,0xaf8, -0x924,0x924,0x924,0xb0d,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0xb13,0xb1b,0x924,0xb23,0xb2a, -0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0xaa1,0xaa1,0xaa1,0xaa1,0xb32,0xaa1,0xb39,0xb40, -0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0x924,0xb48,0xb4f,0xb53,0x924,0x924,0x924,0x924, -0x57d,0x585,0x525,0xb5b,0x4d5,0x4d5,0x4d5,0xb63,0x525,0xb6b,0x5f0,0xb71,0xb81,0xb79,0xb79,0x54c, -0xb89,0xb91,0xb99,0x4a5,0xba1,0x924,0x924,0xba8,0x924,0x924,0x924,0x924,0x924,0x924,0xad3,0xbad, -0xbbd,0xbb5,0x631,0x5f0,0xbc5,0x880,0x5f0,0xbcd,0xbd5,0xbd9,0x5f0,0x5f0,0xbde,0x5f0,0x924,0xbe5, -0xbed,0xbf5,0xbfb,0x924,0xbf5,0xc03,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, -0xc0b,0x5f0,0x5f0,0x5f0,0xc13,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0xc19,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc1e,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x924,0x924, -0xc26,0xc2d,0xc2f,0x5f0,0xc37,0xc3d,0xc45,0xc4d,0xc52,0x5f0,0x5f0,0xc56,0x5f0,0x5f0,0x5f0,0xc5c, -0xc63,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc6a,0x5f0,0xc71,0xc77,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc7f,0x5f0,0x5f0,0x5f0,0xc87,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc89,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc90,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0xc97,0x5f0,0x5f0,0x5f0,0xc9e,0xca6,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcab,0xcb0,0x5f0,0x5f0,0xcb8,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcbc,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcc1,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcbf,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcc9,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0xccf,0xcd7,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcdd, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0xce4,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0xce9,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcee,0x5f0,0x5f0,0x5f0,0xc2a,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0xccb,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xcf4,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0xcfc,0xd03,0xd07,0x5f0,0x5f0,0x5f0,0xcc3,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0xd16,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0xd0e,0x924,0xd1e,0x9a5,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0xd23,0xd2b,0x4d5,0xd3b,0xd33,0x5f0,0x5f0,0xd43,0xd4b,0xd5b,0x4d5,0xd60,0xd68,0xd6e,0xd75,0xd53, -0xd7d,0xd85,0x5f0,0xd8d,0xd9d,0xda0,0xd95,0xda8,0x645,0xdb0,0xdb7,0x8e6,0x693,0xdc7,0xdbf,0xdcf, -0x5f0,0xdd7,0xddf,0xde7,0x5f0,0xdef,0xdf7,0xdff,0xe07,0xe0f,0xe13,0xe1b,0x525,0x525,0x5f0,0xe23, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xe2b,0xe37,0xe2f, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f, -0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0x5f0,0x5f0,0x5f0,0xe4f,0x5f0,0xcc4,0xe56,0xe5b, -0x5f0,0x5f0,0x5f0,0xe63,0x5f0,0x5f0,0x8f1,0x4a5,0xe79,0xe69,0xe71,0x5f0,0x5f0,0xe81,0xe89,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xe8e,0x928,0x5f0,0xe96,0x5f0,0xe9c,0xea0, -0xea8,0xeb0,0xeb7,0xebf,0x5f0,0x5f0,0x5f0,0xec5,0xedd,0x495,0xee5,0xeed,0xef2,0x906,0xecd,0xed5, -0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f, -0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f,0xe3f, -0x1294,0x1294,0x12d4,0x1314,0x1354,0x138c,0x13cc,0x140c,0x1444,0x1484,0x14b0,0x14f0,0x1530,0x1540,0x1580,0x15b4, -0x15f4,0x1624,0x1664,0x16a4,0x16b4,0x16e8,0x1720,0x1760,0x17a0,0x17e0,0x1814,0x1840,0x1880,0x18b8,0x18d4,0x1914, -0xa80,0xac0,0xb00,0xb40,0xb80,0xbab,0xbeb,0x1db,0xc0e,0xa40,0xa40,0xa40,0xc46,0xc86,0x1db,0x1db, -0x1db,0xcc6,0xa40,0xa40,0xa40,0xcf6,0xd36,0xd56,0xa40,0xd7c,0xdbc,0xdfc,0xe3c,0xe7c,0xebc,0xefc, -0xf3c,0xf73,0x1db,0x1db,0xf97,0xfcb,0x1db,0xff3,0x1db,0x1db,0x1db,0x1db,0x1020,0x1db,0x1db,0x1db, -0x1db,0x1db,0x1db,0x1db,0x1034,0x1db,0x1db,0x1074,0x1db,0x107f,0x1db,0x1db,0x1db,0x10b5,0xa40,0x10f5, -0x1db,0x1db,0x1135,0x1db,0x1db,0x1db,0x1152,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +static const uint16_t propsTrie_index[24744]={ +0x4a6,0x4ae,0x4b6,0x4be,0x4d6,0x4de,0x4e6,0x4ee,0x4f6,0x4fe,0x504,0x50c,0x514,0x51c,0x524,0x52c, +0x532,0x53a,0x542,0x54a,0x54d,0x555,0x55d,0x565,0x56d,0x575,0x571,0x579,0x581,0x589,0x58e,0x596, +0x59e,0x5a6,0x5aa,0x5b2,0x5ba,0x5c2,0x5ca,0x5d2,0x5ce,0x5d6,0x5db,0x5e3,0x5e9,0x5f1,0x5f9,0x601, +0x609,0x611,0x619,0x621,0x626,0x62e,0x631,0x639,0x641,0x649,0x64f,0x657,0x656,0x65e,0x666,0x66e, +0x67e,0x676,0x686,0x68e,0x694,0x611,0x6a4,0x69c,0x6b4,0x6b6,0x6be,0x6ac,0x6ce,0x6d4,0x6dc,0x6c6, +0x6ec,0x6f2,0x6fa,0x6e4,0x70a,0x710,0x718,0x702,0x728,0x72e,0x736,0x720,0x746,0x74e,0x756,0x73e, +0x766,0x76c,0x774,0x75e,0x784,0x78a,0x792,0x77c,0x7a2,0x7a7,0x7af,0x79a,0x7bf,0x7c6,0x7ce,0x7b7, +0x652,0x7d6,0x7de,0x4c6,0x7e6,0x7ed,0x7f5,0x4c6,0x7fd,0x805,0x80d,0x812,0x81a,0x821,0x829,0x4c6, +0x611,0x831,0x839,0x841,0x849,0x59e,0x859,0x851,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x861,0x611,0x869,0x86d,0x875,0x611,0x87b,0x611,0x881,0x889,0x891,0x59e,0x59e,0x899, +0x8a1,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x8a6,0x8ae,0x611,0x611,0x8b6,0x8be,0x8c6,0x8ce,0x8d6,0x611,0x8de,0x8e6,0x8ee, +0x8fe,0x611,0x906,0x908,0x910,0x8f6,0x611,0x913,0x927,0x91b,0x923,0x92f,0x611,0x937,0x93d,0x945, +0x94d,0x611,0x95d,0x965,0x96d,0x955,0x56d,0x975,0x985,0x988,0x990,0x97d,0x9a0,0x998,0x611,0x9a7, +0x611,0x9b6,0x9af,0x9be,0x9c6,0x9ca,0x9d2,0x9da,0x546,0x9e2,0x9e5,0x9eb,0x9f2,0x9e5,0x56d,0x56d, +0x4f6,0x4f6,0x4f6,0x4f6,0x9fa,0x4f6,0x4f6,0x4f6,0xa0a,0xa12,0xa1a,0xa22,0xa2a,0xa2e,0xa36,0xa02, +0xa4e,0xa56,0xa3e,0xa46,0xa5e,0xa66,0xa6d,0xa75,0xa8d,0xa7d,0xa85,0xa95,0xa9d,0xaac,0xab1,0xaa4, +0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xac1,0xac9,0x945,0xacc,0xad4,0xadb,0xae0,0xae8, +0x945,0xaee,0xaf6,0xb06,0xb09,0x945,0x945,0xafe,0x945,0x945,0x945,0x945,0x945,0xb18,0xb20,0xb10, +0x945,0x945,0x945,0xb25,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0xb2b,0xb33,0x945,0xb3b,0xb42, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0xab9,0xab9,0xab9,0xab9,0xb4a,0xab9,0xb51,0xb58, +0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0x945,0xb60,0xb67,0xb6b,0x945,0x945,0x945,0x945, +0x59e,0x5a6,0x546,0xb73,0x4f6,0x4f6,0x4f6,0xb7b,0x546,0xb83,0x611,0xb89,0xb99,0xb91,0xb91,0x56d, +0xba9,0xbb1,0xbb9,0xba1,0xbc1,0x945,0x945,0xbc8,0x945,0x945,0x945,0x945,0x945,0x945,0xaeb,0xbcd, +0xbdd,0xbd5,0x652,0x611,0xbe5,0x8a1,0x611,0xbed,0xbf5,0xbf9,0x611,0x611,0xbfe,0x611,0x945,0xc05, +0xc0d,0xc15,0xc1b,0x945,0xc15,0xc23,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0xc2b,0x611,0x611,0x611,0xc33,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0xc39,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xc3e,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x945,0x945, +0xc46,0xc4d,0xc4f,0x611,0xc57,0xc5d,0xc65,0xc6d,0xc72,0x611,0x611,0xc76,0x611,0x611,0x611,0xc7c, +0xc83,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xc8a,0x611,0xc91,0xc97,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xc9f,0x611,0x611,0x611,0xca7,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0xca9,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xcb0,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0xcb7,0x611,0x611,0x611,0xcbe,0xcc6,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0xccb,0xcd0,0x611,0x611,0xcd8,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xcdc,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xce1,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xcdf,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xce9,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0xcef,0xcf7,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xcfd, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0xd04,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0xd09,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0xd0e,0x611,0x611,0x611,0xc4a,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0xceb,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0xd14,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0xd1c,0xd23,0xd27,0x611,0x611,0x611,0xce3,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0xd36,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0xd2e,0x945,0xd3e,0x9be,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0xd43,0xd4b,0x4f6,0xd5b,0xd53,0x611,0x611,0xd63,0xd6b,0xd7b,0x4f6,0xd80,0xd88,0xd8e,0xd95,0xd73, +0xd9d,0xda5,0x611,0xdad,0xdbd,0xdc0,0xdb5,0xdc8,0x666,0xdd0,0xdd7,0x907,0x6b4,0xde7,0xddf,0xdef, +0x611,0xdf7,0xdff,0xe07,0x611,0xe0f,0xe17,0xe1f,0xe27,0xe2f,0xe33,0xe3b,0x546,0x546,0x611,0xe43, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xe4b,0xe57,0xe4f, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f, +0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0x611,0x611,0x611,0xe6f,0x611,0xce4,0xe76,0xe7b, +0x611,0x611,0x611,0xe83,0x611,0x611,0x912,0x4c6,0xe99,0xe89,0xe91,0x611,0x611,0xea1,0xea9,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xeae,0x949,0x611,0xeb6,0x611,0xebc,0xec0, +0xec8,0xed0,0xed7,0xedf,0x611,0x611,0x611,0xee5,0xefd,0x4b6,0xf05,0xf0d,0xf12,0x927,0xeed,0xef5, +0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f, +0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f,0xe5f, +0x1318,0x1318,0x1358,0x1398,0x13d8,0x1410,0x1450,0x1490,0x14c8,0x1508,0x1534,0x1574,0x15b4,0x15c4,0x1604,0x1638, +0x1678,0x16a8,0x16e8,0x1728,0x1738,0x176c,0x17a4,0x17e4,0x1824,0x1864,0x1898,0x18c4,0x1904,0x193c,0x1958,0x1998, +0xa80,0xac0,0xb00,0xb40,0xb80,0xbb5,0xbf5,0x1db,0xc18,0xa40,0xa40,0xa40,0xc50,0xc90,0x1db,0x1db, +0x1db,0xcd0,0xd04,0xa40,0xa40,0xd13,0xd53,0xd73,0xa40,0xd99,0xdd9,0xe19,0xe59,0xe99,0xed9,0xf18, +0xf58,0xf8f,0x1db,0x1db,0xfb3,0xfe7,0x1db,0x100f,0x1db,0x1db,0x1db,0x1db,0x103c,0x1db,0x1db,0x1db, +0x1db,0x1db,0x1db,0x1db,0x1050,0x1db,0x1db,0x1090,0x1db,0x109b,0x1db,0x1db,0x1db,0x10d1,0xa40,0x1111, +0x1db,0x1db,0x1151,0x1db,0x1171,0x1db,0x1198,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0x1db,0x1db,0x1db,0x1db,0x1db,0x11d8, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, @@ -169,511 +170,516 @@ static const uint16_t propsTrie_index[24108]={ 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0x1192,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0x1218,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x11d2, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x1258, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x11d2, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0xefa,0xf01,0xf09,0x4a5,0x5f0,0x5f0,0x5f0,0xf11,0xf21,0xf19,0xf38,0xf29,0xf30,0xf40,0xbad,0xf48, -0x4a5,0x4a5,0x4a5,0x4a5,0x8e6,0x5f0,0xf50,0xf58,0x5f0,0xf60,0xf68,0xf6c,0xf74,0x5f0,0xf7c,0x4a5, -0x57d,0x587,0xf84,0x5f0,0xf88,0xf90,0xfa0,0xf98,0x5f0,0xfa8,0x5f0,0xfaf,0xfbf,0xfb7,0x5f0,0xfc7, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xb81,0x8f2,0xfca,0xfda,0xfd2,0x4a5,0x4a5, -0xfea,0xfe2,0xfed,0xff5,0x906,0xffd,0x4a5,0x1005,0x100d,0x1015,0x8f1,0x4a5,0x5f0,0x1025,0x102d,0x101d, -0x103d,0x1044,0x1035,0x104c,0x1054,0x4a5,0x1064,0x105c,0x5f0,0x1067,0x106f,0x1077,0x107f,0x1087,0x4a5,0x4a5, -0x5f0,0x5f0,0x108f,0x4a5,0x57d,0x1097,0x525,0x109f,0x5f0,0x10a7,0x10be,0x10af,0x10b6,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x10c6,0x5f0,0x10ce,0x10db,0x10d3,0x10e3,0x10eb,0x10f2,0x1001,0x10fa,0x1001,0x1102,0xb81, -0x1112,0x626,0x111a,0x110a,0x987,0x1122,0x112a,0x1130,0x1148,0x1138,0x1140,0x114c,0x987,0x115c,0x1154,0x1164, -0x117c,0x116c,0x1174,0x4a5,0x1183,0x118b,0x648,0x1193,0x11a3,0x11a9,0x11b1,0x119b,0x11c1,0x11c5,0x11cd,0x11b9, -0x5f0,0x11d5,0x11dd,0x11e5,0x5f0,0x11ed,0x11f5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x11fd,0x1205,0x4a5, -0x5f0,0x120d,0x1215,0x121d,0x5f0,0x122d,0x1225,0x1235,0x124d,0x123d,0x1245,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x5f0,0x1255,0x4a5,0x4a5,0x4a5,0x57d,0x525,0x125d,0x126d,0x1273,0x1265,0x4a5,0x4a5,0x1283,0x1287,0x127b, -0x129f,0x128f,0x1297,0x5f0,0x12ad,0x12a7,0x5f0,0x8e7,0x12bd,0x4a5,0x4a5,0x12b5,0x4a5,0x4a5,0x5f0,0x12c5, -0x12db,0x12e0,0x12cd,0x12d5,0x12f0,0x12e8,0x4a5,0x4a5,0x12ff,0x1303,0x12f7,0x131a,0x130b,0x1313,0x131d,0x1325, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x132d,0x133d,0x1342,0x1335,0x4a5,0x4a5,0x134a,0x135a,0x1352, -0x5f0,0x1362,0x5f0,0x1369,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x1370,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x1376,0x5f0,0x5f0,0x5f0,0x137a,0x4a5,0x4a5,0x4a5, -0x138a,0x1392,0x139a,0x1382,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x13a2,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1001,0x5f0,0x5f0,0x13aa,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x13b2,0x13ba,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xf11,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x1245,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x637,0x13c2, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x8e7,0x906,0xdc3,0x5f0,0x906,0x1313,0x13ca,0x5f0,0x13d2, -0x13da,0x13e2,0xfc8,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x13f2,0x13ea,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x57d,0x525,0x13fa,0x140a,0x1402,0x4a5,0x5f0,0x5f0, -0x1412,0x1417,0x141d,0x4a5,0x4a5,0x1425,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x8f2,0x142b,0x906,0x4a5, -0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x1433,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1438,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x1440, -0x1445,0x144c,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xe2f,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x1452,0x1457,0x145f,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x924,0x924,0x924,0x924, -0x924,0x924,0x924,0x1467,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, -0x924,0x146f,0x147e,0x1476,0x54c,0x148e,0x1495,0x924,0x924,0x924,0x1486,0x4a5,0x924,0x924,0x924,0x924, -0x924,0x924,0x924,0xad3,0x924,0x149c,0x924,0x14a3,0x14ab,0x14b1,0x924,0xade,0x924,0x924,0x14b9,0x4a5, -0x4a5,0x4a5,0x14c1,0x14c1,0x924,0x924,0x14c9,0x14d1,0x4a5,0x4a5,0x4a5,0x4a5,0x14e1,0x14e8,0x14ed,0x14f3, -0x14fb,0x1503,0x150b,0x14e5,0x1513,0x151b,0x1523,0x1528,0x14fa,0x14e1,0x14e8,0x14e4,0x14f3,0x1530,0x14e2,0x1533, -0x14e5,0x153b,0x1543,0x154b,0x1552,0x153e,0x1546,0x154e,0x1555,0x1541,0x155d,0x14d9,0x924,0x924,0x924,0x924, -0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x54c,0x156d,0x54c,0x1574, -0x157b,0x1565,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x158a,0x1592,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1582,0x159a,0x9cc,0x15aa, -0x15a2,0x4a5,0x4a5,0x4a5,0x5f0,0x15ba,0x15b2,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x1001,0x15c2,0x5f0,0x15ca,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x1001,0x15d2,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1001,0x15da,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x906,0x15e2,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x15ea,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x15f2,0x4a5,0x57d,0x1602,0x15fa,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x160a, -0x161a,0x1612,0x4a5,0x4a5,0x162a,0x1622,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x163a,0x1642,0x164a,0x1652, -0x165a,0x1662,0x4a5,0x1632,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x924,0x166a,0x924,0x924, -0xba8,0x149a,0x1672,0xad3,0x167a,0x924,0x924,0x924,0x924,0xad5,0x4a5,0x1682,0x168a,0x168e,0x1696,0x169e, -0x4a5,0x4a5,0x4a5,0x4a5,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x16a6,0x924,0x924,0x924,0x924, -0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, -0x924,0x924,0x16ae,0x16b1,0x924,0x924,0x924,0x924,0x924,0x924,0xad2,0x16b9,0x166a,0x924,0x16c1,0x924, -0x16c9,0x16ce,0x16d6,0x4a5,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x16e6,0x16de, -0x16ee,0x924,0x16f5,0x16fd,0x924,0x924,0x924,0x924,0x1705,0x924,0x924,0x170a,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x1712,0x5f0,0x5f0,0x1719, -0x5f0,0x5f0,0x5f0,0x1721,0x5f0,0x1729,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xc9b,0x5f0,0x5f0,0x1731, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x1739,0x1741,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0xc2a,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x1748,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x174f,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x1756,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x4a5,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0xf88,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0xe63,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x175e,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xf88,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x5f0,0x1762,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0xf88,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x66d, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x5f0, -0x5f0,0x5f0,0x5f0,0x5f0,0x5f0,0x8f1,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x1772,0x176a,0x176a,0x176a,0x4a5,0x4a5,0x4a5,0x4a5,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c, -0x54c,0x177a,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5,0x4a5, -0x4a5,0x4a5,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47,0xe47, -0xe47,0x1782,0x484,0x484,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x1258, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0xf1a,0xf21,0xf29,0x4c6,0x611,0x611,0x611,0xf31,0xf41,0xf39,0xf58,0xf49,0xf50,0xf60,0xbcd,0xf68, +0x4c6,0x4c6,0x4c6,0x4c6,0x907,0x611,0xf70,0xf78,0x611,0xf80,0xf88,0xf8c,0xf94,0x611,0xf9c,0x4c6, +0x59e,0x5a8,0xfa4,0x611,0xfa8,0xfb0,0xfc0,0xfb8,0x611,0xfc8,0x611,0xfcf,0xfdf,0xfd7,0x611,0xfe7, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xb99,0x913,0xfea,0xff9,0xff2,0x4c6,0x4c6, +0x1009,0x1001,0x100c,0x1014,0x927,0x101c,0x4c6,0x1024,0x102c,0x1034,0x912,0x4c6,0x611,0x1044,0x104c,0x103c, +0x105c,0x1063,0x1054,0x106b,0x1073,0x4c6,0x1083,0x107b,0x611,0x1086,0x108e,0x1096,0x109e,0x10a6,0x4c6,0x4c6, +0x611,0x611,0x10ae,0x4c6,0x59e,0x10b6,0x546,0x10be,0x611,0x10c6,0x10dd,0x10ce,0x10d5,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x10e5,0x611,0x10ed,0x10fd,0x10f5,0x1104,0x110c,0x1113,0x1020,0x111b,0x1020,0x1123,0xb99, +0x1133,0x647,0x113b,0x112b,0x9a0,0x1143,0x114b,0x1151,0x1169,0x1159,0x1161,0x116d,0x9a0,0x117d,0x1175,0x1185, +0x119d,0x118d,0x1195,0x4c6,0x11a4,0x11ac,0x669,0x11b4,0x11c4,0x11ca,0x11d2,0x11bc,0x11e2,0x11e6,0x11ee,0x11da, +0x611,0x11f6,0x11fe,0x1206,0x611,0x120e,0x1216,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x611,0x121e,0x1226,0x4c6, +0x611,0x122e,0x1236,0x123e,0x611,0x124e,0x1246,0x1256,0x126e,0x125e,0x1266,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x611,0x1276,0x4c6,0x4c6,0x4c6,0x59e,0x546,0x127e,0x128e,0x1294,0x1286,0x4c6,0x4c6,0x12a4,0x12a8,0x129c, +0x12c0,0x12b0,0x12b8,0x611,0x12ce,0x12c8,0x611,0x908,0x12de,0x4c6,0x4c6,0x12d6,0x4c6,0x4c6,0x611,0x12e6, +0x12fc,0x1301,0x12ee,0x12f6,0x1311,0x1309,0x4c6,0x4c6,0x1320,0x1324,0x1318,0x133b,0x132c,0x1334,0x133e,0x1346, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x134e,0x135e,0x1363,0x1356,0x4c6,0x4c6,0x136b,0x137b,0x1373, +0x611,0x1383,0x611,0x138a,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x1391,0x611,0x611,0x611,0x611,0x611,0x611,0x1397,0x611,0x611,0x611,0x139b,0x4c6,0x4c6,0x4c6, +0x13a9,0x13b1,0x13b9,0x13a3,0x611,0x611,0x611,0x611,0x611,0x611,0x13c1,0x13d9,0x13e1,0x13e9,0x13f1,0x13f9, +0x1401,0x1409,0x1411,0x13c9,0x13d1,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x1020,0x611,0x611,0x1419,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x1421,0x1429,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xf31,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x1266,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x658,0x1431,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x908,0x927,0xde3,0x611,0x927,0x1334,0x1439,0x611,0x1441,0x1449,0x1451,0xfe8,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x1461,0x1459,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x59e,0x546,0x1469,0x1479,0x1471,0x4c6,0x611,0x611,0x1481,0x1486,0x148c,0x4c6,0x4c6,0x1494, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0xf31,0x149a,0x611,0x14a2,0x4c6,0x4c6,0x611,0x611,0x611,0x14aa, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x14b2,0x611,0x14aa,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x14b7,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x14bf,0x14c4,0x14cb,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xe4f,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x611,0x611,0x611,0x14d1,0x14d6,0x14de,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x14e6,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x14ee,0x14fd, +0x14f5,0x56d,0x150d,0x1514,0x945,0x945,0x945,0x1505,0x4c6,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0xaeb,0x945,0x151b,0x945,0x1522,0x152a,0x1530,0x945,0x945,0x945,0x945,0x1538,0x945,0x1540,0x4c6,0x1548, +0x1548,0x945,0x945,0x1550,0x1558,0x4c6,0x4c6,0x4c6,0x4c6,0x1568,0x156f,0x1574,0x157a,0x1582,0x158a,0x1592, +0x156c,0x159a,0x15a2,0x15aa,0x15af,0x1581,0x1568,0x156f,0x156b,0x157a,0x15b7,0x1569,0x15ba,0x156c,0x15c2,0x15ca, +0x15d2,0x15d9,0x15c5,0x15cd,0x15d5,0x15dc,0x15c8,0x15e4,0x1560,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x56d,0x15f4,0x56d,0x15fb,0x1602,0x15ec,0x4c6, +0x4c6,0x160a,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x1612,0x546,0x161a,0x1620,0x1628,0x4c6,0x162e,0x9e5,0x1636,0x163e,0x9e5,0x164e,0x1646,0x4c6,0x4c6, +0x4c6,0x611,0x165e,0x1656,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x1020,0x1666,0x611, +0x166e,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x1020, +0x1676,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x1020,0x167e,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x927, +0x1686,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x168e,0x611,0x611,0x611,0x611,0x611,0x611,0x1696, +0x4c6,0x59e,0x16a6,0x169e,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x16ae,0x16be,0x16b6,0x4c6, +0x4c6,0x16ce,0x16c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x16de,0x16e6,0x16ee,0x16f6,0x16fe,0x1706,0x4c6, +0x16d6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x945,0x170e,0x945,0x945,0xbc8,0x1713,0x1717, +0xaeb,0x171f,0x945,0x945,0x945,0x945,0x1724,0x4c6,0x172b,0x1733,0x1737,0x173f,0x1747,0x4c6,0x4c6,0x4c6, +0x4c6,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x174f,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x1757, +0x175e,0x945,0x945,0x945,0x945,0x945,0x945,0x1737,0x170e,0x945,0x1766,0x945,0x176e,0x1773,0x177b,0x4c6, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x1783,0x175a,0x945,0x945,0x178b,0x1793, +0x945,0x945,0x945,0x945,0x179b,0x945,0x945,0x17a0,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x17a8,0x611,0x611,0x17af,0x611,0x611,0x611,0x17b7, +0x611,0x17bf,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xcbb,0x611,0x611,0x17c7,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x17cf,0x17d7,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0xc4a, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x17de,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x17e5,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x17ec, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x4c6,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x927,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0xe83,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x17f4,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0xfa8,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x611,0x611,0x611,0x611,0x17f8,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0xfa8,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x68e,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x1800,0x611,0x611,0x611,0x611,0x611,0x1801,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x912,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611, +0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x611,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x1811,0x1809,0x1809,0x1809,0x4c6,0x4c6,0x4c6,0x4c6, +0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x56d,0x1819,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6, +0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0x4c6,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0x1821,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, -0x18,0x18,0x18,0x17,0x17,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x14, -0x17,0x15,0x1a,0x16,0x1a,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x14, -0x18,0x15,0x18,0xf,0,0,0,0,0,0,0,0,0,0,0,0, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17, +0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17,0x17,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x14,0x17,0x15,0x1a,0x16,0x1a,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,0x14,0x18,0x15,0x18,0xf,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0,0,0,0,0,0,0,0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xc,0x17,0x19,0x19,0x19,0x19,0x1b,0x17,0x1a,0x1b,5,0x1c, -0x18,0x10,0x1b,0x1a,0x1b,0x18,0x34b,0x38b,0x1a,2,0x17,0x17,0x1a,0x30b,5,0x1d, -0x34cb,0x344b,0x3ccb,0x17,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,0x18,1,1,1,1, -1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,0x18,2,2,2,2, -2,2,2,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xc,0x17,0x19,0x19,0x19,0x19,0x1b,0x17, +0x1a,0x1b,5,0x1c,0x18,0x10,0x1b,0x1a,0x1b,0x18,0x34b,0x38b,0x1a,2,0x17,0x17, +0x1a,0x30b,5,0x1d,0x34cb,0x344b,0x3ccb,0x17,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18, +1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x18, +2,2,2,2,2,2,2,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,2,1,2,1, -2,1,2,1,2,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,1,2,1,2,1,2,2,2,1,1,2, -1,2,1,1,2,1,1,1,2,2,1,1,1,1,2,1, -1,2,1,1,1,2,2,2,1,1,2,1,1,2,1,2, -1,2,1,1,2,1,2,2,1,2,1,1,2,1,1,1, -2,1,2,1,1,2,2,5,1,2,2,2,5,5,5,5, -1,3,2,1,3,2,1,3,2,1,2,1,2,1,2,1, 2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,2,1,3,2, -1,2,1,1,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,2,2,2,2,2,2,1,1, -2,1,1,2,2,1,2,1,1,1,1,2,1,2,1,2, -1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2, +1,2,1,2,1,2,1,2,1,1,2,1,2,1,2,2, +2,1,1,2,1,2,1,1,2,1,1,1,2,2,1,1, +1,1,2,1,1,2,1,1,1,2,2,2,1,1,2,1, +1,2,1,2,1,2,1,1,2,1,2,2,1,2,1,1, +2,1,1,1,2,1,2,1,1,2,2,5,1,2,2,2, +5,5,5,5,1,3,2,1,3,2,1,3,2,1,2,1, +2,1,2,1,2,1,2,1,2,1,2,1,2,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +2,1,3,2,1,2,1,1,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,2,2,2,2, +2,2,1,1,2,1,1,2,2,1,2,1,1,1,1,2, +1,2,1,2,1,2,1,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,5,5,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,5,5,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,4,4,4,4,4, -4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,0x1a,4,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,4, +4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +4,0x1a,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -1,2,1,2,4,0x1a,1,2,0,0,4,2,2,2,0x17,1, -0,0,0,0,0x1a,0x1a,1,0x17,1,1,1,0,1,0,1,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,0,1,1,1,1,1,1,1,1,1,2,2,2,2, +6,6,6,6,1,2,1,2,4,0x1a,1,2,0,0,4,2, +2,2,0x17,1,0,0,0,0,0x1a,0x1a,1,0x17,1,1,1,0, +1,0,1,1,2,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,1,2,2,1,1,1,2,2,2,1,2,1,2, +2,2,2,2,2,2,2,1,2,2,1,1,1,2,2,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,2,2,2,2,1,2,0x18,1,2,1,1,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,2,1,2,1,2,1,2,2,2,2,2,1,2,0x18,1, +2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,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, +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,1,2,1,2,1,2,1,2,1,2,1,2, +2,2,2,2,2,2,2,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,0x1b,6,6,6,6,6,7,7,1,2, +1,2,1,2,1,2,1,2,1,2,0x1b,6,6,6,6,6, +7,7,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,1,2,1,2,1,2,1, +2,1,2,1,2,1,2,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,1,2,1,2,1,2,1,2,1,2,1, -2,1,2,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,0,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, -0,4,0x17,0x17,0x17,0x17,0x17,0x17,2,2,2,2,2,2,2,2, +1,2,1,2,1,2,1,2,0,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0,4,4,0x17,0x17,0x17,0x17,0x17,0x17,2,2,2,2, 2,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,0x13,0,0,0x1b,0x1b,0x19, -0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +2,2,2,2,2,2,2,2,2,2,2,2,2,0x17,0x13,4, +4,0x1b,0x1b,0x19,0,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,0x13,6, -0x17,6,6,0x17,6,6,0x17,6,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,5, -5,5,5,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0, -0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x18,0x18,0x17,0x17,0x19,0x17,0x17,0x1b,0x1b, -6,6,6,6,6,6,6,6,6,6,6,0x17,0x10,0x17,0x17,0x17, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,0x13,6,0x17,6,6,0x17,6,6,0x17,6,6,6,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,5,5,5,5,0x17,0x17,0,0,0,0,0,0,0, +0,0,0,0,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x18,0x18,0x17,0x17,0x19, +0x17,0x17,0x1b,0x1b,6,6,6,6,6,6,6,6,6,6,6,0x17, +0x10,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,5,5,5,5, -4,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6, +5,5,5,5,4,5,5,5,5,5,5,5,5,5,5,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,5,5, -6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, +0x17,0x17,5,5,6,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x17,5,6,6,6,6,6,6,6,0x10,0x1b,6, -6,6,6,6,6,4,4,6,6,0x1b,6,6,6,6,5,5, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,0x1b,0x1b,5, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0x10, -5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x17,5,6,6,6,6,6,6, +6,0x10,0x1b,6,6,6,6,6,6,4,4,6,6,0x1b,6,6, +6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5, +5,0x1b,0x1b,5,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0,0x10,5,6,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,0,0,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,0,0,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6, -6,6,6,6,6,5,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +6,6,6,6,6,6,6,6,6,5,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, -6,6,6,6,6,6,6,6,4,4,0x1b,0x17,0x17,0x17,4,0, -0,6,0x19,0x19,6,6,6,6,4,6,6,6,4,6,6,6, -6,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,6,6,6,6,4,6, -6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6, -0,0,0x17,0,5,5,5,5,5,5,5,5,5,5,5,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x1a,5,5,5,5,5,5,5,0x10,0x10,0,0, -0,0,0,6,6,6,6,6,6,6,6,6,6,6,0x10,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,5,5,5,5, -5,5,5,5,5,4,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,5,5,6,6, -0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,4,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,8, +5,5,5,6,6,6,6,6,6,6,6,6,4,4,0x1b,0x17, +0x17,0x17,4,0,0,6,0x19,0x19,6,6,6,6,4,6,6,6, +4,6,6,6,6,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +6,6,4,6,6,6,6,6,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,8, -6,5,8,8,8,6,6,6,6,6,6,6,6,8,8,8, -8,6,8,8,5,6,6,6,6,6,6,6,5,5,5,5, -5,5,5,5,5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,5,5,0x19,0x19,0x37cb,0x35cb,0x3fcb,0x34cb,0x3ccb,0x94b,0x1b,0x19, -5,0x17,6,0,5,6,8,8,0,5,5,5,5,5,5,5, -5,0,0,5,5,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,5,5,5,0,5,0, -0,0,5,5,5,5,0,0,6,5,8,8,8,6,6,6, -6,0,0,8,8,0,0,8,8,6,5,0,0,0,0,0, -0,0,0,8,0,0,0,0,5,5,0,5,0,0,0,0, -0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,6,6,5,5, -5,6,0x17,0,0,0,0,0,0,0,0,0,0,6,6,8, -0,5,5,5,5,5,5,0,0,0,0,5,5,0,0,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,5,5,5,0,5,5,0,5,5,0,5,5,0,0, -6,0,8,8,8,6,6,0,0,0,0,6,6,0,0,6, -6,6,0,0,0,6,0,0,0,0,0,0,0,5,5,5, -5,0,5,0,5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0x17,0x19,0,0,0,0,0,0,0,5,6,6, -6,6,6,6,0,6,6,8,0,5,5,5,5,5,5,5, -5,5,0,5,5,5,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,5,5,5,0,5,5, -0,5,5,5,5,5,0,0,6,5,8,8,8,6,6,6, -6,6,0,6,6,8,0,8,8,6,0,0,5,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,6,6, -0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x1b,5,0x34cb,0x344b, -0x3ccb,0x37cb,0x35cb,0x3fcb,0,0,0,0,0,0,0,0,0,6,8,8, -0,5,5,5,5,5,5,5,5,0,0,5,5,0,0,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,5,5,5,0,5,5,0,5,5,5,5,5,0,0, -6,5,8,6,8,6,6,6,6,0,0,8,8,0,0,8, -8,6,0,0,0,0,0,0,0,6,6,8,0,0,0,0, -5,5,0,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x1b,0, -0,0,0,0,0,0,6,5,0,5,5,5,5,5,5,0, -0,0,5,5,5,0,5,5,5,5,0,0,0,5,5,0, -5,0,5,5,0,0,0,5,5,0,0,0,5,5,5,0, -0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,0,8,8,6,8,8,0,0,0,8,8,8,0,8,8, -8,6,0,0,5,0,0,0,0,0,0,8,0,0,0,0, -0,0,0,0,5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0,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,6,5,6,6,6,8,8,8, -8,0,6,6,6,0,6,6,6,6,0,0,0,0,0,0, -0,6,6,0,5,5,5,0,5,5,0,0,5,5,6,6, -0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,5,5,8, -0,0,0,0,0,0,0,0,0,0,0,0,5,6,8,8, -0x17,5,5,5,5,5,5,5,5,0,5,5,5,0,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,5,5,5,5,5,5,0,5,5,5,5,5,0,0, -6,5,8,6,8,8,8,8,8,0,6,8,8,0,8,8, -6,6,0,0,0,0,0,0,0,8,8,0,0,0,0,0, -5,5,5,0,5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,5,5, -5,5,5,5,6,6,8,8,5,5,5,5,5,5,5,5, -5,0,5,5,5,0,5,5,5,5,5,5,5,5,5,5, +5,6,6,6,0,0,0x17,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,5,5,5,0x1a,5,5,5,5,5,5,5, +0x10,0x10,0,0,0,0,0,6,6,6,6,6,6,6,6,6, +6,6,0x10,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +5,5,5,5,5,5,5,5,5,4,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +5,5,6,6,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x17,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,8,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,6,6,5,8,8,8,6,6,6,6,0,8,8, -8,0,8,8,8,6,5,0x1b,0,0,0,0,5,5,5,8, -0xcc0b,0xca0b,0xcb4b,0xc90b,0x364b,0xc94b,0x350b,5,0,0,0,0,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,8,8,0x17,0,0,0, -0,0,0,0,0,0,0,0,0,6,8,8,0,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5, -0,5,0,0,5,5,5,5,5,5,5,0,0,0,6,0, -0,0,0,8,8,8,6,6,6,0,6,0,8,8,8,8, -8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,6,5,5,6,6,6,6,6,6,6,0, -0,0,0,0x19,5,5,5,5,5,5,4,6,6,6,6,6, -6,6,6,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, -0,0,0,0,0,5,5,0,5,0,5,5,5,5,5,0, +5,5,6,8,6,5,8,8,8,6,6,6,6,6,6,6, +6,8,8,8,8,6,8,8,5,6,6,6,6,6,6,6, +5,5,5,5,5,5,5,5,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,0x19,0x19,0x37cb,0x35cb,0x3fcb,0x34cb, +0x3ccb,0x94b,0x1b,0x19,5,0x17,6,0,5,6,8,8,0,5,5,5, +5,5,5,5,5,0,0,5,5,0,0,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, +5,0,5,0,0,0,5,5,5,5,0,0,6,5,8,8, +8,6,6,6,6,0,0,8,8,0,0,8,8,6,5,0, +0,0,0,0,0,0,0,8,0,0,0,0,5,5,0,5, +0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +6,6,5,5,5,6,0x17,0,0,0,0,0,0,0,0,0, +0,6,6,8,0,5,5,5,5,5,5,0,0,0,0,5, +5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,0, +5,5,0,0,6,0,8,8,8,6,6,0,0,0,0,6, +6,0,0,6,6,6,0,0,0,6,0,0,0,0,0,0, +0,5,5,5,5,0,5,0,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x19,0,0,0,0,0,0, +0,5,6,6,6,6,6,6,0,6,6,8,0,5,5,5, +5,5,5,5,5,5,0,5,5,5,0,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, +5,0,5,5,0,5,5,5,5,5,0,0,6,5,8,8, +8,6,6,6,6,6,0,6,6,8,0,8,8,6,0,0, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x1b,5,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0,0,0,0,0,0,0,0, +0,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, +5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,5, +5,5,0,0,6,5,8,6,8,6,6,6,6,0,0,8, +8,0,0,8,8,6,0,0,0,0,0,6,6,6,6,8, +0,0,0,0,5,5,0,5,0,0,0,0,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x19,0x1b,0,0,0,0,0,0,0,6,5,0,5,5,5, +5,5,5,0,0,0,5,5,5,0,5,5,5,5,0,0, +0,5,5,0,5,0,5,5,0,0,0,5,5,0,0,0, +5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,0,0,8,8,6,8,8,0,0,0,8,8, +8,0,8,8,8,6,0,0,5,0,0,0,0,0,0,8, +0,0,0,0,0,0,0,0,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0,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,6,5,6,6, +6,8,8,8,8,0,6,6,6,0,6,6,6,6,0,0, +0,0,0,0,0,6,6,0,5,5,5,0,5,5,0,0, +5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0,5,5,8,0,0,0,0,0,0,0,0,0,0,0,0, +5,6,8,8,0x17,5,5,5,5,5,5,5,5,0,5,5, +5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,5,5,5,5,5,5,5,5,5,5,0,5,5,5, +5,5,0,0,6,5,8,6,8,8,8,8,8,0,6,8, +8,0,8,8,6,6,0,0,0,0,0,0,0,8,8,0, +0,0,0,0,5,5,5,0,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb, +0x3fcb,0x1b,5,5,5,5,5,5,6,6,8,8,5,5,5,5, +5,5,5,5,5,0,5,5,5,0,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,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,6,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,6,6,5,8,8,8,6,6,6, +6,0,8,8,8,0,8,8,8,6,5,0x1b,0,0,0,0, +5,5,5,8,0xcc0b,0xca0b,0xcb4b,0xc90b,0x364b,0xc94b,0x350b,5,0,0,0,0, +0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,8,8, +0x17,0,0,0,0,0,0,0,0,0,0,0,0,6,8,8, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, +5,5,5,5,0,5,0,0,5,5,5,5,5,5,5,0, +0,0,6,0,0,0,0,8,8,8,6,6,6,0,6,0, +8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,6,5,5,6,6,6,6, +6,6,6,0,0,0,0,0x19,5,5,5,5,5,5,4,6, +6,6,6,6,6,6,6,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0,0,0,0,0,5,5,0,5,0,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,6,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,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,8,6,6,6,6,6,0x17,6,6,5,5,5,5, -5,6,6,6,6,6,6,6,6,6,6,6,0,6,6,6, +5,5,5,5,5,0,0,0,0,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,8,6,6,6,6,6,0x17,6,6, +5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6, +0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,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,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, +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,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,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,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,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,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,5,5,5,5,5,6,6,6,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,5,5,5,6,6,8,0x17,0x17,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,6,6,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,0,5,5,5,0,6,6,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,8,6, +6,6,6,6,6,6,8,8,8,8,8,8,8,8,6,8, +8,6,6,6,6,6,6,6,6,6,6,6,0x17,0x17,0x17,4, +0x17,0x17,0x17,0x19,5,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, +0x74b,0x78b,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,6,5,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17, +0x17,0x17,0x17,6,6,6,0x10,6,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, -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,0,0,0,0,0,0,0, +5,5,5,5,5,6,6,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,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,5,5,5,5,5,6,6,6,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,5,5,5,6,6,8,0x17,0x17,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,0,6,6,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,8,6,6,6,6,6, -6,6,8,8,8,8,8,8,8,8,6,8,8,6,6,6, -6,6,6,6,6,6,6,6,0x17,0x17,0x17,4,0x17,0x17,0x17,0x19, -5,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,6,5,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x17,0x17,6, -6,6,0x10,6,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,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,0,0,0,0,0,0,0,5,5,5,5, -5,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,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,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,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, +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,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,6, +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,6,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,6,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,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,0x17,0x17,0x17,6,6,6,6,8,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,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, -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,0,0,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,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,0x17,0x17,0x17, -6,6,6,6,8,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,5,0,0x17,0x17, +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, -6,8,6,6,6,6,6,8,6,8,8,8,8,8,6,8, -8,5,5,5,5,5,5,5,5,0,0x17,0x17,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,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, -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,1,2,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,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,0x17,0x17,2,2,2,2,2,2,2,2, +2,1,2,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,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,2,2,2,2,2,2,2,2,2,2,2,2,2, -4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4, -4,4,4,4,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,2,2,2,2,2,2, -2,2,1,2,2,2,2,2,2,2,2,2,1,1,1,1, -1,0x1a,0x1a,0x1a,0,0,2,2,2,0,2,2,1,1,1,1, -3,0x1a,0x1a,0,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1, -1,1,0,0,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1, -1,1,0,0,2,2,2,2,2,2,2,2,0,1,0,1, -0,1,0,1,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,0,0,2,2,2,2,2,2,2,2,3,3,3,3, -3,3,3,3,2,2,2,2,2,2,2,2,3,3,3,3, -3,3,3,3,2,2,2,2,2,0,2,2,1,1,1,1, -3,0x1a,2,0x1a,0x1a,0x1a,2,2,2,0,2,2,1,1,1,1, -3,0x1a,0x1a,0x1a,2,2,2,2,0,0,2,2,1,1,1,1, -0,0x1a,0x1a,0x1a,0x16,0x17,0x17,0x17,0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0xc,0x10,0x10,0x10,0x10,0x10,0,0x10,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x2cb,4,0,0,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18, -0x18,0x14,0x15,4,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10, -0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c, -0x1c,0x1d,0x14,0x1c,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10, -0x10,0x10,0x10,0xc,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17, -0x17,0x17,0x17,0x16,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18, -0x18,0x14,0x15,0,4,4,4,4,4,4,4,4,4,4,4,4, -4,0,0,0,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, +4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2, +2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,4,4,4,4,4,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,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, 0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, -0x19,0x19,0x19,0x19,0x19,0x19,0,0,0,0,0,0,0,0,0,0, +0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,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, @@ -750,6 +756,8 @@ static const uint16_t propsTrie_index[24108]={ 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,0x14,0x15,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0x17,0x17,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, @@ -864,7 +872,7 @@ static const uint16_t propsTrie_index[24108]={ 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, +0x1a,0x1a,0x1a,4,4,4,4,4,4,4,4,4,0,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4, 4,1,2,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, @@ -875,7 +883,7 @@ static const uint16_t propsTrie_index[24108]={ 1,2,1,1,1,1,1,2,1,1,1,1,1,2,1,2, 1,2,1,2,1,2,1,2,1,1,1,1,2,1,2,1, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,0,0,0,5,5,6,5,5,5,6,5,5,5,5,6, +1,1,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, 6,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b,0x19,0x1b,0,0, @@ -915,7 +923,7 @@ static const uint16_t propsTrie_index[24108]={ 5,5,5,0,5,5,5,5,5,5,5,0,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0x1a,4,4,4,4,2,2,2,2, -2,2,2,2,2,4,0x1a,0x1a,0,0,0,0,2,2,2,2, +2,2,2,2,2,4,0x1a,0x1a,1,1,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, @@ -1026,375 +1034,408 @@ static const uint16_t propsTrie_index[24108]={ 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,4,0,4,4,4,4,4,4, -4,4,4,0,0,0,0,0,4,4,4,4,4,4,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,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5, -5,0,0,0,5,0,0,5,5,5,5,5,5,5,0,0, -5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0x17,0x58b,0x5cb,0x60b,0x7cb, -0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x1b,0x1b,0x58b,0x5cb,0x60b, -0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x64b, -0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,5,5,0,0,0,0,0,0x58b, -0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,0xa4b,0x1e4b,0x5cb,0x60b, -0,0,0,0x17,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b, -0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b,0x34cb,0x348b,0x46cb,0x344b, -0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb, -0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b, -0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b,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, +4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,5,5,0,0,0, +5,0,0,5,5,5,5,5,5,5,0,0,5,0,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,6,6,6,0,0,0,0,6, +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,5,5,5,5,5,5,0x58b,0x11cb,0x17, +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,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,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,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,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,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,1,1,1,1, -1,1,0,0,0,6,6,6,6,6,0x13,4,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,0x18,0x18,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,5,5,5,5,4,5,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,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,0,6,6,0x13,0,0,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,6,6,6,6,6,6,0,0,5,5, -5,4,5,5,0,0,0,0,0,0,0,0,0x17,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,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,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,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,5,5,6,6,6,6,0x17,0x17, -0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,0x58b,0x5cb,0x60b, -0x64b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,6,5,5,6,6,5,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,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,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,6,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,5,0,0,0,0,0,0,0,0, +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, -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,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,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,8,6, -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,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,1,1,1,1,1,1,0,0, +0,6,6,6,6,6,0x13,4,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,0x18,0x18,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,5,5, +5,5,4,5,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,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,0,6, +6,0x13,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,0,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0,0,5,5,5,4,5,5,0,0x1a,0x1a,6, +6,6,6,6,0x17,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,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,5, -5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +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, -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,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,5,5,6,6, +6,6,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x144b,0x16cb,0x194b,0x1bcb, +0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,6,5,5,6, +6,5,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,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,0,6,6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,0,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,0,5,8,8,8,6, -6,6,6,6,6,0,8,0,0,8,0,8,8,8,8,0, -8,8,6,8,6,5,6,5,0x17,0x17,0,0x17,0x17,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,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,0x17,0x17, -0,0x17,6,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,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, +6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17,0x17,0x17,6,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,5,0,0,0,0, 0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,8,8,8,6,6,6,6,0,0,8,8,8,8, -6,6,8,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, -6,6,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,8, -8,6,8,6,6,0x17,0x17,0x17,5,0,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89, -0xc9,0x109,0x149,0x189,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,0x17,0,0, -0,0,0,0,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,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,0,0,0,0,0, +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,8,6,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,5,5,6,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,5,5,5,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,8,6,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,8,5,8,6,0x17,0x17,0x17,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,5,5,5,5,5,5,5,0,0,5,0,0, -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,5,8,8,8,8, -8,8,0,8,8,0,0,6,6,8,6,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,0,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5, +5,5,5,5,5,5,5,5,5,0x17,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,8,6,6,6,6,6,6,6,6,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +5,5,8,8,0,0,6,6,6,6,6,6,6,0,0,0, +6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0, +6,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, +5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +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,0,6,6,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,0,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,0,5, +8,8,8,6,6,6,6,6,6,0,8,0,0,8,0,8, +8,8,8,0,8,8,6,8,6,5,6,5,0x17,0x17,0,0x17, +0x17,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,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,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, -6,6,6,6,6,6,6,6,6,6,6,8,6,6,0x17,0x17, -0x17,5,0x17,0x17,6,8,6,6,6,8,6,8,0,0,0,0, +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,0x17,0x17,0,0x17,6,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,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,8,8,8,6,6,6,6,6, +6,8,6,8,8,8,8,6,6,8,6,6,5,5,0x17,5, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,8,8,8,6,6,6,6,0,0, +8,8,8,8,6,6,8,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +5,5,5,5,6,6,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,8,8,8,6,6,6,6,6, +6,6,6,8,8,6,8,6,6,0x17,0x17,0x17,5,0,0,0, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,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,0x17,0,0,0,0,0,0,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,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, +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,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,0x17,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,5,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb, -0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb, -0x1e4b,0,0,0,0x17,0x17,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8, -6,6,6,6,6,6,6,0,6,6,6,6,6,6,8,6, -6,6,6,6,6,6,6,6,0,8,6,6,6,6,6,6, -6,8,6,6,8,6,6,0,0,0,0,0,0,0,0,0, +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,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,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,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,5,5,4,5,5, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +5,5,5,0,0,6,8,6,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,8,5,8,6,0x17,0x17,0x17,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,5,5,5,5,5,5,5,0, +0,5,0,0,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,5, +8,8,8,8,8,8,0,8,8,0,0,6,6,8,6,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, -0,0,0,0,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,6,8,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,6,0, -0,0,0,0,6,6,5,8,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,8,8,6,6, -6,6,6,0,0,0,8,8,0,0,0,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,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,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,5,5,5,5,5, -0x585,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,0x585,5,5, -5,5,5,5,5,5,0x3445,5,5,5,5,0x5c5,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,0x585,5,0x605,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, -5,0x5c5,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, +0x17,0x17,0x17,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,6,6,6,6,6,6,6,6,6,6,6,6,6,8, +6,6,0x17,0x17,0x17,5,0x17,0x17,6,8,6,6,6,8,6,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,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x17,0x17,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,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,5,5,5,5,5,5,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,6,6,6,6,6,6,6,6, -6,6,8,8,8,6,6,6,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,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,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,0x17,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,0x7cb,0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,0,5,5,5,5,5, +0x249,0x289,0,0,0,0,0,0,5,0x17,0x17,0x17,0x17,0x17,0,0, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb, +0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0,0,0,0x17,0x17,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,4,4,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,4,4,4,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,5,5,5,5,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,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,1,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,2,2,2,2,2,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,6,5,8,8,8,8,8,8,8, +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, +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,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,5, +5,4,5,5,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,6,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,6,6,8,8,0x17, +0x17,0,0,0,0,0,0,0,6,8,6,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,6,0,0,0,0,0,6,6,5,8,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,6,6,6,6,6,0,0,0,8,8,0,0,0,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,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,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x585,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,0x585,5,5,5,5,5,5,5,5,0x3445,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,0x585,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,0x5c5,0,0,0,0,0,0,0x34ca,0x354a,0x34ca,0x34ca, +0x344a,0x348a,0x388a,0xf4a,0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x70a,0x17,0x17,0x17,0x17, +0x17,0x74a,0x78a,0x58a,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,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a, +0x64a,0x68a,0x6ca,0x70a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x58a,0x5ca, +0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x58a, +0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x58a,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a, +0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x58a,0x5ca,0x60a, +0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x35ca,0x35ca,0x34ca,0x34ca,0x344a, +0x58a,0x5ca,0x58a,0x5ca,0x60a,0x64a,0x68a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x348a,0x388a,0x58a,0x5ca, +0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x58a,0x5ca,0x58a,0x58a, +0x58a,0x58a,0x58a,0x58a,0x58a,0x58a,0x58a,0x58a,0x58a,0x58a,0x58a,0x5ca,0x60a,0x64a,0x58a,0x5ca, +0x60a,0x64a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a, +0x58a,0x5ca,0x60a,0x64a,0x68a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca, +0x60a,0x64a,0x68a,0x58a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x58a,0x58a, +0x5ca,0x60a,0x64a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a, +0x78a,0x58a,0x58a,0x58a,0x58a,0x58a,0x58a,0x5ca,0x60a,0x64a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x58a, +0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca, +0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x58a,0x58a,0x58a,0x58a,0x58a,0x58a,0x58a,0x5ca,0x60a, +0x64a,0x58a,0x5ca,0x60a,0x64a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca, +0x70a,0x74a,0x78a,0x58a,0x5ca,0x58a,0x5ca,0x58a,0x58a,0x58a,0x58a,0x5ca,0x60a,0x58a,0x5ca,0x60a, +0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca, +0x70a,0x74a,0x78a,0x58a,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x17,0x17,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,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, +0x10,0x10,0x10,0x10,6,5,5,5,5,5,5,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,6,6,6,6,6,6,6,6,6,6,8,8, +8,6,6,6,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,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,5,5,5,5,5,5,5,5,5,5,5,4, +4,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,4,4,4,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,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,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, +0,0,0,0,1,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,2, +2,2,2,2,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,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,6,0,0,0,0,0,0,0, -0,0,0,0,8,8,4,4,0x58a,0x3c4a,0x5ca,0,0,0,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,6,0,0,0,0,0,0,0,0,0,0,0, +8,8,4,4,0x58a,0x3c4a,0x5ca,0,0,0,0,0,0,0,0,0, 0,0,0,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,5,5,0, +0,0,0,0,0,0,0,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, -4,4,4,4,0,4,4,4,4,4,4,4,0,4,4,0, -5,5,5,0,0,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,0,5,5,5,0,0,5,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, +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,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,4,4,4,4, +0,4,4,4,4,4,4,4,0,4,4,0,5,5,5,5, +5,5,5,5,5,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,0, +5,5,5,0,0,5,0,0,0,0,0,0,0,0,0,0, 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, +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,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,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,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, -0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,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,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,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,0,0,0,0, +0,0,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,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, +0,0x18,0x18,0x18,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,0,0,0,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,0,0,6,6,6,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,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, +0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,0,0,6,6,6,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, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,0x1b,6,6,6,0x1b,0,0,0,0,0,0, +0x1b,0x1b,6,6,6,0x1b,0,0,0,0,0,0,0,0,0,0, +8,8,8,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,0x1b,0x1b,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,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,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,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,2,2, +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, +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, +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,2,2,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,2,2,2,2,2,2,2,0,2,2,2,2,2,2, -2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, +2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,1,0,1,1,0,0,1,0,0,1,1,0, +0,1,1,1,1,0,1,1,1,1,1,1,1,1,2,2, +2,2,0,2,0,2,2,2,2,2,2,2,0,2,2,2, +2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,2,2,2,2,1,1,0,1, +1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,1, +1,1,1,1,1,0,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -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, +1,1,0,1,1,1,1,0,1,1,1,1,1,0,1,0, +0,0,1,1,1,1,1,1,1,0,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,1,1,0,1,1,1,1,0,1,1,1,1, -1,0,1,0,0,0,1,1,1,1,1,1,1,0,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +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,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, -2,2,0,0,1,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, +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,2,2,2,2,0x18,2,2,2,2,2,2,1,1, +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,1,1,1,1,0x18,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,0x18,2,2, -2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,0x18,2,2,2,2,2,2,1,2, -0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,0, +1,1,1,0x18,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,0x18,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +2,2,2,0x18,2,2,2,2,2,2,1,2,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,0,0,6,6,6,6,6,2,2,2,2,2,2,2,2, +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,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0,0,0,2,2,2,2,2,2,2,2, 2,2,5,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,0,0,0,0,0,0,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,6,6,0,6,6,0,6,6, +2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2, +1,2,1,2,2,1,2,2,2,1,2,2,2,2,2,2, +2,2,2,2,2,2,2,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, +5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,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,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,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,6,0,0,0,0,0,0,0,0, @@ -1448,2809 +1489,2854 @@ static const uint16_t propsTrie_index[24108]={ 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,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,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,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0,0,0,0,0,0,0,0x1b,0x1b,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, +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,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,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0x1b,0x1b,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0x1b,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,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,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0,0,0,0,0,0,0,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,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,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,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,0x1b,0,0,0, -0,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,0, -0,0,0,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, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x1b,0,0,0,0,0,5,0x705,5,5,5,5,5,5, +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,0x1b,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,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,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0,0x1b,0,0,0,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,0,0,0,0x1b,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,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x1b,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,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x645,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,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,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,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,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,0x605,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,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,5,0x605,5,5,5,5,5,5,5, +5,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,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,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, +0x785,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0x8005,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0x11c5,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0,0x10,0,0,0,0,0,0, +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, -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,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,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0,0,0 +0x11,0x11,0,0,0,0,0,0 }; static const UTrie2 propsTrie={ propsTrie_index, - propsTrie_index+4628, + propsTrie_index+4760, nullptr, - 4628, - 19480, + 4760, + 19984, 0xa40, - 0x1294, + 0x1318, 0x0, 0x0, 0x110000, - 0x5e28, + 0x60a4, nullptr, 0, false, false, 0, nullptr }; -static const uint16_t propsVectorsTrie_index[43132]={ -0x5c9,0x5d1,0x5d9,0x5e1,0x5f9,0x601,0x609,0x611,0x619,0x621,0x629,0x631,0x639,0x641,0x649,0x651, -0x659,0x661,0x669,0x671,0x679,0x681,0x689,0x691,0x699,0x6a1,0x6a9,0x6b1,0x6b9,0x6c1,0x6c9,0x6d1, -0x6d9,0x6e1,0x6e8,0x6f0,0x6f8,0x700,0x708,0x710,0x718,0x720,0x725,0x72d,0x734,0x73c,0x744,0x74c, -0x754,0x75c,0x764,0x76c,0x773,0x77b,0x783,0x78b,0x793,0x79b,0x7a3,0x7ab,0x7b3,0x7bb,0x7c3,0x7cb, -0x2581,0x7d3,0x7db,0x7e3,0x7e9,0x26cb,0x28bc,0x270f,0x1642,0x1648,0x1650,0x163a,0x7f1,0x7f7,0x7ff,0x807, -0x80f,0x815,0x81d,0x825,0x82d,0x833,0x83b,0x843,0x84b,0x851,0x859,0x861,0x869,0x871,0x879,0x880, -0x888,0x88e,0x896,0x89e,0x8a6,0x8ac,0x8b4,0x8bc,0x8c4,0x16be,0x8cc,0x8d4,0x8dc,0x8e4,0x8ec,0x8f4, -0x8fc,0x900,0x908,0x5e9,0x910,0x918,0x920,0x5e9,0x1fe6,0x1fee,0x928,0x930,0x938,0x940,0x948,0x5e9, -0x2194,0x2065,0x205d,0x24a2,0x249a,0x1660,0x950,0x1658,0x1f74,0x1f74,0x1f76,0x167c,0x167d,0x1670,0x1672,0x1674, -0x2034,0x2036,0x958,0x2036,0x960,0x965,0x96d,0x202c,0x973,0x2036,0x979,0x981,0x989,0x2024,0x2024,0x991, -0x207d,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e,0x207e, -0x207e,0x207e,0x207e,0x2075,0x999,0x206d,0x206d,0x9a1,0x9a9,0x9b1,0x9b9,0x9c1,0x218c,0x203e,0x9c9,0x9d1, -0x9d9,0x2046,0x204e,0x9e1,0x2055,0x9e9,0x2529,0x9ed,0x9f5,0x9fd,0xa05,0xa0a,0x23d0,0xa12,0xa19,0x233c, -0xa21,0x25e0,0xa29,0xa31,0xa39,0xa41,0xa49,0xa51,0x2428,0x242d,0xa59,0x2420,0x24f9,0x24f1,0x25fb,0xa61, -0x24c1,0xa69,0xa71,0x24de,0xa79,0xa7d,0xa85,0xa8d,0x2344,0x2324,0x2334,0x232c,0x23ac,0x23a4,0x23f8,0x244a, -0x1685,0x168d,0x169d,0x1695,0x16a4,0x16b4,0x16b4,0x16b6,0xa95,0x1668,0xa99,0xaa1,0x1668,0xaa9,0xab1,0xab9, -0x1475,0x146d,0x14ad,0xac1,0xac9,0x1495,0x13dd,0xad1,0x1485,0x148d,0x14a5,0x16ac,0xad9,0x14bd,0x14c4,0x14cc, -0x1553,0x155b,0x1563,0x156b,0x1573,0x157a,0x1582,0x158a,0x14d4,0x14dc,0x14df,0x14e1,0x201c,0x22bb,0x22c1,0x2408, -0x14df,0x13f6,0x13fe,0x16ce,0x16d3,0x16d6,0x16dc,0x149d,0x16e4,0x16e4,0x14e9,0x14b5,0x14ed,0x14f5,0x14fd,0x1505, -0x150d,0x1515,0x151d,0x1525,0x22c9,0x2314,0x2474,0x25cd,0x152d,0x1533,0x153b,0x1543,0x147d,0x154b,0x22d1,0x22d8, -0x2086,0x2087,0x2087,0x2087,0x2087,0x2087,0x2087,0x2087,0x22dc,0x22dc,0x22dc,0x22dc,0x22e4,0x22dc,0x22eb,0x22f2, -0x22fa,0x22dc,0x22dc,0x22fe,0x22dc,0x22dc,0x2304,0x22dc,0x231c,0x2410,0x2464,0x1406,0x2745,0x274b,0x2753,0x27fb, -0x23c0,0x23b4,0x23b8,0x2418,0x237c,0x237c,0x237c,0xae1,0x2384,0xae9,0x23d8,0xaf0,0xaf8,0xb00,0xb00,0x2509, -0x2374,0x246c,0x140e,0x1416,0xb08,0x2097,0x2097,0xb10,0x209f,0x209f,0x209f,0x209f,0x209f,0x209f,0xb18,0xb1e, -0x1711,0x16c6,0xb26,0x1f8d,0xb2e,0x1fab,0x1fb3,0x1fbb,0xb36,0xb3b,0x1f7e,0x1f85,0xb40,0x208f,0x23f0,0xb48, -0xb50,0x1fc3,0x1fca,0x1719,0x1fda,0x1fde,0x1f95,0x1f99,0x1fa1,0x1fa1,0x1fa3,0x1729,0x1731,0x1731,0x1732,0x1fd2, -0x20a7,0x20a7,0x20ae,0x20ab,0x20a7,0x20a7,0x20a7,0x20b5,0x20a7,0x20a7,0x20a7,0x20aa,0x20b7,0x20bf,0x20c7,0x20cb, -0x20d3,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, -0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20b0,0x20a7,0x20a7,0x20db,0x20a7,0x20a7,0x20e0,0x20e8, -0x20b0,0x20a7,0x20f0,0x20f8,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20fd,0x20c7,0x20a7,0x20a7,0x2105,0x20a7,0x20a7, -0x20a7,0x20a7,0x20a7,0x20c7,0x20a7,0x20a7,0x20a7,0x20b6,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20e5, -0x20a7,0x20a7,0x20a7,0x20b1,0x20a7,0x20a7,0x20b2,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, -0x20a7,0x20a7,0x2108,0x210f,0x20a7,0x20a9,0x20a8,0x20a7,0x20a7,0x20aa,0x20a8,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, -0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20aa,0x20a7,0x20a7,0x20a7,0x2114,0x2119,0x20a7, -0x20a7,0x20a7,0x2105,0x20a7,0x20a7,0x20a7,0x2108,0x2121,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, -0x2122,0x20a7,0x20b3,0x212a,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x2132,0x20a7,0x2135,0x2127,0x20a7,0x20a7,0x20b1, -0x20a7,0x20a7,0x20a7,0x20a7,0x213d,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20ae,0x20b8,0x2145,0x214d,0x20a7,0x20a7, -0x2153,0x20a7,0x20a7,0x20a7,0x20a7,0x20b0,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7,0x20a7, -0x20a7,0x20a7,0x20a7,0x212d,0x215b,0x2163,0x20a7,0x20a7,0x2167,0x20a7,0x20a7,0x20a7,0x20a7,0x216e,0x235c,0x235c, -0x174f,0x1755,0x1f6c,0x175b,0x1762,0x176a,0x176e,0x1775,0x177d,0x1783,0x178b,0x178f,0x1794,0x179c,0x17a4,0x17ac, -0x1759,0x17b4,0x17bc,0x17c3,0x17cb,0x17d3,0x17db,0x17e3,0x17e9,0x17e6,0x17f1,0x17f9,0x1801,0x1809,0x1811,0x1819, -0x1f6c,0x1f6c,0x1772,0x1820,0x1825,0x1f6c,0x182c,0x1834,0x183c,0x1844,0x184c,0x1854,0x17c2,0x185c,0x1863,0x186b, -0x1873,0x1879,0x175a,0x1755,0x179a,0x178e,0x1f6c,0x1762,0x187c,0x1f6c,0x1769,0x1873,0x1f6c,0x1f6c,0x1f6c,0x1884, -0x188b,0x1893,0x1899,0x18a1,0x18a9,0x18b1,0x18b8,0x18bf,0x18c7,0x18cf,0x18d7,0x18df,0x18e7,0x18ed,0x1860,0x1f6c, -0x186d,0x1f6c,0x18f1,0x18f9,0x178e,0x18ff,0x1907,0x190f,0x1917,0x191f,0x1925,0x1f6c,0x1f6c,0x192c,0x1f6c,0x1769, -0x1f6c,0x1933,0x17c5,0x1938,0x193f,0x1768,0x1772,0x1839,0x1854,0x178d,0x1946,0x194e,0x18eb,0x1956,0x195e,0x1f6c, -0x1966,0x196e,0x18b1,0x1f6c,0x1975,0x17c5,0x1978,0x178e,0x1f6c,0x1980,0x1987,0x17c2,0x198c,0x1994,0x199b,0x1762, -0x174f,0x1f6c,0x19a3,0x1f6c,0x174f,0x18b1,0x17c2,0x19a9,0x1799,0x19b0,0x1f6c,0x1f6c,0x18fb,0x19b8,0x19c0,0x19c8, -0x1f6c,0x19d0,0x1762,0x19d8,0x1927,0x1975,0x19de,0x19e6,0x19ee,0x19f6,0x1f6c,0x19fe,0x1a06,0x1925,0x184e,0x1a0e, -0x1975,0x1a12,0x192c,0x1f6c,0x19d5,0x1f6c,0x1a19,0x179a,0x1765,0x1a21,0x17e9,0x1f6c,0x1a27,0x1f6c,0x178f,0x1f6c, -0x1f6c,0x1a2c,0x1a34,0x1a19,0x179b,0x1a3c,0x1a42,0x1a48,0x1a50,0x18ed,0x1a58,0x187a,0x1a60,0x179e,0x1a67,0x1a6f, -0x192c,0x1a77,0x1a7e,0x1a86,0x1a8a,0x17b0,0x1a92,0x1773,0x1a9a,0x1aa1,0x1f6c,0x1769,0x1aa7,0x1aad,0x1926,0x178d, -0x1ab5,0x1abc,0x1ac1,0x18b1,0x1a12,0x1ac9,0x1ad1,0x1ad9,0x1755,0x1a19,0x1754,0x1f6c,0x1adb,0x1879,0x1ae3,0x1f6c, -0x176a,0x1aea,0x1af0,0x1af8,0x1aff,0x1b07,0x1b0f,0x1755,0x1764,0x1a37,0x1b15,0x1b1d,0x1f6c,0x176b,0x1f6c,0x1b25, -0x1af0,0x1b2c,0x1975,0x1794,0x1f6c,0x17c2,0x176b,0x1758,0x1b34,0x17c1,0x1f6c,0x178f,0x1b3c,0x1b42,0x1f6c,0x1b48, -0x1b50,0x179a,0x176e,0x1b57,0x1b5f,0x1f6c,0x17e9,0x19d0,0x19ce,0x1f6c,0x1b67,0x178d,0x1b6a,0x192c,0x1b72,0x1978, -0x1a82,0x1f6c,0x1b79,0x1b7d,0x1b85,0x1b8c,0x178e,0x1a19,0x18ed,0x1b93,0x192c,0x1b99,0x1823,0x1a5d,0x19cc,0x17eb, -0x1b9f,0x1ba7,0x1bae,0x1f6c,0x1f6c,0x1bb4,0x1f6c,0x1f6c,0x1bbb,0x18ed,0x1772,0x1f6c,0x17c3,0x1f6c,0x1a18,0x1bc0, -0x176b,0x1bc7,0x1bcf,0x17e9,0x1bd4,0x1f6c,0x1bdc,0x1768,0x1f6c,0x17c2,0x1be4,0x1bec,0x1975,0x1ab8,0x17c3,0x1799, -0x1f6c,0x176e,0x1bf3,0x1772,0x1754,0x1bfb,0x1c03,0x1768,0x1c0b,0x1c13,0x1879,0x17c1,0x1762,0x1c1b,0x1c23,0x1c2b, -0x1f6c,0x19bb,0x1c33,0x1762,0x18ed,0x1f6c,0x1a5e,0x1c37,0x1c3d,0x1c45,0x178d,0x1c4b,0x1c52,0x1c5a,0x1c62,0x1f6c, -0x1c6a,0x1c6f,0x1f6c,0x1c76,0x1c7e,0x1c85,0x1c8d,0x1c93,0x186b,0x1c9b,0x1ca3,0x1f6c,0x1f6c,0x1cab,0x1f6c,0x18b1, -0x17e9,0x1c81,0x1cb0,0x1762,0x1cb8,0x176e,0x1cbf,0x1cc7,0x1f6c,0x1ccf,0x1cd5,0x1cdc,0x1ce4,0x178a,0x1ceb,0x1ced, -0x176b,0x1f6c,0x17e9,0x17c1,0x187a,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1a2c,0x1cf5,0x1f6c,0x1cfc,0x1758,0x1d03,0x17c1, -0x179a,0x1d0b,0x17c2,0x179b,0x1d10,0x1d17,0x1adb,0x1f6c,0x1d1f,0x17ae,0x1f6c,0x1f6c,0x1d26,0x1f6c,0x1768,0x1d2d, -0x1772,0x17c1,0x1a18,0x1975,0x176e,0x174f,0x1f6c,0x1b34,0x17be,0x1759,0x178e,0x1f6c,0x1f6c,0x1a19,0x1f6c,0x19e4, -0x1d32,0x1f6c,0x176b,0x1f6c,0x1d39,0x192c,0x19d0,0x1754,0x1d3d,0x1c80,0x1d42,0x1adb,0x1772,0x1d47,0x176e,0x1d4e, -0x1d56,0x192c,0x192c,0x178e,0x1824,0x1b33,0x178e,0x1d5e,0x187a,0x19a8,0x1975,0x178f,0x1c24,0x1f6c,0x18b1,0x1759, -0x1aee,0x1d62,0x1d69,0x18b1,0x1f6c,0x1f6c,0x1f6c,0x1d71,0x1983,0x17c1,0x1f6c,0x1d78,0x1d80,0x1d87,0x1f6c,0x1d8f, -0x1d97,0x1d9f,0x1768,0x1da7,0x176f,0x1bc1,0x1759,0x176e,0x1f6c,0x1daf,0x1f6c,0x1db7,0x1dbf,0x1f6c,0x1f6c,0x1f6c, -0x1f6c,0x176b,0x1dc7,0x188e,0x1dcf,0x179b,0x1dd3,0x1ab8,0x1ddb,0x1f6c,0x1f6c,0x17c3,0x1f6c,0x179b,0x17c2,0x1975, -0x17d9,0x174f,0x1d67,0x1de0,0x17e9,0x1de8,0x1bde,0x1759,0x1773,0x1d62,0x1a18,0x1f6c,0x187a,0x1def,0x1df7,0x1769, -0x1f6c,0x1dfd,0x1b33,0x1f6c,0x1f6c,0x1768,0x1b43,0x1762,0x179a,0x1e03,0x178d,0x17e9,0x1e0b,0x1e12,0x17c1,0x1e1a, -0x1e1e,0x1879,0x19d0,0x1e26,0x1e2e,0x187a,0x1e36,0x1879,0x17c3,0x17af,0x1f6c,0x1e3e,0x1e46,0x1e4d,0x1f6c,0x1e55, -0x1e5d,0x17c1,0x1aef,0x1e65,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1e6c,0x19a6,0x1e74,0x1e7c,0x1f6c, -0x1f6c,0x1e84,0x1c7f,0x1e8c,0x1e94,0x1e9c,0x1f6c,0x1ea3,0x1eab,0x1eb2,0x1eba,0x1d39,0x193a,0x1ec0,0x1ec8,0x17c3, -0x1adb,0x1ecf,0x1ed6,0x1edd,0x1f6c,0x192c,0x179a,0x1ee4,0x178d,0x17e9,0x1eeb,0x1f6c,0x1f6c,0x1adb,0x1f6c,0x1ef3, -0x1ef9,0x17e9,0x1a9c,0x19d0,0x1f6c,0x1f00,0x1dee,0x1f08,0x1f10,0x18e0,0x19cb,0x181d,0x1e0e,0x1f6c,0x1879,0x1762, -0x1f18,0x1f6c,0x1f20,0x1f28,0x1f6c,0x1f6c,0x1f6c,0x1f6c,0x1f2f,0x1f36,0x1f6c,0x1754,0x178e,0x1750,0x17c2,0x1af0, -0x1f3e,0x1f6c,0x1f6c,0x17e9,0x1f46,0x1f4d,0x1f6c,0x17c7,0x1f55,0x179b,0x1f5c,0x1754,0x1f6c,0x1f64,0x2501,0x28e4, -0x217e,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184, -0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184,0x2184, -0x2184,0x2184,0x2184,0x2184,0xb58,0x2176,0xb60,0x259d,0x24ce,0x24ce,0x24ce,0x24ce,0x24ce,0x24ce,0x24ce,0x24ce, -0x24c9,0xb68,0x2484,0x247c,0x2486,0x2595,0x2595,0xb70,0x236c,0x2400,0x248e,0x2492,0x245c,0x25f3,0xb78,0xb80, -0x23c8,0xb88,0x2435,0xb90,0x24e6,0x24e9,0xb98,0x2519,0x24b2,0x24b9,0xba0,0xba8,0x254d,0x2551,0xbb0,0xbb8, -0x24aa,0xbc0,0xbc8,0x2521,0x2589,0x258d,0xbd0,0xbd8,0xbe0,0xbe8,0x273d,0xbf0,0x2803,0x2803,0x2561,0xbf8, -0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f, -0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011, -0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013, -0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e, -0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010, -0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012, -0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014, -0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f, -0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011, -0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013, -0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e, -0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010, -0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012, -0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014, -0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f, -0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011, -0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013, -0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e, -0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010, -0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012, -0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014, -0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0x2014,0x200e,0x200f,0x2010,0x2011,0x2012,0x2013,0xc00,0xc07,0xc0a, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, -0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, -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, -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, -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, -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, -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, -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, -0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173f,0x1747,0x230c,0x141e,0x23e8,0x23e8,0x1422,0x1429,0xc12,0xc1a,0xc22,0x15aa,0x15b1,0x15b9,0x15c1,0x15c9, -0x162a,0x162a,0x1592,0x159a,0x15d1,0x1621,0x1622,0x1632,0x15d9,0x15de,0x15e6,0x15ee,0x15f6,0x15fe,0x1606,0x15a2, -0xc2a,0x1721,0xc32,0xc3a,0x160e,0x1614,0x1619,0xc42,0xc4a,0x1701,0x1709,0x16f4,0x16f9,0xc52,0xc5a,0xc62, -0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, -0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6,0x1ff6, -0x17a4,0x17a4,0x17e4,0x1824,0x1864,0x18a4,0x18e4,0x1924,0x1964,0x19a4,0x19e4,0x1a24,0x1a64,0x1aa4,0x1ae4,0x1b24, -0x1b64,0x1ba0,0x1be0,0x1c20,0x1c60,0x1c94,0x1cd0,0x1d10,0x1d50,0x1d90,0x1dcc,0x1e0c,0x1e4c,0x1e8c,0x1ecc,0x1f0c, -0xa80,0xac0,0xb00,0xb40,0xb80,0xbab,0xbeb,0x16a1,0xc0e,0xa40,0xa40,0xa40,0xc46,0xc86,0x157d,0x157d, -0x157e,0xcc6,0xa40,0xa40,0xa40,0xcf6,0xd36,0xd56,0xa40,0xd7c,0xdbc,0xdfc,0xe3c,0xe7c,0xf3c,0xebc, -0x1224,0x1260,0x12a0,0x12af,0x12e9,0x1310,0x12af,0x1346,0x136c,0x1393,0x13ca,0x12af,0x13f8,0x1437,0x12af,0x1466, -0x149c,0x14b6,0x12af,0x13de,0xfcc,0x14f6,0x14fd,0x100c,0x153d,0x1017,0x15be,0x15be,0x15be,0x104d,0x1080,0x10c0, -0x15fe,0x15fe,0x1100,0x163e,0x1661,0x16e1,0x1140,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080, -0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1080,0x1164, +static const uint16_t propsVectorsTrie_index[43864]={ +0x5e7,0x5ef,0x5f7,0x5ff,0x617,0x61f,0x627,0x62f,0x637,0x63f,0x647,0x64f,0x657,0x65f,0x667,0x66f, +0x677,0x67f,0x687,0x68f,0x697,0x69f,0x6a7,0x6af,0x6b7,0x6bf,0x6c7,0x6cf,0x6d7,0x6df,0x6e7,0x6ef, +0x6f7,0x6ff,0x706,0x70e,0x716,0x71e,0x726,0x72e,0x736,0x73e,0x743,0x74b,0x752,0x75a,0x762,0x76a, +0x772,0x77a,0x782,0x78a,0x791,0x799,0x7a1,0x7a9,0x7b1,0x7b9,0x7c1,0x7c9,0x7d1,0x7d9,0x7e1,0x7e9, +0x25b4,0x7f1,0x7f9,0x801,0x807,0x26fe,0x28f7,0x2742,0x1664,0x166a,0x1672,0x165c,0x80f,0x815,0x81d,0x825, +0x82d,0x833,0x83b,0x843,0x84b,0x851,0x859,0x861,0x869,0x86f,0x877,0x87f,0x887,0x88f,0x897,0x89e, +0x8a6,0x8ac,0x8b4,0x8bc,0x8c4,0x8ca,0x8d2,0x8da,0x8e2,0x16e0,0x8ea,0x8f2,0x8fa,0x902,0x90a,0x912, +0x91a,0x91e,0x926,0x607,0x92e,0x936,0x93e,0x607,0x2008,0x2010,0x946,0x94e,0x956,0x95e,0x966,0x607, +0x21b6,0x2087,0x207f,0x24d5,0x24cd,0x1682,0x96e,0x167a,0x1f96,0x1f96,0x1f98,0x169e,0x169f,0x1692,0x1694,0x1696, +0x2056,0x2058,0x976,0x2058,0x97e,0x983,0x98b,0x204e,0x991,0x2058,0x997,0x99f,0x9a7,0x2046,0x2046,0x9af, +0x209f,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0,0x20a0, +0x20a0,0x20a0,0x20a0,0x2097,0x9b7,0x208f,0x208f,0x9bf,0x9c7,0x9cf,0x9d7,0x9df,0x21ae,0x2060,0x9e7,0x9ef, +0x9f7,0x2068,0x2070,0x9ff,0x2077,0xa07,0x255c,0xa0b,0xa13,0xa1b,0xa23,0xa28,0x23fb,0xa30,0xa37,0x2367, +0xa3f,0x2613,0xa47,0xa4f,0xa57,0xa5f,0x29e6,0xa67,0x2453,0x2458,0xa6f,0x244b,0x252c,0x2524,0x262e,0xa77, +0x24f4,0xa7f,0xa87,0x2511,0xa8f,0xa93,0xa9b,0xaa3,0x236f,0x234f,0x235f,0x2357,0x23d7,0x23cf,0x2423,0x247d, +0x16a7,0x16af,0x16bf,0x16b7,0x16c6,0x16d6,0x16d6,0x16d8,0xaab,0x168a,0xaaf,0xab7,0x168a,0xabf,0xac7,0xacf, +0x148f,0x1487,0x14cf,0xad7,0x14c7,0x14af,0x13f7,0xadf,0x149f,0x14a7,0x14bf,0x16ce,0xae7,0x14df,0x14e6,0x14ee, +0x1575,0x157d,0x1585,0x158d,0x1595,0x159c,0x15a4,0x15ac,0x14f6,0x14fe,0x1501,0x1503,0x203e,0x22e6,0x22ec,0x2433, +0x1501,0x1410,0x1418,0x16f0,0x16f5,0x16f8,0x16fe,0x14b7,0x1706,0x1706,0x150b,0x14d7,0x150f,0x1517,0x151f,0x1527, +0x152f,0x1537,0x153f,0x1547,0x22f4,0x233f,0x24a7,0x2600,0x154f,0x1555,0x155d,0x1565,0x1497,0x156d,0x22fc,0x2303, +0x20a8,0x20a9,0x20a9,0x20a9,0x20a9,0x20a9,0x20a9,0x20a9,0x2307,0x2307,0x2307,0x2307,0x230f,0x2307,0x2316,0x231d, +0x2325,0x2307,0x2307,0x2329,0x2307,0x2307,0x232f,0x2307,0x2347,0x243b,0x2497,0x1420,0x2778,0x277e,0x2786,0x2836, +0x23eb,0x23df,0x23e3,0x2443,0x23a7,0x23a7,0x23a7,0xaef,0x23af,0xaf7,0x2403,0xafe,0xb06,0xb0e,0xb0e,0x253c, +0x239f,0x249f,0x1428,0x1430,0xb16,0x20b9,0x20b9,0xb1e,0x20c1,0x20c1,0x20c1,0x20c1,0x20c1,0x20c1,0xb26,0xb2c, +0x1733,0x16e8,0xb34,0x1faf,0xb3c,0x1fcd,0x1fd5,0x1fdd,0xb44,0xb49,0x1fa0,0x1fa7,0xb4e,0x20b1,0x241b,0xb56, +0xb5e,0x1fe5,0x1fec,0x173b,0x1ffc,0x2000,0x1fb7,0x1fbb,0x1fc3,0x1fc3,0x1fc5,0x174b,0x1753,0x1753,0x1754,0x1ff4, +0x20c9,0x20c9,0x20d0,0x20cd,0x20c9,0x20c9,0x20c9,0x20d7,0x20c9,0x20c9,0x20c9,0x20cc,0x20d9,0x20e1,0x20e9,0x20ed, +0x20f5,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9, +0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20d2,0x20c9,0x20c9,0x20fd,0x20c9,0x20c9,0x2102,0x210a, +0x20d2,0x20c9,0x2112,0x211a,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x211f,0x20e9,0x20c9,0x20c9,0x2127,0x20c9,0x20c9, +0x20c9,0x20c9,0x20c9,0x20e9,0x20c9,0x20c9,0x20c9,0x20d8,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x2107, +0x20c9,0x20c9,0x20c9,0x20d3,0x20c9,0x20c9,0x20d4,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9, +0x20c9,0x20c9,0x212a,0x2131,0x20c9,0x20cb,0x20ca,0x20c9,0x20c9,0x20cc,0x20ca,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9, +0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20cc,0x20c9,0x20c9,0x20c9,0x2136,0x213b,0x20c9, +0x20c9,0x20c9,0x2127,0x20c9,0x20c9,0x20c9,0x212a,0x2143,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9, +0x2144,0x20c9,0x20d5,0x214c,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x2154,0x20c9,0x2157,0x2149,0x20c9,0x20c9,0x20d3, +0x20c9,0x20c9,0x20c9,0x20c9,0x215f,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20d0,0x20da,0x2167,0x216f,0x20c9,0x20c9, +0x2175,0x20c9,0x20c9,0x20c9,0x20c9,0x20d2,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9,0x20c9, +0x20c9,0x20c9,0x20c9,0x214f,0x217d,0x2185,0x20c9,0x20c9,0x2189,0x20c9,0x20c9,0x20c9,0x20c9,0x2190,0x2387,0x2387, +0x1771,0x1777,0x1f8e,0x177d,0x1784,0x178c,0x1790,0x1797,0x179f,0x17a5,0x17ad,0x17b1,0x17b6,0x17be,0x17c6,0x17ce, +0x177b,0x17d6,0x17de,0x17e5,0x17ed,0x17f5,0x17fd,0x1805,0x180b,0x1808,0x1813,0x181b,0x1823,0x182b,0x1833,0x183b, +0x1f8e,0x1f8e,0x1794,0x1842,0x1847,0x1f8e,0x184e,0x1856,0x185e,0x1866,0x186e,0x1876,0x17e4,0x187e,0x1885,0x188d, +0x1895,0x189b,0x177c,0x1777,0x17bc,0x17b0,0x1f8e,0x1784,0x189e,0x1f8e,0x178b,0x1895,0x1f8e,0x1f8e,0x1f8e,0x18a6, +0x18ad,0x18b5,0x18bb,0x18c3,0x18cb,0x18d3,0x18da,0x18e1,0x18e9,0x18f1,0x18f9,0x1901,0x1909,0x190f,0x1882,0x1f8e, +0x188f,0x1f8e,0x1913,0x191b,0x17b0,0x1921,0x1929,0x1931,0x1939,0x1941,0x1947,0x1f8e,0x1f8e,0x194e,0x1f8e,0x178b, +0x1f8e,0x1955,0x17e7,0x195a,0x1961,0x178a,0x1794,0x185b,0x1876,0x17af,0x1968,0x1970,0x190d,0x1978,0x1980,0x1f8e, +0x1988,0x1990,0x18d3,0x1f8e,0x1997,0x17e7,0x199a,0x17b0,0x1f8e,0x19a2,0x19a9,0x17e4,0x19ae,0x19b6,0x19bd,0x1784, +0x1771,0x1f8e,0x19c5,0x1f8e,0x1771,0x18d3,0x17e4,0x19cb,0x17bb,0x19d2,0x1f8e,0x1f8e,0x191d,0x19da,0x19e2,0x19ea, +0x1f8e,0x19f2,0x1784,0x19fa,0x1949,0x1997,0x1a00,0x1a08,0x1a10,0x1a18,0x1f8e,0x1a20,0x1a28,0x1947,0x1870,0x1a30, +0x1997,0x1a34,0x194e,0x1f8e,0x19f7,0x1f8e,0x1a3b,0x17bc,0x1787,0x1a43,0x180b,0x1f8e,0x1a49,0x1f8e,0x17b1,0x1f8e, +0x1f8e,0x1a4e,0x1a56,0x1a3b,0x17bd,0x1a5e,0x1a64,0x1a6a,0x1a72,0x190f,0x1a7a,0x189c,0x1a82,0x17c0,0x1a89,0x1a91, +0x194e,0x1a99,0x1aa0,0x1aa8,0x1aac,0x17d2,0x1ab4,0x1795,0x1abc,0x1ac3,0x1f8e,0x178b,0x1ac9,0x1acf,0x1948,0x17af, +0x1ad7,0x1ade,0x1ae3,0x18d3,0x1a34,0x1aeb,0x1af3,0x1afb,0x1777,0x1a3b,0x1776,0x1f8e,0x1afd,0x189b,0x1b05,0x1f8e, +0x178c,0x1b0c,0x1b12,0x1b1a,0x1b21,0x1b29,0x1b31,0x1777,0x1786,0x1a59,0x1b37,0x1b3f,0x1f8e,0x178d,0x1f8e,0x1b47, +0x1b12,0x1b4e,0x1997,0x17b6,0x1f8e,0x17e4,0x178d,0x177a,0x1b56,0x17e3,0x1f8e,0x17b1,0x1b5e,0x1b64,0x1f8e,0x1b6a, +0x1b72,0x17bc,0x1790,0x1b79,0x1b81,0x1f8e,0x180b,0x19f2,0x19f0,0x1f8e,0x1b89,0x17af,0x1b8c,0x194e,0x1b94,0x199a, +0x1aa4,0x1f8e,0x1b9b,0x1b9f,0x1ba7,0x1bae,0x17b0,0x1a3b,0x190f,0x1bb5,0x194e,0x1bbb,0x1845,0x1a7f,0x19ee,0x180d, +0x1bc1,0x1bc9,0x1bd0,0x1f8e,0x1f8e,0x1bd6,0x1f8e,0x1f8e,0x1bdd,0x190f,0x1794,0x1f8e,0x17e5,0x1f8e,0x1a3a,0x1be2, +0x178d,0x1be9,0x1bf1,0x180b,0x1bf6,0x1f8e,0x1bfe,0x178a,0x1f8e,0x17e4,0x1c06,0x1c0e,0x1997,0x1ada,0x17e5,0x17bb, +0x1f8e,0x1790,0x1c15,0x1794,0x1776,0x1c1d,0x1c25,0x178a,0x1c2d,0x1c35,0x189b,0x17e3,0x1784,0x1c3d,0x1c45,0x1c4d, +0x1f8e,0x19dd,0x1c55,0x1784,0x190f,0x1f8e,0x1a80,0x1c59,0x1c5f,0x1c67,0x17af,0x1c6d,0x1c74,0x1c7c,0x1c84,0x1f8e, +0x1c8c,0x1c91,0x1f8e,0x1c98,0x1ca0,0x1ca7,0x1caf,0x1cb5,0x188d,0x1cbd,0x1cc5,0x1f8e,0x1f8e,0x1ccd,0x1f8e,0x18d3, +0x180b,0x1ca3,0x1cd2,0x1784,0x1cda,0x1790,0x1ce1,0x1ce9,0x1f8e,0x1cf1,0x1cf7,0x1cfe,0x1d06,0x17ac,0x1d0d,0x1d0f, +0x178d,0x1f8e,0x180b,0x17e3,0x189c,0x1f8e,0x1f8e,0x1f8e,0x1f8e,0x1a4e,0x1d17,0x1f8e,0x1d1e,0x177a,0x1d25,0x17e3, +0x17bc,0x1d2d,0x17e4,0x17bd,0x1d32,0x1d39,0x1afd,0x1f8e,0x1d41,0x17d0,0x1f8e,0x1f8e,0x1d48,0x1f8e,0x178a,0x1d4f, +0x1794,0x17e3,0x1a3a,0x1997,0x1790,0x1771,0x1f8e,0x1b56,0x17e0,0x177b,0x17b0,0x1f8e,0x1f8e,0x1a3b,0x1f8e,0x1a06, +0x1d54,0x1f8e,0x178d,0x1f8e,0x1d5b,0x194e,0x19f2,0x1776,0x1d5f,0x1ca2,0x1d64,0x1afd,0x1794,0x1d69,0x1790,0x1d70, +0x1d78,0x194e,0x194e,0x17b0,0x1846,0x1b55,0x17b0,0x1d80,0x189c,0x19ca,0x1997,0x17b1,0x1c46,0x1f8e,0x18d3,0x177b, +0x1b10,0x1d84,0x1d8b,0x18d3,0x1f8e,0x1f8e,0x1f8e,0x1d93,0x19a5,0x17e3,0x1f8e,0x1d9a,0x1da2,0x1da9,0x1f8e,0x1db1, +0x1db9,0x1dc1,0x178a,0x1dc9,0x1791,0x1be3,0x177b,0x1790,0x1f8e,0x1dd1,0x1f8e,0x1dd9,0x1de1,0x1f8e,0x1f8e,0x1f8e, +0x1f8e,0x178d,0x1de9,0x18b0,0x1df1,0x17bd,0x1df5,0x1ada,0x1dfd,0x1f8e,0x1f8e,0x17e5,0x1f8e,0x17bd,0x17e4,0x1997, +0x17fb,0x1771,0x1d89,0x1e02,0x180b,0x1e0a,0x1c00,0x177b,0x1795,0x1d84,0x1a3a,0x1f8e,0x189c,0x1e11,0x1e19,0x178b, +0x1f8e,0x1e1f,0x1b55,0x1f8e,0x1f8e,0x178a,0x1b65,0x1784,0x17bc,0x1e25,0x17af,0x180b,0x1e2d,0x1e34,0x17e3,0x1e3c, +0x1e40,0x189b,0x19f2,0x1e48,0x1e50,0x189c,0x1e58,0x189b,0x17e5,0x17d1,0x1f8e,0x1e60,0x1e68,0x1e6f,0x1f8e,0x1e77, +0x1e7f,0x17e3,0x1b11,0x1e87,0x1f8e,0x1f8e,0x1f8e,0x1f8e,0x1f8e,0x1f8e,0x1f8e,0x1e8e,0x19c8,0x1e96,0x1e9e,0x1f8e, +0x1f8e,0x1ea6,0x1ca1,0x1eae,0x1eb6,0x1ebe,0x1f8e,0x1ec5,0x1ecd,0x1ed4,0x1edc,0x1d5b,0x195c,0x1ee2,0x1eea,0x17e5, +0x1afd,0x1ef1,0x1ef8,0x1eff,0x1f8e,0x194e,0x17bc,0x1f06,0x17af,0x180b,0x1f0d,0x1f8e,0x1f8e,0x1afd,0x1f8e,0x1f15, +0x1f1b,0x180b,0x1abe,0x19f2,0x1f8e,0x1f22,0x1e10,0x1f2a,0x1f32,0x1902,0x19ed,0x183f,0x1e30,0x1f8e,0x189b,0x1784, +0x1f3a,0x1f8e,0x1f42,0x1f4a,0x1f8e,0x1f8e,0x1f8e,0x1f8e,0x1f51,0x1f58,0x1f8e,0x1776,0x17b0,0x1772,0x17e4,0x1b12, +0x1f60,0x1f8e,0x1f8e,0x180b,0x1f68,0x1f6f,0x1f8e,0x17e9,0x1f77,0x17bd,0x1f7e,0x1776,0x1f8e,0x1f86,0x2534,0x291f, +0x21a0,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6, +0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6,0x21a6, +0x21a6,0x21a6,0x21a6,0x21a6,0xb66,0x2198,0xb6e,0x25d0,0x2501,0x2501,0x2501,0x2501,0x2501,0x2501,0x2501,0x2501, +0x24fc,0xb76,0x24b7,0x24af,0x24b9,0x25c8,0x25c8,0xb7e,0x2397,0x242b,0x24c1,0x24c5,0x248f,0x2626,0xb86,0xb8e, +0x23f3,0xb96,0x2460,0xb9e,0x2519,0x251c,0xba6,0x254c,0x24e5,0x24ec,0xbae,0xbb6,0x2580,0x2584,0xbbe,0xbc6, +0x24dd,0xbce,0xbd6,0x2554,0x25bc,0x25c0,0xbde,0xbe6,0xbee,0xbf6,0x2770,0xbfe,0x283e,0x283e,0x2594,0xc06, +0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031, +0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033, +0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035, +0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030, +0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032, +0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034, +0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036, +0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031, +0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033, +0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035, +0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030, +0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032, +0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034, +0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036, +0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031, +0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033, +0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035, +0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030, +0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032, +0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034, +0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036, +0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0x2036,0x2030,0x2031,0x2032,0x2033,0x2034,0x2035,0xc0e,0xc15,0xc18, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018, +0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e, +0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x170e,0x175c,0x175c,0x175c,0x175c,0x175c,0x175c,0x175c,0x175c, +0x1761,0x1769,0x2337,0x1438,0x2413,0x2413,0x143c,0x1443,0xc20,0xc28,0xc30,0x15cc,0x15d3,0x15db,0x15e3,0x15eb, +0x164c,0x164c,0x15b4,0x15bc,0x15f3,0x1643,0x1644,0x1654,0x15fb,0x1600,0x1608,0x1610,0x1618,0x1620,0x1628,0x15c4, +0xc38,0x1743,0xc40,0xc48,0x1630,0x1636,0x163b,0xc50,0xc58,0x1723,0x172b,0x1716,0x171b,0xc60,0xc68,0xc70, +0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018, +0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018,0x2018, +0x181c,0x181c,0x185c,0x189c,0x18dc,0x191c,0x195c,0x199c,0x19dc,0x1a1c,0x1a5c,0x1a9c,0x1adc,0x1b1c,0x1b5c,0x1b9c, +0x1bdc,0x1c18,0x1c58,0x1c98,0x1cd8,0x1d0c,0x1d48,0x1d88,0x1dc8,0x1e08,0x1e44,0x1e84,0x1ec4,0x1f04,0x1f44,0x1f84, +0xa80,0xac0,0xb00,0xb40,0xb80,0xbb5,0xbf5,0x16da,0xc18,0xa40,0xa40,0xa40,0xc50,0xc90,0x15b6,0x15b6, +0x15b7,0xcd0,0xd04,0xa40,0xa40,0xd13,0xd53,0xd73,0xa40,0xd99,0xdd9,0xe19,0xe59,0xe99,0xf59,0xed9, +0x125d,0x1299,0x12d9,0x12e8,0x1322,0x1349,0x12e8,0x137f,0x13a5,0x13cc,0x1403,0x12e8,0x1431,0x1470,0x12e8,0x149f, +0x14d5,0x14ef,0x12e8,0x1417,0xfe9,0x152f,0x1536,0x1029,0x1576,0x1034,0x15f7,0x15f7,0x15f7,0x106a,0x109d,0x10dd, +0x1637,0x1637,0x111d,0x1677,0x169a,0x171a,0x115d,0x109d,0x109d,0x109d,0x109d,0x109d,0x109d,0x109d,0x109d,0x109d, +0x109d,0x109d,0x109d,0x109d,0x109d,0x109d,0x109d,0x109d,0x109d,0x109d,0x175a,0x175a,0x175a,0x175a,0x175a,0x119d, 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,0xefc, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xf19, 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,0xefc, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xf19, 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,0xefc, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xf19, 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,0xefc, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xf19, 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,0xefc, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xf19, 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,0xefc, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xf19, 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,0xefc, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xf19, 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,0xefc, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xf19, 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,0xefc, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xf19, 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,0xefc, -0xf7c,0xf8c,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,0xefc, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11a4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11a4, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0xc6a,0xc71,0xc79,0x5e9,0x234c,0x234c,0x234c,0xc81,0xc89,0xc8c,0x239c,0x238c,0xc94,0xc9c,0xca0,0xca4, -0x5e9,0x5e9,0x5e9,0x5e9,0xcac,0x24d6,0xcb4,0xcbc,0x221b,0xcc4,0xcca,0xcce,0xcd6,0x23e0,0xcde,0x5e9, -0x2213,0x2206,0x220b,0x2354,0xce6,0xcee,0xcf2,0xcf8,0x2783,0xd00,0x27d3,0xd07,0xd0b,0xd13,0x2a06,0xd1b, -0x276b,0x276b,0x276b,0x276b,0x276b,0x276b,0x276b,0x276b,0x276b,0xd23,0xd2b,0xd33,0xd3b,0xd3f,0x5e9,0x5e9, -0xd47,0xd4a,0xd52,0x279b,0xd5a,0xd62,0x5e9,0xd6a,0xd72,0xd7a,0xd82,0x5e9,0x26d3,0xd8a,0xd92,0x283a, -0xd9a,0xda1,0xda9,0x25a5,0x2793,0x5e9,0x2773,0xdb1,0x2569,0xdb9,0xdc1,0xdc9,0xdd1,0xdd9,0x5e9,0x5e9, -0x2559,0x2559,0xde1,0x5e9,0x2813,0xde9,0x280b,0xdf1,0x2935,0xdf9,0x29e6,0xe01,0xe08,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0xe10,0x297b,0xe18,0xe20,0xe27,0x293d,0xe2f,0xe36,0xe3d,0xe45,0xe49,0xe50,0xe58, -0x2603,0x2605,0xe60,0xe67,0x2579,0x2571,0xe6f,0xe75,0x2707,0xe7d,0xe85,0xe89,0x26f3,0x26f7,0x26eb,0xe91, -0xe99,0x27bb,0xea1,0x5e9,0xea9,0xeb1,0x27a3,0xeb9,0xec1,0xec7,0xecf,0xed7,0xedf,0xee4,0xeec,0xef4, -0x289f,0x2897,0xefc,0xf04,0x27cb,0x27c3,0xf0c,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x27f3,0xf14,0xf1c,0x5e9, -0x27e3,0x27db,0xf24,0xf2c,0x26ff,0xf34,0xf3c,0xf43,0xf4b,0xf53,0xf5b,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x291d,0xf63,0x5e9,0x5e9,0x5e9,0x27b3,0x27ab,0xf6b,0xf73,0xf79,0xf81,0x5e9,0x5e9,0xf89,0xf8d,0xf95, -0x290d,0x28cc,0xf9d,0x2905,0x28c4,0xfa5,0x27eb,0xfad,0xfb5,0x5e9,0x5e9,0xfbd,0x5e9,0x5e9,0x29fe,0xfc5, -0xfcd,0xfd2,0xfda,0xfe1,0xfe6,0xfec,0x5e9,0x5e9,0xff4,0xff8,0x1000,0x1008,0x100e,0x1016,0x101a,0x1022, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x102a,0x1032,0x1037,0x103f,0x5e9,0x5e9,0x1046,0x2955,0x104e, -0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d, -0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x243d,0x2442,0x1056,0x5e9,0x5e9,0x5e9, -0x243d,0x243d,0x243d,0x105e,0x281b,0x281b,0x281b,0x281b,0x281b,0x281b,0x1066,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x106a,0x29a3,0x29a3,0x106e,0x2531,0x2531,0x2531,0x2531,0x2531, -0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x2533,0x2531,0x253b, -0x2531,0x2531,0x2531,0x2531,0x2531,0x2531,0x253e,0x2531,0x2531,0x2531,0x2531,0x2531,0x2545,0x1076,0x29de,0x29de, -0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, -0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x107e,0x2842,0x2842, -0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2842,0x2847,0x2842,0x2842,0x2842, -0x1086,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x29ee,0x108e, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d, -0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x260d,0x1096,0x109e,0x10a6,0x29ab,0x10aa,0x10b2,0x10b7,0x2763,0x275b, -0x10bf,0x10c7,0x10cf,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x29f6,0x10d7,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x292d,0x2925,0x10df,0x10e7,0x10ee,0x5e9,0x26e3,0x26e3, -0x10f6,0x26db,0x10fe,0x5e9,0x5e9,0x1106,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7, -0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28b4,0x2993,0x2993, -0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x2993,0x110e,0x1114,0x111c,0x5e9, -0x5e9,0x5e9,0x2a16,0x2a16,0x2a16,0x111f,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x1124,0x26c3,0x28f4,0x28f4,0x28f4,0x28f4,0x28f4,0x28f4,0x28f4,0x28f5,0x112c, -0x1131,0x1138,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x28fd,0x113c,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x277b,0x277b,0x277b,0x1144,0x1149,0x1151,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x29d3,0x29d3,0x29d3,0x29d3, -0x29d3,0x29d3,0x29d6,0x1159,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3,0x29d3, -0x29d3,0x1161,0x1168,0x1170,0x29b3,0x1178,0x117f,0x299b,0x299b,0x299b,0x1186,0x5e9,0x21a4,0x21a4,0x21a4,0x21a4, -0x21a4,0x21a4,0x21a4,0x118e,0x21a4,0x1196,0x21a5,0x219c,0x21ad,0x21b3,0x21bb,0x119e,0x2394,0x2394,0x11a6,0x5e9, -0x5e9,0x5e9,0x11ae,0x11b6,0x235c,0x235c,0x11be,0x11c6,0x5e9,0x5e9,0x5e9,0x5e9,0x21ec,0x21f3,0x11ce,0x21f6, -0x11d6,0x11de,0x11e6,0x21f0,0x11ee,0x11f6,0x11fe,0x21f5,0x21fd,0x21ec,0x21f3,0x21ef,0x21f6,0x21fe,0x21ed,0x21f4, -0x21f0,0x1205,0x21c3,0x21cb,0x21d2,0x21d9,0x21c6,0x21ce,0x21d5,0x21dc,0x120d,0x21e4,0x2823,0x2823,0x2823,0x2823, -0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x2823,0x286f,0x282b,0x286f,0x2832, -0x1215,0x121d,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x1225,0x122d,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x1235,0x123d,0x29bb,0x1245, -0x124a,0x5e9,0x5e9,0x5e9,0x295d,0x1252,0x125a,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x125e,0x1263,0x2965,0x126b,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x1273,0x1278,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x127f,0x1284,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x128c,0x1294,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x129c,0x278b,0x278b,0x278b,0x278b, -0x278b,0x278b,0x12a4,0x5e9,0x288f,0x2887,0x12ac,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x12b4, -0x2915,0x12b9,0x5e9,0x5e9,0x12c1,0x12c2,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x12ca,0x12d2,0x12da,0x12e2, -0x12ea,0x12f2,0x5e9,0x12f9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x1301,0x2726,0x1307,0x2726, -0x130f,0x1314,0x131c,0x5e9,0x284f,0x2877,0x287f,0x28d4,0x2857,0x2945,0x285f,0x28dc,0x294d,0x294d,0x13ae,0x13b6, -0x13be,0x2983,0x13c6,0x13ce,0x296d,0x296d,0x296d,0x296d,0x1324,0x296d,0x2973,0x132c,0x1363,0x1363,0x1363,0x1363, -0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363, -0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x1363,0x13d5,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9, -0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x5e9,0x1333,0x2452,0x133b,0x2454,0x2454, -0x133f,0x1347,0x134f,0x1357,0x25b5,0x2511,0x25bd,0x25c5,0x25ad,0x135f,0x1363,0x136a,0x1372,0x1376,0x137e,0x1386, -0x1363,0x1363,0x1363,0x1363,0x2634,0x263c,0x2634,0x2642,0x264a,0x2615,0x2652,0x265a,0x2634,0x2662,0x266a,0x2671, -0x2679,0x261d,0x2634,0x267e,0x2625,0x262c,0x2686,0x268c,0x272e,0x2735,0x2717,0x2693,0x269b,0x26a3,0x26ab,0x271f, -0x2634,0x26b3,0x138e,0x1396,0x25e8,0x25e8,0x25e8,0x25eb,0x2726,0x2726,0x139e,0x13a6,0x13e5,0x22b3,0x22b3,0x22b3, -0x13e6,0x13e6,0x13e6,0x13e6,0x2364,0x2364,0x2364,0x2364,0x2364,0x2364,0x2364,0x13ee,0x13e6,0x13e6,0x13e6,0x13e6, -0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6, -0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6, -0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6, -0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x22ab,0x1429,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x1431,0x2867,0x2867,0x2867, -0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, -0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, -0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, -0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x1439,0x28ec,0x28ec,0x28ec, -0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec, -0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x1441,0x29cb,0x29cb,0x29cb, -0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x29cb,0x1445, -0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223,0x2223, -0x144d,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1455, -0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b, -0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x145d,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, -0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, -0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, -0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, -0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, -0x2a0e,0x2a0e,0x2a0e,0x1465,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429,0x1429, -0x1429,0x1429,0x1429,0x1455,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, -0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, -0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, -0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, -0x2006,0x2006,0x2006,0x1ffe,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, -0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, -0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, -0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006,0x2006, -0x2006,0x2006,0x2006,0x2006,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2230,0x2234,0x222b,0x2239, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x2240,0x2245,0x222e,0x222b,0x224c,0x222b,0x223a,0x222b,0x222b,0x2252,0x222b,0x222b,0x222b,0x222b, -0x225a,0x222b,0x222b,0x225e,0x2264,0x226c,0x225e,0x226e,0x222b,0x2271,0x2276,0x222b,0x222b,0x227a,0x222b,0x2282, -0x222b,0x222b,0x2285,0x228d,0x222b,0x222b,0x2295,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2239,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2243, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x223a,0x222b,0x222b,0x222b,0x2263,0x222b,0x222b,0x222b,0x2282,0x222b, -0x222b,0x222b,0x2299,0x222b,0x222b,0x222b,0x226c,0x222b,0x2277,0x222b,0x2276,0x2243,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x2240,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x225e,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x2240,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x2245,0x222b,0x2282,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x2242,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2245,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2276,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x229f,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222c,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x2264,0x222b,0x222b,0x222b,0x222b,0x222b,0x2243,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x226c,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x22a6,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x222b, -0x222b,0x222b,0x222b,0x222b,0x222b,0x222b,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5, -0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5, -0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5, -0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5, -0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d5,0x25d8,0x26bb,0x26bb,0x26bb,0x26bb,0x26bb,0x26bb,0x2867,0x2867,0x2867, -0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, -0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, -0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867, -0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x28a7,0x28a7,0x28a7, -0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7, -0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7, -0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7, -0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28a7,0x28ac,0x28ec,0x28ec, -0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec, -0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec, -0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec, -0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x28ec,0x298b,0x298b, -0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b, -0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b, -0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b, -0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x298b,0x29c3,0x29c3, -0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, -0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, -0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3, -0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x29c3,0x1461,0x2a0e, -0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, -0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, -0x2a0e,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, -0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, -0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, -0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, -0x29de,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, -0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, -0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, -0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e,0x2a0e, -0x2a0e,0x5c8,0x5c8,0x5c8,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xf3,0xff,0xf9, -0xf9,0xfc,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x4a4,0x49e,0x483,0x46b,0x477,0x474,0x46b,0x486,0x471,0x47d,0x46b,0x495, -0x489,0x480,0x4a1,0x47a,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x48c,0x489, -0x48f,0x48f,0x48f,0x49e,0x46b,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa, -0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x471, -0x477,0x47d,0x49b,0x465,0x498,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x471, -0x492,0x46e,0x48f,0x12,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,0xf19, +0xf99,0xfa9,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,0xf19, +0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d, +0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x11dd, +0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d, +0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x121d,0x11dd, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0xc78,0xc7f,0xc87,0x607,0x2377,0x2377,0x2377,0xc8f,0xc97,0xc9a,0x23c7,0x23b7,0xca2,0xcaa,0xcae,0xcb2, +0x607,0x607,0x607,0x607,0xcba,0x2509,0xcc2,0xcca,0x2246,0xcd2,0xcd8,0xcdc,0xce4,0x240b,0xcec,0x607, +0x223e,0x2231,0x2236,0x237f,0xcf4,0xcfc,0xd00,0xd06,0x27b6,0xd0e,0x2806,0xd15,0xd19,0xd21,0x2a69,0xd29, +0x279e,0x279e,0x279e,0x279e,0x279e,0x279e,0x279e,0x279e,0x279e,0xd31,0xd39,0xd41,0xd49,0xd4d,0x607,0x607, +0xd55,0xd58,0xd60,0x27ce,0xd68,0xd70,0x607,0xd78,0xd80,0xd88,0xd90,0x607,0x2706,0xd98,0xda0,0x2875, +0xda8,0xdaf,0xdb7,0x25d8,0x27c6,0x607,0x27a6,0xdbf,0x259c,0xdc7,0xdcf,0xdd7,0xddf,0xde7,0x607,0x607, +0x258c,0x258c,0xdef,0x607,0x284e,0xdf7,0x2846,0xdff,0x2970,0xe07,0x2a49,0xe0f,0xe16,0x607,0x607,0x607, +0x607,0x607,0x607,0xe1e,0x29be,0xe26,0xe2e,0xe35,0x2978,0xe3d,0xe44,0xe4b,0xe53,0xe57,0xe5e,0xe66, +0x2636,0x2638,0xe6e,0xe75,0x25ac,0x25a4,0xe7d,0xe83,0x273a,0xe8b,0xe93,0xe97,0x2726,0x272a,0x271e,0xe9f, +0xea7,0x27ee,0xeaf,0x607,0xeb7,0xebf,0x27d6,0xec7,0xecf,0xed5,0xedd,0xee5,0xeed,0xef2,0xefa,0xf02, +0x28da,0x28d2,0xf0a,0xf12,0x27fe,0x27f6,0xf1a,0x607,0x607,0x607,0x607,0x607,0x2826,0xf22,0xf2a,0x607, +0x2816,0x280e,0xf32,0xf3a,0x2732,0xf42,0xf4a,0xf51,0xf59,0xf61,0xf69,0x607,0x607,0x607,0x607,0x607, +0x2958,0xf71,0x607,0x607,0x607,0x27e6,0x27de,0xf79,0xf81,0xf87,0xf8f,0x607,0x607,0xf97,0xf9b,0xfa3, +0x2948,0x2907,0xfab,0x2940,0x28ff,0xfb3,0x281e,0xfbb,0xfc3,0x607,0x607,0xfcb,0x607,0x607,0x2a61,0xfd3, +0xfdb,0xfe0,0xfe8,0xfef,0xff4,0xffa,0x607,0x607,0x1002,0x1006,0x100e,0x1016,0x101c,0x1024,0x1028,0x1030, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x1038,0x1040,0x1045,0x104d,0x607,0x607,0x1054,0x2990,0x105c, +0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470, +0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2470,0x2475,0x1064,0x607,0x607,0x607, +0x2470,0x2470,0x2470,0x2468,0x2856,0x2856,0x2856,0x2856,0x2856,0x2856,0x106c,0x2abd,0x2aa0,0x2ab3,0x2ab5,0x2ab5, +0x2ab5,0x2ab5,0x2aa8,0x2aab,0x1074,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x1078,0x29fe,0x29fe,0x107c,0x2564,0x2564,0x2564,0x2564,0x2564,0x2564,0x2564,0x2564,0x2564,0x2564,0x2564, +0x2564,0x2564,0x2564,0x2564,0x2564,0x2564,0x2564,0x2566,0x2564,0x256e,0x2564,0x2564,0x2564,0x2564,0x2564,0x2564, +0x2571,0x2564,0x2564,0x2564,0x2564,0x2564,0x2578,0x1084,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41, +0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41, +0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x108c,0x287d,0x287d,0x287d,0x287d,0x287d,0x287d,0x287d,0x287d, +0x287d,0x287d,0x287d,0x287d,0x287d,0x287d,0x2882,0x287d,0x287d,0x287d,0x1094,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x2a51,0x109c,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640,0x2640, +0x2640,0x10a4,0x10ac,0x10b4,0x2a06,0x10b8,0x10c0,0x10c5,0x2796,0x278e,0x10cd,0x10d5,0x10dd,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x2a59,0x10e5,0x607,0x607,0x607,0x607, +0x607,0x607,0x2968,0x2960,0x10ed,0x10f5,0x10fc,0x607,0x2716,0x2716,0x1104,0x270e,0x110c,0x607,0x607,0x1114, +0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2, +0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28ef,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x29de, +0x29de,0x29de,0x29de,0x29de,0x29de,0x29de,0x111c,0x1123,0x29d6,0x112b,0x607,0x607,0x2a79,0x2a79,0x2a79,0x1133, +0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5,0x2ac5, +0x113b,0x2ac5,0x1143,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x1148,0x26f6,0x292f,0x292f,0x292f,0x292f,0x292f,0x292f,0x292f,0x2930,0x1150,0x1155,0x115c,0x2938, +0x2938,0x2938,0x2938,0x2938,0x2938,0x2938,0x2938,0x2938,0x2938,0x2938,0x1160,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x27ae,0x27ae,0x27ae,0x1168,0x116d,0x1175,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a39, +0x117d,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x2a36,0x1185,0x118c, +0x1194,0x2a0e,0x119c,0x11a3,0x29ee,0x29ee,0x29ee,0x11aa,0x607,0x21c6,0x21c6,0x21c6,0x21c6,0x21c6,0x21c6,0x21c6, +0x11b2,0x21c6,0x21cd,0x21d0,0x21be,0x21d8,0x21de,0x21e6,0x282e,0x23bf,0x23bf,0x11ba,0x2a81,0x11c2,0x607,0x11ca, +0x11d2,0x2387,0x2387,0x11da,0x11e2,0x607,0x607,0x607,0x607,0x2217,0x221e,0x11ea,0x2221,0x11f2,0x11fa,0x1202, +0x221b,0x120a,0x1212,0x121a,0x2220,0x2228,0x2217,0x221e,0x221a,0x2221,0x2229,0x2218,0x221f,0x221b,0x1221,0x21ee, +0x21f6,0x21fd,0x2204,0x21f1,0x21f9,0x2200,0x2207,0x1229,0x220f,0x285e,0x285e,0x285e,0x285e,0x285e,0x285e,0x285e, +0x285e,0x285e,0x285e,0x285e,0x285e,0x285e,0x285e,0x285e,0x285e,0x28aa,0x2866,0x28aa,0x286d,0x1231,0x1239,0x607, +0x607,0x1241,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x29f6,0x2a1e,0x2a91,0x2a98,0x1249,0x607,0x124f,0x2a89,0x1257,0x125f,0x2a16,0x1267,0x126c,0x607,0x607, +0x607,0x2998,0x1274,0x127c,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x1280,0x1285,0x29a0, +0x128d,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x1295, +0x129a,0x607,0x607,0x607,0x607,0x607,0x607,0x12a1,0x12a6,0x607,0x607,0x607,0x607,0x607,0x607,0x12ae, +0x12b6,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x12be,0x27be,0x27be,0x27be,0x27be,0x27be,0x27be,0x12c6, +0x607,0x28ca,0x28c2,0x12ce,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x12d6,0x2950,0x12db,0x607, +0x607,0x12e3,0x12e4,0x607,0x607,0x607,0x607,0x607,0x607,0x12ec,0x12f4,0x12fc,0x1304,0x130c,0x1314,0x607, +0x131b,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x1323,0x2759,0x1329,0x2759,0x1331,0x1336,0x133e, +0x607,0x288a,0x28b2,0x28ba,0x290f,0x2892,0x2980,0x289a,0x2917,0x2988,0x2988,0x13d0,0x13d8,0x29a8,0x29c6,0x13e0, +0x13e8,0x29b0,0x29b0,0x29b0,0x29b0,0x1346,0x29b0,0x29b6,0x134e,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385, +0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385, +0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x1385,0x13ef,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607, +0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x607,0x1355,0x2485,0x135d,0x2487,0x2487,0x1361,0x1369,0x1371, +0x1379,0x25e8,0x2544,0x25f0,0x25f8,0x25e0,0x1381,0x1385,0x138c,0x1394,0x1398,0x13a0,0x13a8,0x1385,0x1385,0x1385, +0x1385,0x2667,0x266f,0x2667,0x2675,0x267d,0x2648,0x2685,0x268d,0x2667,0x2695,0x269d,0x26a4,0x26ac,0x2650,0x2667, +0x26b1,0x2658,0x265f,0x26b9,0x26bf,0x2761,0x2768,0x274a,0x26c6,0x26ce,0x26d6,0x26de,0x2752,0x2667,0x26e6,0x13b0, +0x13b8,0x261b,0x261b,0x261b,0x261e,0x2759,0x2759,0x13c0,0x13c8,0x13ff,0x22de,0x22de,0x22de,0x1400,0x1400,0x1400, +0x1400,0x238f,0x238f,0x238f,0x238f,0x238f,0x238f,0x238f,0x1408,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, +0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, +0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, +0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400, +0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x1400,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x22d6, +0x1443,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x144b,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2, +0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2, +0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2, +0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2, +0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x1453,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927, +0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927, +0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x145b,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e, +0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x2a2e,0x145f,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x224e,0x224e,0x224e, +0x224e,0x224e,0x224e,0x224e,0x224e,0x224e,0x224e,0x224e,0x224e,0x224e,0x224e,0x224e,0x224e,0x1467,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x146f,0x29ce,0x29ce,0x29ce, +0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce, +0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x1477,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26, +0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26, +0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a71,0x2a71,0x2a71, +0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71, +0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71, +0x147f,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x2acd,0x2acd,0x2acd, +0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd, +0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x146f,0x2028,0x2028,0x2028, +0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028, +0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028, +0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028, +0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2020,0x2028,0x2028,0x2028, +0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028, +0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028, +0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028, +0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2028,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x225b,0x225f,0x2256,0x2264,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x226b,0x2270,0x2259,0x2256,0x2277, +0x2256,0x2265,0x2256,0x2256,0x227d,0x2256,0x2256,0x2256,0x2256,0x2285,0x2256,0x2256,0x2289,0x228f,0x2297,0x2289, +0x2299,0x2256,0x229c,0x22a1,0x2256,0x2256,0x22a5,0x2256,0x22ad,0x2256,0x2256,0x22b0,0x22b8,0x2256,0x2256,0x22c0, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2264,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x226e,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2265, +0x2256,0x2256,0x2256,0x228e,0x2256,0x2256,0x2256,0x22ad,0x2256,0x2256,0x2256,0x22c4,0x2256,0x2256,0x2256,0x2297, +0x2256,0x22a2,0x2256,0x22a1,0x226e,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x226b,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2289,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x226b,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2270,0x2256,0x22ad,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x226d,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2270,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x22a1, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x22ca, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2257,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x228f, +0x2256,0x2256,0x2256,0x2256,0x2256,0x226e,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2297,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x22d1,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256, +0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2256,0x2608, +0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608, +0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608, +0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608, +0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x2608,0x260b, +0x26ee,0x26ee,0x26ee,0x26ee,0x26ee,0x26ee,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2, +0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2, +0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2, +0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2, +0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28a2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2, +0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2, +0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2, +0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2, +0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e2,0x28e7,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927, +0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927, +0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927, +0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927, +0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x2927,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce, +0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce, +0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce, +0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce, +0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x29ce,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26, +0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26, +0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26, +0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26, +0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x2a26,0x147b,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71, +0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71, +0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41, +0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41, +0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41, +0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41, +0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a41,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71, +0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71, +0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71, +0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71, +0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2a71,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd, +0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd, +0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd, +0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd, +0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x2acd,0x5e6,0x5e6,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0xf3,0xff,0xf9,0xf9,0xfc,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x4aa,0x4a4,0x489,0x471, +0x47d,0x47a,0x471,0x48c,0x477,0x483,0x471,0x49b,0x48f,0x486,0x4a7,0x480,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x492,0x48f,0x495,0x495,0x495,0x4a4,0x471,0x4b6,0x4b6,0x4b6, +0x4b6,0x4b6,0x4b6,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, +0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x477,0x47d,0x483,0x4a1,0x46b,0x49e,0x4b3,0x4b3,0x4b3, +0x4b3,0x4b3,0x4b3,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad, +0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x477,0x498,0x474,0x495,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,0x12,0x12,0x12,0x12,0x12,0x102,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,0x4b,0x36f,0x474,0x477,0x375,0x477,0x46b,0x366,0x357,0xa5,0x3cc,0xcc, -0x48f,0x333,0x369,0x462,0x372,0x39f,0x345,0x345,0x35d,0x84,0x366,0x3ea,0x35a,0x345,0x3cc,0xcc, -0x33f,0x33f,0x33f,0x36f,0x282,0x282,0x282,0x282,0x282,0x282,0x3e1,0x282,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x3e1,0x282,0x282,0x282,0x282,0x282,0x282,0x396,0x3e1,0x282,0x282,0x282, -0x282,0x282,0x3e1,0x3db,0x3de,0x3de,0x27c,0x27c,0x27c,0x27c,0x3db,0x27c,0x3de,0x3de,0x3de,0x27c, -0x3de,0x3de,0x27c,0x27c,0x3db,0x27c,0x3de,0x3de,0x27c,0x27c,0x27c,0x396,0x3db,0x3de,0x3de,0x27c, -0x3de,0x27c,0x3db,0x27c,0x282,0x3de,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c, -0x282,0x27c,0x282,0x27c,0x27f,0x3db,0x282,0x3de,0x26d,0x267,0x282,0x27c,0x282,0x27c,0x282,0x3de, -0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x3e1,0x3db,0x282,0x27c,0x282,0x3de, -0x26d,0x267,0x282,0x27c,0x282,0x3db,0x3d8,0x3d5,0x282,0x27c,0x282,0x27c,0x3c0,0x282,0x27c,0x282, -0x27c,0x282,0x27c,0x3d8,0x3d5,0x3e1,0x3db,0x282,0x3de,0x282,0x27c,0x282,0x3de,0x3e4,0x3e1,0x3db, -0x282,0x3de,0x26d,0x267,0x282,0x27c,0x3e1,0x3db,0x282,0x27c,0x26d,0x267,0x282,0x27c,0x282,0x27c, -0x282,0x27c,0x282,0x27c,0x282,0x27c,0x26d,0x267,0x282,0x27c,0x3e1,0x3db,0x282,0x27c,0x282,0x3de, -0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x282,0x27c,0x282, -0x27c,0x282,0x27c,0x270,0x252,0x27f,0x26a,0x264,0x26a,0x264,0x27f,0x26a,0x264,0x27f,0x27f,0x26a, -0x264,0x25e,0x27f,0x27f,0x27f,0x27f,0x279,0x26a,0x27f,0x264,0x27f,0x27f,0x27f,0x279,0x264,0x264, -0x26a,0x27f,0x264,0x26a,0x282,0x27c,0x26a,0x264,0x26a,0x264,0x26a,0x26a,0x264,0x26a,0x25e,0x25e, -0x26a,0x264,0x26a,0x282,0x27c,0x26a,0x27f,0x27f,0x279,0x26a,0x264,0x27f,0x26a,0x24c,0x25e,0x261, -0x26a,0x264,0x25e,0x24c,0x258,0x258,0x258,0x258,0x276,0x276,0x270,0x276,0x276,0x270,0x276,0x276, -0x270,0x282,0x3de,0x282,0x3de,0x282,0x3de,0x282,0x3de,0x26d,0x3c6,0x26d,0x3c6,0x26d,0x3c6,0x26d, -0x3c6,0x279,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26a,0x264,0x282,0x27c,0x282,0x27c,0x26d,0x267, -0x26d,0x267,0x282,0x27c,0x267,0x276,0x276,0x270,0x26d,0x267,0x7c8,0x7c8,0x7e0,0x7dd,0x26d,0x267, -0x26d,0x267,0x26d,0x267,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255, -0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x7e0,0x7dd,0x7e0,0x7dd, -0x7c8,0x7c5,0x7da,0x7d4,0x9ab,0xa77,0x7d7,0x7d1,0x7d7,0x7d1,0x7da,0x7d4,0x7da,0x7d4,0x7da,0x7d4, -0x7da,0x7d4,0x7da,0x7d4,0x7da,0x7d4,0x7da,0x7d4,0xa74,0xa74,0xa74,0xb8b,0xb8b,0xb8b,0xb8e,0xb8e, -0xb8b,0xb8e,0xb8e,0xb8b,0xb8b,0xb8e,0xc7b,0xc7e,0xc84,0xc7e,0xc7e,0xc7b,0xc7e,0xc7b,0xc7e,0xc7b, -0xc84,0xc81,0xc7e,0xc7b,0x252,0x3c3,0x252,0x279,0x279,0x252,0x279,0x279,0x252,0x279,0x252,0x279, -0x252,0x252,0x252,0x252,0x252,0x3c3,0x252,0x279,0x252,0x252,0x252,0x252,0x279,0x279,0x252,0x252, -0x252,0x252,0x252,0x252,0x252,0x252,0x279,0x252,0x252,0x252,0x252,0x25e,0x252,0x252,0x252,0x252, -0x25e,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x279,0x252,0x279, -0x252,0x252,0x252,0x252,0x252,0x252,0x279,0x252,0x258,0x258,0x252,0x252,0x252,0x252,0x252,0x252, -0x252,0x252,0x25e,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x7cb,0x7cb,0x7cb, -0x7cb,0x7cb,0xa74,0xa74,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x96,0x96,0x9c, -0x2e8,0x96,0x96,0x96,0x93,0x93,0x6c,0x6c,0x354,0x6c,0x96,0x3f0,0x99,0x3f0,0x3f0,0x3f0, -0x99,0x3f3,0x96,0x96,0x363,0x9f,0x6c,0x6c,0x6c,0x6c,0x6c,0x2eb,0x357,0x3ed,0x357,0x357, -0x72,0x357,0x6c,0x873,0x285,0x285,0x285,0x285,0x285,0x6c,0x6c,0x6c,0x6c,0x6c,0x777,0x777, -0x762,0x75c,0x762,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0x67b,0x67e,0x681,0x687,0x68a,0x68d,0x690,0x693,0x696,0x684,0x699,0x69c, -0x69f,0x6a5,0x6a8,0x66c,0x6a2,0x6ab,0x66c,0x6ae,0x66c,0x66c,0x672,0x66c,0x66c,0x66c,0x66c,0x678, -0x66c,0x66c,0x66c,0x66c,0x66c,0x672,0x672,0x6b1,0x6b4,0x6b7,0x678,0x678,0x678,0x66c,0x66c,0x66c, -0x66c,0x6ba,0x6b7,0x66c,0x6bd,0x6c0,0x672,0x66c,0x672,0x66c,0x672,0x66c,0x66c,0x66c,0x66c,0x66c, -0x66c,0x66c,0x66c,0x66c,0x675,0x675,0x6c3,0x675,0x675,0x6c6,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd, -0x8fd,0x8fd,0x8fd,0xa17,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xc45,0xc3f,0xc3f,0xc3f, -0xc42,0xb04,0xb0a,0xb04,0x66f,0x66f,0x900,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d,0xa1d, -0xa1d,0xa1d,0xa1d,0xa1d,0xd65,0xd62,0xd65,0xd62,0x2ee,0x30f,0xd65,0xd62,0,0,0x1bc,0xc69, -0xc69,0xc69,0x4e,0x12ab,0,0,0,0,0x1b6,0x6f,0x1dd,0x78,0x1dd,0x1dd,0x1dd,0, -0x1dd,0,0x1dd,0x1dd,0x1da,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd, -0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x3bd,0x1dd,0x1dd, -0x1da,0x1da,0x1da,0x1da,0x1da,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba, -0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x1d7,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x1da,0x1da, -0x1da,0x1da,0x1da,0xd68,0x1e0,0x1e0,0x1e3,0x1d4,0x1d4,0x1e0,0x1d1,0x7a1,0x9a8,0x9a5,0x1c2,0x79e, -0x1c2,0x79e,0x1c2,0x79e,0x1c2,0x79e,0x171,0x16e,0x171,0x16e,0x171,0x16e,0x171,0x16e,0x171,0x16e, -0x171,0x16e,0x171,0x16e,0x1e0,0x1e0,0x1d1,0x1c8,0x92d,0x92a,0x9a2,0xa53,0xa50,0xa59,0xa53,0xa50, -0xb7f,0xb7c,0xb7c,0xb7c,0x786,0x3b4,0x195,0x198,0x195,0x195,0x195,0x198,0x195,0x195,0x195,0x195, -0x198,0x786,0x198,0x195,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b4,0x3b1,0x3b1, -0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1, -0x3b1,0x3b1,0x3b1,0x3b1,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ae,0x3ab,0x3ab, -0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab, -0x780,0x3ae,0x18f,0x192,0x18f,0x18f,0x18f,0x192,0x18f,0x18f,0x18f,0x18f,0x192,0x780,0x192,0x18f, -0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177, -0x17d,0x177,0x17d,0x177,0x17d,0x177,0x180,0x17a,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177, -0x17d,0x177,0x174,0x666,0x669,0x657,0x657,0xec1,0x8b2,0x8b2,0x99c,0x999,0x783,0x77d,0x783,0x77d, -0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x17d,0x177,0x195,0x18f, -0x195,0x18f,0x195,0x18f,0x195,0x18f,0x17d,0x177,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f, -0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x17d,0x177,0x195,0x18f,0x195,0x18f,0x195,0x18f, -0x195,0x18c,0x186,0x189,0x183,0x99c,0x999,0x189,0x183,0x99c,0x999,0x189,0x183,0x99c,0x999,0xc66, -0x198,0x192,0x198,0x192,0x195,0x18f,0x198,0x192,0x195,0x18f,0x18c,0x186,0x198,0x192,0x198,0x192, -0x195,0x18f,0x198,0x192,0x198,0x192,0x198,0x192,0x195,0x18f,0x18c,0x186,0x786,0x780,0x198,0x192, -0x198,0x192,0x198,0x192,0x198,0x192,0xb5b,0xb58,0x198,0x192,0xc63,0xc60,0xc63,0xc60,0xc63,0xc60, -0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993,0x996,0x993, -0xc63,0xc60,0xc63,0xc60,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50, -0xd56,0xd50,0xd56,0xd50,0xee8,0xee5,0x10c2,0x10bf,0x129f,0x129c,0x129f,0x129c,0x129f,0x129c,0x129f,0x129c, -0,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, -0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0,0,0x156,0x144,0x144, -0x144,0x14a,0x144,0x147,0x166b,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, +0,0,0,0,0,0,0,0,0,0,0,0,0x12,0x12,0x12,0x12, +0x12,0x102,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,0x4b,0x375,0x47a,0x47d, +0x37b,0x47d,0x471,0x36c,0x35d,0xa5,0x3d2,0xcc,0x495,0x339,0x36f,0x468,0x378,0x3a5,0x34b,0x34b, +0x363,0x84,0x36c,0x3f0,0x360,0x34b,0x3d2,0xcc,0x345,0x345,0x345,0x375,0x285,0x285,0x285,0x285, +0x285,0x285,0x3e7,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0x3e7,0x285,0x285,0x285, +0x285,0x285,0x285,0x39c,0x3e7,0x285,0x285,0x285,0x285,0x285,0x3e7,0x3e1,0x3e4,0x3e4,0x27f,0x27f, +0x27f,0x27f,0x3e1,0x27f,0x3e4,0x3e4,0x3e4,0x27f,0x3e4,0x3e4,0x27f,0x27f,0x3e1,0x27f,0x3e4,0x3e4, +0x27f,0x27f,0x27f,0x39c,0x3e1,0x3e4,0x3e4,0x27f,0x3e4,0x27f,0x3e1,0x27f,0x285,0x3e4,0x285,0x27f, +0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x282,0x3e1,0x285,0x3e4, +0x26d,0x267,0x285,0x27f,0x285,0x27f,0x285,0x3e4,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f, +0x285,0x27f,0x3e7,0x3e1,0x285,0x27f,0x285,0x3e4,0x26d,0x267,0x285,0x27f,0x285,0x3e1,0x3de,0x3db, +0x285,0x27f,0x285,0x27f,0x3c6,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x3de,0x3db,0x3e7,0x3e1,0x285, +0x3e4,0x285,0x27f,0x285,0x3e4,0x3ea,0x3e7,0x3e1,0x285,0x3e4,0x26d,0x267,0x285,0x27f,0x3e7,0x3e1, +0x285,0x27f,0x26d,0x267,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x26d,0x267, +0x285,0x27f,0x3e7,0x3e1,0x285,0x27f,0x285,0x3e4,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f, +0x285,0x27f,0x285,0x27f,0x285,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x273,0x252,0x282,0x26a,0x264, +0x26a,0x264,0x282,0x26a,0x264,0x282,0x282,0x26a,0x264,0x25e,0x282,0x282,0x282,0x282,0x27c,0x26a, +0x282,0x264,0x282,0x282,0x282,0x27c,0x264,0x264,0x26a,0x282,0x264,0x26a,0x285,0x27f,0x26a,0x264, +0x26a,0x264,0x26a,0x26a,0x264,0x26a,0x25e,0x25e,0x26a,0x264,0x26a,0x285,0x27f,0x26a,0x282,0x282, +0x27c,0x26a,0x264,0x282,0x26a,0x24c,0x25e,0x261,0x26a,0x264,0x25e,0x24c,0x258,0x258,0x258,0x258, +0x279,0x279,0x273,0x279,0x279,0x273,0x279,0x279,0x273,0x285,0x3e4,0x285,0x3e4,0x285,0x3e4,0x285, +0x3e4,0x26d,0x3cc,0x26d,0x3cc,0x26d,0x3cc,0x26d,0x3cc,0x27c,0x26d,0x267,0x26d,0x267,0x26d,0x267, +0x26a,0x264,0x285,0x27f,0x285,0x27f,0x26d,0x267,0x26d,0x267,0x285,0x27f,0x267,0x279,0x279,0x273, +0x26d,0x267,0x7d1,0x7d1,0x7e9,0x7e6,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x25b,0x255,0x25b,0x255, +0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x25b,0x255, +0x25b,0x255,0x25b,0x255,0x7e9,0x7e6,0x7e9,0x7e6,0x7d1,0x7ce,0x7e3,0x7dd,0x9b4,0xa80,0x7e0,0x7da, +0x7e0,0x7da,0x7e3,0x7dd,0x7e3,0x7dd,0x7e3,0x7dd,0x7e3,0x7dd,0x7e3,0x7dd,0x7e3,0x7dd,0x7e3,0x7dd, +0xa7d,0xa7d,0xa7d,0xb97,0xb97,0xb97,0xb9a,0xb9a,0xb97,0xb9a,0xb9a,0xb97,0xb97,0xb9a,0xc87,0xc8a, +0xc90,0xc8a,0xc8a,0xc87,0xc8a,0xc87,0xc8a,0xc87,0xc90,0xc8d,0xc8a,0xc87,0x252,0x3c9,0x252,0x27c, +0x27c,0x252,0x27c,0x27c,0x252,0x27c,0x252,0x27c,0x252,0x252,0x252,0x252,0x252,0x3c9,0x252,0x27c, +0x252,0x252,0x252,0x252,0x27c,0x27c,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x27c,0x252, +0x252,0x252,0x252,0x25e,0x252,0x252,0x252,0x252,0x25e,0x252,0x252,0x252,0x252,0x252,0x252,0x252, +0x252,0x252,0x252,0x252,0x252,0x27c,0x252,0x27c,0x270,0x252,0x252,0x252,0x252,0x252,0x27c,0x252, +0x258,0x258,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x25e,0x252,0x252,0x252,0x252,0x252, +0x252,0x252,0x252,0x252,0x252,0x7d4,0x7d4,0x7d4,0x7d4,0x7d4,0xa7d,0xa7d,0x288,0x288,0x288,0x288, +0x288,0x288,0x288,0x288,0x288,0x96,0x96,0x9c,0x2eb,0x96,0x96,0x96,0x93,0x93,0x6c,0x6c, +0x35a,0x6c,0x96,0x3f6,0x99,0x3f6,0x3f6,0x3f6,0x99,0x3f9,0x96,0x96,0x369,0x9f,0x6c,0x6c, +0x6c,0x6c,0x6c,0x2ee,0x35d,0x3f3,0x35d,0x35d,0x72,0x35d,0x6c,0x87c,0x288,0x288,0x288,0x288, +0x288,0x6c,0x6c,0x6c,0x6c,0x6c,0x780,0x780,0x76b,0x765,0x76b,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c, +0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0x684,0x687,0x68a,0x690, +0x693,0x696,0x699,0x69c,0x69f,0x68d,0x6a2,0x6a5,0x6a8,0x6ae,0x6b1,0x675,0x6ab,0x6b4,0x675,0x6b7, +0x675,0x675,0x67b,0x675,0x675,0x675,0x675,0x681,0x675,0x675,0x675,0x675,0x675,0x67b,0x67b,0x6ba, +0x6bd,0x6c0,0x681,0x681,0x681,0x675,0x675,0x675,0x675,0x6c3,0x6c0,0x675,0x6c6,0x6c9,0x67b,0x675, +0x67b,0x675,0x67b,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x675,0x67e,0x67e,0x6cc,0x67e, +0x67e,0x6cf,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0xa20,0xb0d,0xb0d,0xb0d,0xb0d, +0xb0d,0xb0d,0xb0d,0xb0d,0xc51,0xc4b,0xc4b,0xc4b,0xc4e,0xb10,0xb16,0xb10,0x678,0x678,0x909,0xa26, +0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xa26,0xd71,0xd6e,0xd71,0xd6e, +0x2f1,0x312,0xd71,0xd6e,0,0,0x1bc,0xc75,0xc75,0xc75,0x4e,0x12c3,0,0,0,0, +0x1b6,0x6f,0x1dd,0x78,0x1dd,0x1dd,0x1dd,0,0x1dd,0,0x1dd,0x1dd,0x1da,0x3c3,0x3c3,0x3c3, +0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0,0x3c3, +0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x3c3,0x1dd,0x1dd,0x1da,0x1da,0x1da,0x1da,0x1da,0x3c0,0x3c0,0x3c0, +0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x1d7,0x3c0, +0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x3c0,0x1da,0x1da,0x1da,0x1da,0x1da,0xd74,0x1e0,0x1e0,0x1e3,0x1d4, +0x1d4,0x1e0,0x1d1,0x7aa,0x9b1,0x9ae,0x1c2,0x7a7,0x1c2,0x7a7,0x1c2,0x7a7,0x1c2,0x7a7,0x171,0x16e, +0x171,0x16e,0x171,0x16e,0x171,0x16e,0x171,0x16e,0x171,0x16e,0x171,0x16e,0x1e0,0x1e0,0x1d1,0x1c8, +0x936,0x933,0x9ab,0xa5c,0xa59,0xa62,0xa5c,0xa59,0xb8b,0xb88,0xb88,0xb88,0x78f,0x3ba,0x195,0x198, +0x195,0x195,0x195,0x198,0x195,0x195,0x195,0x195,0x198,0x78f,0x198,0x195,0x3b7,0x3b7,0x3b7,0x3b7, +0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3ba,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7, +0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b1,0x3b1,0x3b1,0x3b1, +0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b4,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1, +0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x3b1,0x789,0x3b4,0x18f,0x192,0x18f,0x18f,0x18f,0x192, +0x18f,0x18f,0x18f,0x18f,0x192,0x789,0x192,0x18f,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177, +0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x180,0x17a, +0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x17d,0x177,0x174,0x66f,0x672,0x660,0x660,0xed3, +0x8bb,0x8bb,0x9a5,0x9a2,0x78c,0x786,0x78c,0x786,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f, +0x195,0x18f,0x195,0x18f,0x17d,0x177,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x17d,0x177, +0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18f, +0x17d,0x177,0x195,0x18f,0x195,0x18f,0x195,0x18f,0x195,0x18c,0x186,0x189,0x183,0x9a5,0x9a2,0x189, +0x183,0x9a5,0x9a2,0x189,0x183,0x9a5,0x9a2,0xc72,0x198,0x192,0x198,0x192,0x195,0x18f,0x198,0x192, +0x195,0x18f,0x18c,0x186,0x198,0x192,0x198,0x192,0x195,0x18f,0x198,0x192,0x198,0x192,0x198,0x192, +0x195,0x18f,0x18c,0x186,0x78f,0x789,0x198,0x192,0x198,0x192,0x198,0x192,0x198,0x192,0xb67,0xb64, +0x198,0x192,0xc6f,0xc6c,0xc6f,0xc6c,0xc6f,0xc6c,0x99f,0x99c,0x99f,0x99c,0x99f,0x99c,0x99f,0x99c, +0x99f,0x99c,0x99f,0x99c,0x99f,0x99c,0x99f,0x99c,0xc6f,0xc6c,0xc6f,0xc6c,0xd62,0xd5c,0xd62,0xd5c, +0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xefa,0xef7,0x10d4,0x10d1, +0x12b7,0x12b4,0x12b7,0x12b4,0x12b7,0x12b4,0x12b7,0x12b4,0,0x153,0x153,0x153,0x153,0x153,0x153,0x153, +0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, +0x153,0x153,0x153,0,0x1ad9,0x156,0x144,0x144,0x144,0x14a,0x144,0x147,0x1683,0x150,0x150,0x150, 0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, -0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x14d,0x166b,0x312,0x774,0,0,0x1296,0x1296,0x1194, -0,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f, -0x72f,0x72f,0xc24,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f,0x72f, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0xce4,0x612,0x612,0x612,0x213,0x612, -0x20a,0x612,0x612,0x216,0x732,0xc27,0xb85,0xc2a,0,0,0,0,0,0,0,0, +0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x14d, +0x1683,0x315,0x77d,0x1ad9,0x1ad9,0x12ae,0x12ae,0x11a6,0,0x738,0x738,0x738,0x738,0x738,0x738,0x738, +0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0xc33,0x738,0x738,0x738,0x738,0x738, +0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b, +0x61b,0x61b,0xcf0,0x61b,0x61b,0x61b,0x213,0x61e,0x20a,0x61b,0x61b,0x216,0x73b,0xc36,0xb91,0xc36, +0x1b4b,0x1b4b,0,0,0,0,0,0,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, 0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0,0,0,0,0x1677, -0x21c,0x21c,0x21c,0x210,0x20d,0,0,0,0,0,0,0,0,0,0,0, -0xa3e,0xa3e,0xa3e,0xa3e,0x1191,0x128d,0xd3e,0xd3e,0xd3e,0xd3b,0xd3b,0xb34,0x2f4,0xa38,0xa35,0xa35, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xe79,0xe79,0xe79,0xe79,0xe79,0x2f1,0x1260,0x1863,0xb3d,0x2f7, -0x10bc,0x138,0x13b,0x13b,0x13b,0x13b,0x13b,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0xd41,0xd41,0xd47,0xd41,0xd41, -0x2fa,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x65d,0x65d,0x65d,0x65d,0x65d, -0x65d,0x65d,0x65d,0x8f7,0x8fa,0x8fa,0xae6,0xaec,0xae9,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0xc1b,0x114f, -0x315,0x315,0x315,0x315,0x315,0x315,0x315,0x315,0x315,0x315,0x117,0x114,0x111,0x10e,0x98d,0x98d, -0x65a,0x123,0x138,0x141,0x138,0x129,0x129,0x129,0x129,0x138,0x138,0x138,0x138,0x138,0x138,0x138, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x120,0x138,0x138,0x138, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x126,0x126,0x126,0x126,0x138,0x138,0x126,0x138,0x126, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x120,0x138,0x138,0x138,0x138,0x138,0x126,0x138, -0x126,0x138,0x138,0x138,0x76e,0x76e,0x138,0x138,0x138,0x138,0x138,0x76e,0x13b,0x138,0x13b,0x138, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x771,0x138,0x138,0x138,0x13b, -0x318,0x138,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x5df,0x108,0x10e,0x5e2,0x5e2,0x5df,0x5df,0x5df, -0x5df,0x13e,0x13e,0x5df,0x5df,0x10e,0x5e2,0x5e2,0x5e2,0x5df,0xa3b,0xa3b,0x11a,0x11a,0x11a,0x11a, -0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x76e,0x76e,0x76e,0x76b,0x76b,0xa3b,0x840,0x840,0x840,0x83a, -0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x83a,0x837,0x83a,0x837,0,0x843,0x83d,0x8e2,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, -0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0xa83,0xa83,0xa83,0x8e8,0x8e8,0x8e8,0x8e8, -0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e5,0x8e5,0x8e5,0x8e5, -0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0,0,0xa83,0xa83,0xa83,0xb37,0xb3a,0xb3a,0xb37, -0xb37,0xb37,0xb3a,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb3a,0xb37,0xb3a,0xb3a, -0xb37,0xb37,0xb3a,0xb3a,0xb3a,0xb37,0xb3a,0xb37,0xb37,0xb37,0xd47,0xd47,0xd47,0xd47,0xd44,0xd44, -0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd44,0xd41,0xd41,0x846,0x846,0x846,0x846, +0x228,0x228,0x228,0,0,0,0,0x168f,0x21c,0x21c,0x21c,0x210,0x20d,0,0,0, +0,0,0,0,0,0,0,0,0xa47,0xa47,0xa47,0xa47,0x11a3,0x12a5,0xd4a,0xd4a, +0xd4a,0xd47,0xd47,0xb40,0x2f7,0xa41,0xa3e,0xa3e,0xaf2,0xaf2,0xaf2,0xaf2,0xaf2,0xaef,0xe88,0xe8b, +0xe8b,0xe8b,0xe8b,0x2f4,0x1278,0x187b,0xb49,0x2fa,0x10ce,0x138,0x13b,0x13b,0x13b,0x13b,0x13b,0x138, +0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x138,0x138,0x138,0xd4d,0xd4d,0xd53,0xd4d,0xd4d,0x2fd,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x138,0x138,0x138,0x666,0x666,0x666,0x666,0x666,0x666,0x666,0x666,0x900,0x903,0x903,0xaf8,0xaf8, +0xaf5,0xc27,0xc27,0xc27,0xc2a,0xc27,0xc27,0x1161,0x318,0x318,0x318,0x318,0x318,0x318,0x318,0x318, +0x318,0x318,0x117,0x114,0x111,0x10e,0x996,0x996,0x663,0x123,0x138,0x141,0x138,0x129,0x129,0x129, +0x129,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x138,0x138,0x138,0x138,0x120,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x126, +0x126,0x126,0x126,0x138,0x138,0x126,0x138,0x126,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x120,0x138,0x138,0x138,0x138,0x138,0x126,0x138,0x126,0x138,0x138,0x138,0x777,0x777,0x138,0x138, +0x138,0x138,0x138,0x777,0x13b,0x138,0x13b,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x138,0x138,0x138,0x77a,0x138,0x138,0x138,0x13b,0x31b,0x138,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5,0x5e5, +0x5e5,0x108,0x10e,0x5e8,0x5e8,0x5e5,0x5eb,0x5e5,0x5e5,0x13e,0x13e,0x5e5,0x5e5,0x10e,0x5e8,0x5e8, +0x5e8,0x5e5,0xa44,0xa44,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x777,0x777, +0x777,0x774,0x774,0xa44,0x849,0x849,0x849,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x843,0x840, +0x843,0x840,0,0x84c,0x846,0x8eb,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,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0x846, -0x846,0x846,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x9b1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xca8,0xca8,0xca8,0xca8, -0xca8,0xca8,0xca8,0xca8,0xca8,0xca8,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, -0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, -0xcab,0xcab,0xcab,0xcab,0xcae,0xcae,0xcae,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6, -0xcb1,0xcb1,0xca2,0xca2,0xca5,0xcb7,0xcb4,0,0,0x1704,0x168c,0x168c,0x106b,0x106b,0x106b,0x106b, -0xf93,0x106b,0x106b,0x106b,0xf93,0x106b,0x106b,0x106b,0x106b,0x1068,0,0,0xf90,0xf90,0xf90,0xf90, -0xf90,0xf90,0xf8d,0xf96,0xf90,0xf96,0xf90,0xf90,0xf90,0xf96,0xf96,0,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,0x116d,0x116d,0x116d,0,0,0x110a,0,0x15d8,0x15d8,0x15d8,0x15d8, -0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0,0,0,0,0,0x185a,0x185a,0x185a,0x185a, -0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x185a,0x1854,0x185d,0x185d,0x185d, -0x185d,0x185d,0x1857,0x1a4f,0x1866,0x1866,0,0,0,0,0,0x1a04,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x18db,0x1299,0x5eb,0x15f,0x15f,0,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b, -0x168,0,0,0x16b,0x16b,0,0,0x16b,0x16b,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af, -0x5af,0x5af,0x5af,0x5af,0x5af,0,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0x5af,0,0x5af,0, -0,0,0x5af,0x5af,0x5af,0x5af,0,0,0x5ee,0xa41,0x5eb,0x15f,0x15f,0x5eb,0x5eb,0x5eb, -0x5eb,0,0,0x15f,0x15f,0,0,0x162,0x162,0x6d5,0xb40,0,0,0,0,0, -0,0,0,0x5e8,0,0,0,0,0x5ac,0x5ac,0,0x5ac,0x165,0x165,0x5e5,0x5e5, -0,0,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x5af,0x5af,0x15c,0x15c, -0x159,0x159,0x159,0x159,0x159,0x15c,0x159,0xedc,0x15d2,0x15cf,0x16fb,0,0,0xaf2,0x606,0xa6b, -0,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0,0,0,0x1fe,0x1fe,0,0,0x1fe, -0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0x1fe,0x1fe, -0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0x1fe,0x1fb,0,0x1fe,0x1fb,0,0x1fe,0x1fe,0,0, -0x609,0,0x1f2,0x1f2,0x1f2,0x606,0x606,0,0,0,0,0x606,0x606,0,0,0x606, -0x606,0x60f,0,0,0,0xe85,0,0,0,0,0,0,0,0x1fb,0x1fb,0x1fb, -0x1fe,0,0x1fb,0,0,0,0,0,0,0,0x321,0x321,0x321,0x321,0x321,0x321, -0x321,0x321,0x321,0x321,0x606,0x60c,0x1f8,0x1f8,0x1f5,0xe85,0x1674,0,0,0,0,0, -0,0,0,0,0,0x5fd,0x600,0x1e6,0,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef, -0xa68,0x1ef,0,0x1ef,0x1ef,0x1ef,0,0x1ef,0x1ef,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be, -0x5be,0x5be,0x5be,0x5be,0x5be,0,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0,0x5be,0x5be, -0,0x5be,0x5be,0x5be,0x5be,0x5be,0,0,0x603,0x1e9,0x1e6,0x1e6,0x1e6,0x600,0x600,0x600, -0x600,0x600,0,0x600,0x600,0x1e6,0,0x1e6,0x1e6,0x6db,0,0,0x1ec,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1e9,0xa65,0xaef,0xaef, -0,0,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x11a6,0xa62,0,0, -0,0,0,0,0,0x14e5,0x1629,0x162f,0x1629,0x162c,0x162c,0x162c,0,0x630,0x2a3,0x2a3, -0,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2ac,0,0,0x2af,0x2af,0,0,0x2af, -0x2af,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0,0x5c7,0x5c7,0,0xae0,0x5c7,0x5c7,0x5c7,0x5c7,0,0, -0x633,0x2a9,0x630,0x630,0x2a3,0x630,0x630,0x630,0xe97,0,0,0x2a3,0x2a6,0,0,0x2a6, -0x2a6,0x6e1,0,0,0,0,0,0,0,0x1821,0x630,0x62d,0,0,0,0, -0x5c4,0x5c4,0,0x5c7,0x2a9,0x2a9,0xe97,0xe97,0,0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, -0x2a0,0x2a0,0x2a0,0x2a0,0x29d,0xae3,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0,0,0,0, -0,0,0,0,0,0,0x636,0x2b8,0,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0, -0,0,0x2b8,0x2b8,0x2b8,0,0x2b8,0x2b8,0x2bb,0x2b8,0,0,0,0x2b8,0x2b8,0, -0x2b8,0,0x2b8,0x2b8,0,0,0,0x2b8,0x2b8,0,0,0,0x2b8,0x2b8,0x2b8,0, -0,0,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0x2b8,0xb97,0x2b8,0x2b8,0x2b8,0,0, -0,0,0x63c,0x2b2,0x63c,0x2b2,0x2b2,0,0,0,0x2b2,0x2b2,0x2b2,0,0x2b5,0x2b5, -0x2b5,0x63f,0,0,0xdb3,0,0,0,0,0,0,0x639,0,0,0,0, -0,0,0,0,0,0,0xbe2,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a, -0x327,0x327,0x327,0xabf,0xa86,0xa86,0xa86,0xa86,0xa86,0xa89,0xa86,0,0,0,0,0, -0x13fe,0x2c1,0x2c4,0x2c4,0x1701,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2cd,0x2ca,0,0x2cd,0x2cd, -0x2cd,0,0x2cd,0x2cd,0x2cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd, -0x5cd,0,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5ca,0x5cd,0x5cd,0x13dd,0x5cd,0x5cd,0x5cd, -0x5cd,0x5cd,0,0,0x18e1,0xdb9,0x645,0x645,0x645,0x2c4,0x2c4,0x2c4,0x2c4,0,0x645,0x645, -0x648,0,0x645,0x645,0x645,0x6e4,0,0,0,0,0,0,0,0x642,0x642,0, -0xe5e,0xe5e,0x14e8,0,0x1a61,0x1887,0,0,0x2c7,0x2c7,0xe9a,0xe9a,0,0,0x2be,0x2be, -0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0x2be,0,0,0,0,0,0,0,0x174c, -0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0xdb6,0x1527,0x13f2,0x22e,0x22e,0x167a,0x234,0x234,0x234, -0x234,0x234,0x234,0x234,0x231,0,0x234,0x234,0x234,0,0x234,0x234,0x234,0x234,0x234,0x234, -0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0,0x234,0x234,0x234,0x234,0x234,0x234, -0x234,0x231,0x234,0x234,0,0x234,0x234,0x234,0x234,0x234,0,0,0xaf5,0xa6e,0x22e,0x61b, -0x61e,0x22e,0x61b,0x22e,0x22b,0,0x61b,0x61e,0x61e,0,0x61e,0x61e,0x61b,0x621,0,0, -0,0,0,0,0,0x618,0x618,0,0,0,0,0,0x1a52,0x186c,0x231,0, -0x231,0x231,0xce7,0xce7,0,0,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d, -0,0xc6c,0xc6c,0x1908,0,0,0,0,0,0,0,0,0,0,0,0, -0x1632,0x13f5,0x28e,0x28e,0x17d9,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x29a,0x297,0,0x29a,0x29a, -0x29a,0,0x29a,0x29a,0x29a,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x28e,0x62a,0x62a,0x62a,0xe88,0,0x28e,0x28e,0x28e,0,0x291,0x291,0x28b,0x6de,0x10dd,0x152d, -0,0,0,0,0x1530,0x1530,0x1530,0x62a,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x1485, -0x294,0x294,0xe88,0xe88,0,0,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288,0x288, -0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0xd8f,0x152d,0x152d,0x152d,0xd92,0xd98,0xd98,0xd98,0xd98,0xd98,0xd98, -0,0x1824,0x825,0x825,0,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x82e,0x831, -0x831,0x834,0x834,0x834,0x834,0x834,0x834,0,0,0,0x834,0x834,0x834,0x834,0x82b,0x834, -0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834, -0x834,0x834,0,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0x834,0,0x834,0,0, -0x834,0x834,0x834,0x834,0x834,0x834,0x834,0,0,0,0x8df,0,0,0,0,0x8dc, -0x825,0x825,0x8dc,0x8dc,0x8dc,0,0x8dc,0,0x825,0x825,0x828,0x825,0x828,0x828,0x828,0x8d9, -0,0,0,0,0,0,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc, -0,0,0x825,0x822,0x81f,0,0,0,0,0,0,0,0,0,0,0, -0,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc, -0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc, -0x2dc,0x64b,0x2dc,0x2d9,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x654,0,0,0,0,0x2a, -0x2e2,0x2e2,0x2e2,0x2e2,0x2e2,0x2dc,0x2df,0x651,0x651,0x651,0x651,0x651,0x651,0x64b,0x64e,0x2d0, -0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d3,0x2d3,0,0,0,0, -0,0x243,0x243,0,0x243,0,0x1731,0x243,0x243,0x1731,0x243,0,0x1731,0x243,0x1731,0x1731, -0x1731,0x1731,0x1731,0x1731,0x243,0x243,0x243,0x243,0x1731,0x243,0x243,0x243,0x243,0x243,0x243,0x243, -0x1731,0x243,0x243,0x243,0,0x243,0,0x243,0x1731,0x1731,0x243,0x243,0x1731,0x243,0x243,0x23d, -0x243,0x624,0x243,0x23a,0x624,0x624,0x624,0x624,0x624,0x624,0x17a6,0x624,0x624,0x243,0,0, -0x249,0x249,0x249,0x249,0x249,0,0x246,0,0x627,0x627,0x627,0x627,0x627,0x624,0x194d,0, -0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0,0,0x240,0x240,0x11a9,0x11a9, -0x71d,0x71d,0x71d,0x71a,0x71d,0x71d,0x71d,0x71d,0,0x71d,0x71d,0x71d,0x71d,0x71a,0x71d,0x71d, -0x71d,0x71d,0x71a,0x71d,0x71d,0x71d,0x71d,0x71a,0x71d,0x71d,0x71d,0x71d,0x71a,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71a,0x84f,0xdc5,0xdc5,0,0,0, -0,0x738,0x738,0x735,0x738,0x735,0x735,0x74a,0x735,0x74a,0x738,0x738,0x738,0x738,0x738,0x70e, -0x738,0x735,0x744,0x744,0x747,0x6f0,0x73b,0x73b,0x714,0x714,0x714,0x714,0x10e6,0x1158,0x1158,0x1158, -0x738,0x738,0x738,0x735,0x738,0x738,0x8f1,0x738,0,0x738,0x738,0x738,0x738,0x735,0x738,0x738, -0x738,0x738,0x735,0x738,0x738,0x738,0x738,0x735,0x738,0x738,0x738,0x738,0x735,0x738,0x8ee,0x8ee, -0x8ee,0x738,0x738,0x738,0x738,0x738,0x738,0x738,0x8f1,0x735,0x8f1,0x8f1,0x8f1,0,0x84c,0x84c, -0x849,0x849,0x849,0x849,0x849,0x849,0x8f4,0x849,0x849,0x849,0x849,0x849,0x849,0,0xdbc,0x849, -0xb9a,0xb9a,0xdbf,0xdc2,0xdbc,0xec7,0xec7,0xec7,0xec7,0x10e3,0x10e3,0,0,0,0,0, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0,0x11a3,0,0,0,0,0,0x11a3,0,0, -0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb67,0x798,0,0x798,0x798,0x798,0x798,0,0, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0,0x798,0,0x798,0x798,0x798,0x798,0,0, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb64,0x798,0,0x798,0x798,0x798,0x798,0,0, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798, -0x798,0x798,0x798,0xb64,0x798,0,0x798,0x798,0x798,0x798,0,0,0x798,0x798,0x798,0x798, -0x798,0x798,0x798,0,0x798,0,0x798,0x798,0x798,0x798,0,0,0x798,0x798,0x798,0x798, -0x798,0x798,0x798,0xb67,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0,0x798,0x798,0x798,0x798, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb64,0x798,0,0x798,0x798, -0x798,0x798,0,0,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb64,0x798,0x798,0x798,0x798, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x795,0, -0,0x1155,0x1155,0xc1e,0xb61,0x78f,0x79b,0x78c,0x78c,0x78c,0x78c,0x79b,0x79b,0x792,0x792,0x792, -0x792,0x792,0x792,0x792,0x792,0x792,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789,0x789, -0x789,0,0,0,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, -0xb64,0xb64,0xb64,0xb64,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0xb61,0,0, -0,0,0,0,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a, -0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x1473,0,0,0x1470,0x1470,0x1470,0x1470, -0x1470,0x1470,0,0,0x816,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, -0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x813, -0x810,0,0,0,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x861, -0x861,0x861,0x81c,0x81c,0x81c,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0,0,0, -0,0,0,0,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4,0x9b4, -0x9b4,0x188d,0x9b4,0x9b4,0x9b4,0x9b4,0xa05,0xa05,0xa08,0x18e4,0,0,0,0,0,0, -0,0,0,0x188d,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7, -0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0x9b7,0xa0b,0xa0b,0xa0e,0x9c0,0x9c0,0,0,0,0,0, -0,0,0,0,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba, -0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0x9ba,0xa11,0xa11,0,0,0,0,0,0,0,0, -0,0,0,0,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, -0x9bd,0,0x9bd,0x9bd,0x9bd,0,0xa14,0xa14,0,0,0,0,0,0,0,0, -0,0,0,0,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x8b5,0x7b9,0x7b9,0x8c1,0x8c1,0x8c1, -0x8c1,0x8c1,0x8bb,0x8bb,0x8c1,0x8be,0x903,0x8b8,0x7c2,0x7c2,0x7b3,0x7bf,0x7ad,0x7a7,0x7b0,0x7aa, -0x7bc,0xaf8,0,0,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0,0, -0,0,0,0,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71,0,0, -0,0,0,0,0x7e6,0x7e6,0x867,0x86a,0x7ec,0x864,0x7e9,0x7e6,0x7ef,0x7fe,0x7f2,0x8cd, -0x8cd,0x8cd,0x7e3,0x18de,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0x7f5,0,0, -0,0,0,0,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x1686,0,0,0, -0,0,0,0,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x8c7,0xd9b,0, -0,0,0,0,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12, -0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0,0,0,0,0,0, -0,0,0,0,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, -0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, -0xa98,0x12cf,0x12cf,0,0xafb,0xafb,0xafb,0xa95,0xa95,0xa95,0xa95,0xafb,0xafb,0xa95,0xa95,0xa95, -0,0,0,0,0xa95,0xa95,0xafb,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xafe,0xafe,0xafe, -0,0,0,0,0xa8f,0,0,0,0xa9b,0xa9b,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92, -0xa92,0xa92,0xa92,0xa92,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa, -0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0,0,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0,0,0, -0,0,0,0,0,0,0,0,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4, -0xbc4,0xbc4,0xf18,0xf18,0,0,0,0,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc7,0xbc7,0xbc7, -0xbc4,0xbc4,0xbc7,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0,0, -0,0,0,0,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xbc1,0xf15,0, -0,0,0xbbe,0xbbe,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3, -0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xc2d,0xc2d,0xba0,0xba0,0xc2d, -0,0,0xb9d,0xb9d,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, -0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0xf45,0x1050,0xf45,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0,0x109e,0xf42,0x1050,0xf42,0xf42,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0xf45,0xf45,0xf45,0xf45,0xf45,0xf45,0x1050,0x1050,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056, -0x1056,0,0,0x1053,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0,0, -0,0,0,0,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0,0, -0,0,0,0,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf48,0xf4b,0xf4b,0xf4b,0xf4b, -0xf3c,0xf3c,0,0,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6,0x13e6, -0x13e6,0x13e6,0x13e0,0x181e,0x181e,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8, -0x18d2,0x18d2,0x18d2,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b, -0x1a8b,0x1a8b,0,0,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8e, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xc96,0xc96,0xcea,0xced,0xcf9,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, -0x18cf,0,0x198c,0x198c,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc9f,0xc9f, -0xc8a,0xc8d,0xc9f,0xc9f,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x1161,0x10ef,0x115e,0x115e,0x10ef,0x10ef, -0x10ef,0x115e,0x10ef,0x115e,0x115e,0x115e,0x1164,0x1164,0,0,0,0,0,0,0,0, -0x10ec,0x10ec,0x10ec,0x10ec,0xdec,0xdec,0xdec,0xdec,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9, -0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xde9,0xde9,0xeac,0xea9,0,0,0,0xdef, -0xdef,0xde3,0xde3,0xde3,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0,0, -0,0xdec,0xdec,0xdec,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe16,0xe16, -0xe16,0xe16,0xe16,0xe16,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1980,0x197d,0, -0,0,0,0,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,0, -0,0x1671,0x1671,0x1671,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0,0,0,0, -0,0,0,0,0x107d,0x107a,0x107d,0xfc9,0x107a,0x1080,0x1083,0x1086,0x1089,0x108c,0x108f,0x107a, -0x108c,0x108c,0x107a,0x107a,0x108c,0xfcc,0x1092,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0xfcf,0xfd2,0xfd5, -0xfc6,0x1095,0xfc6,0xfc6,0xfc6,0xfc6,0xfd8,0x120f,0x124e,0x120c,0x120c,0x1608,0x1452,0x1452,0x178b,0, -0,0,0,0,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x1c5,0x1c5,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0,0,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0,0,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0,0x1c5,0,0x1c5, -0,0x1c5,0,0x1c5,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x1c5,0x1c5,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce, -0x1bf,0x1ce,0,0,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1dd,0x1dd,0x1dd,0x1dd, -0x1dd,0x1dd,0x1dd,0x1dd,0x1cb,0x1cb,0x1da,0x1da,0x1da,0,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1d4, -0x1c5,0x1b6,0x1ce,0x1b6,0x1b6,0x1b3,0x1bf,0x1bf,0x1bf,0,0x1bf,0x1bf,0x1c5,0x1d4,0x1c5,0x1d4, -0x1c5,0x1b3,0x1b3,0x1b3,0x1bf,0x1bf,0x1bf,0x1ce,0,0,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1d4, -0,0x1b3,0x1b3,0x1b3,0x1bf,0x1bf,0x1bf,0x1ce,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1d4, -0x1dd,0x1b3,0x1b3,0x1b3,0,0,0x1bf,0x1bf,0x1bf,0,0x1bf,0x1bf,0x1c5,0x1d4,0x1c5,0x1d4, -0x1c5,0x1b9,0x1b6,0,0x94e,0x951,0x951,0x951,0xcfc,9,0x125d,0x125d,0x125d,0x125d,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x3f,0x9ae,0,0,0x345,0x3f,0x3f,0x3f,0x3f,0x3f,0x57,0x69, -0x57,0x63,0x5d,0x3cc,0x3c,0x342,0x342,0x342,0x342,0x3c,0x3c,0x3c,0x3c,0x3c,0x54,0x66, -0x54,0x60,0x5a,0,0xb91,0xb91,0xb91,0xb91,0xb91,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7, -0x10d7,0,0,0,0x5d0,0x5d3,0x8af,0x8af,0x9fc,0xa02,0xa02,0x9ff,0x9ff,0x9ff,0x9ff,0xc18, -0xcde,0xcde,0xcde,0xcde,0xebe,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x261,0x261,0x261,0x7ce,0xc6f,0xd6e,0xd6e,0xd6e,0xd6e,0xff9,0x1461,0x1461, -0,0,0,0,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0x396,0xd2,0xd2, -0xcf,0xcf,0xcf,0xcf,0xb4f,0xb4c,0xb4f,0xb4c,0xb4c,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xee2, -0xedf,0xee2,0xedf,0x103b,0x103e,0x103e,0x119a,0x1197,0,0,0,0,0,0xb55,0xb52,0xb52, -0xb46,0xb43,0xb49,0xb46,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0,0x119d,0,0,0,0, -0,0x119d,0,0,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, -0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0x11b8,0x11b8,0,0,0,0,0,0,0,0xbcd, -0x10e9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x115b, -0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, -0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0,0,0,0,0,0,0,0,0, -0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0, -0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0, -0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879, -0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0,0x879,0x879,0x879,0x879,0x87c, -0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879, -0x879,0x879,0x879,0x87c,0,0,0,0,0,0,0,0,0,0,0,0, -0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c, -0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x891,0x891,0x894,0x894,0x891,0x891,0x891,0x891, -0x891,0x891,0x891,0x891,0x196b,0x196b,0x1968,0x1968,0,0x53a,0x534,0x53a,0x534,0x53a,0x534,0x53a, -0x534,0x53a,0x534,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x537,0x534, -0x537,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x534,0x534,0x534,0x53a,0x534,0x53a,0x534,0x53a, -0x534,0x534,0x534,0x534,0x534,0x534,0x53a,0x534,0x534,0x534,0x534,0x534,0x537,0x9e4,0x9e4,0, -0,0x6cf,0x6cf,0x582,0x582,0x53d,0x540,0x9e1,0,0,0,0,0,0x50d,0x50d,0x50d, -0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d, -0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0x50d,0xe4f,0x1611,0x16e9,0,0x52b,0x52b,0x52b, -0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0, -0x58e,0x58e,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0xe55,0xe55,0xe55,0xe55,0x19f8,0x19f8,0,0,0,0,0,0,0,0,0,0x196b, -0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, -0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522, -0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0x522,0xada,0xada,0, -0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0,0,0, -0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888, -0x888,0x9ed,0x888,0x888,0x888,0x9ed,0x888,0,0,0,0,0,0,0,0,0, -0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdfb,0xdfb,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1, -0x1077,0x1077,0xfab,0xfb4,0xfae,0xfae,0xfae,0xfb4,0,0,0,0,0,0,0,0, -0x1872,0x186f,0x1740,0x173d,0x1734,0x173a,0x173a,0x17d0,0x17cd,0x17d0,0x17cd,0x1986,0x1986,0x1983,0x1a5b,0x1a58, -0x1872,0x186f,0x1a55,0x186f,0x1a55,0x186f,0x1872,0x186f,0x1872,0x186f,0x1986,0x1983,0x1986,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x1a5e,0x187b,0x187b,0x187b,0x17d0,0x17cd,0x12b1,0x11b5,0x11b5,0x10d4,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e, -0xbbb,0xbbb,0xbbb,0xbb8,0xbb8,0xc36,0xc36,0xbb8,0xbb5,0xbb5,0xbb5,0xbb5,0x1827,0,0,0, -0xfde,0xfde,0xfde,0xfe1,0xfe1,0xfe1,0xfe4,0xfe4,0xfe7,0xfe4,0,0,0,0,0,0, -0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd, -0xcbd,0xcbd,0xcbd,0xcbd,0xcba,0xcba,0xcc0,0xcc0,0,0,0,0,0,0,0,0, -0xe2e,0xe2e,0xe2e,0xe2e,0xeb5,0x159f,0,0,0,0,0,0,0,0,0xe34,0xe34, -0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0,0,0,0,0,0, -0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf, -0xeaf,0xeaf,0xe25,0xeb2,0,0,0,0,0,0,0,0,0,0,0,0xe22, -0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020, -0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0,0,0, -0x109b,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf27,0xf33,0xf33,0xf24,0xf24,0xf24,0xf24,0,0xfea, -0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0,0,0,0,0xf24,0xf24, -0x13d7,0x13d7,0x13d7,0x13d7,0x13d7,0x13f8,0x12c0,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da,0x13da, -0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x12ba,0x13da,0x13da,0x13da,0x13da,0x13da,0, -0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0xe9d,0xdce, -0xdce,0xe9d,0xe9d,0xdce,0xdce,0xe9d,0xe9d,0,0,0,0,0,0,0,0,0, -0xdd1,0xdd1,0xdd1,0xe9d,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xe9d,0xdce,0,0, -0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0,0,0xdc8,0xdd7,0xdd7,0xdd7, -0xfa2,0x1074,0xfa2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xf9f,0xf9f,0xfa5,0xf99,0xf9c, -0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x11cd,0x1233,0x1233,0x11cd,0x11cd, -0x11d6,0x11d6,0x11d0,0x11d3,0x11d3,0x11cd,0x1254,0,0,0,0,0,0,0,0,0, -0,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0,0,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0, -0,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0,0,0,0,0,0,0,0,0, -0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0, -0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae, -0x147c,0x147c,0x147c,0x147c,0x12ae,0x12a8,0x173d,0x173d,0x17d3,0x17d6,0x17be,0x17be,0,0,0,0, -0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, -0xf57,0xf57,0xf57,0xf51,0xf51,0x1059,0xf51,0xf51,0x1059,0xf51,0xf51,0xf5a,0xf54,0x105c,0,0, -0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0xf4e,0,0,0,0,0,0, -0x72c,0x72c,0x72c,0x72c,0,0,0,0,0,0,0,0,0,0,0,0, -0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7, -0xef7,0xef7,0xef7,0,0,0,0,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4, -0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4, -0xef4,0xef4,0xef4,0xef4,0,0,0,0,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0, -0,0,0,0,0,0,0,0,0,0,0,0x14d,0x14d,0x14d,0x14d,0x14d, -0,0,0,0,0,0x7a4,0x615,0x21f,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225, -0x225,0x219,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0, -0x21f,0x21f,0x21f,0x21f,0x21f,0,0x21f,0,0x21f,0x21f,0,0x21f,0x21f,0,0x21f,0x21f, -0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x222,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c, -0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a, -0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xbe8,0xbe8,0xbf7,0xbf1,0xbee,0xbfa,0xbfa,0xbf4, -0xbe5,0xbeb,0,0,0,0,0,0,0x4bc,0x4e0,0x4dd,0x4e0,0x4dd,0x9f0,0x9f0,0xad1, -0xacb,0x4bf,0x4bf,0x4bf,0x4bf,0x4f5,0x4f5,0x4f5,0x4e3,0x4e6,0x4fb,0,0x4ec,0x4e9,0x4fe,0x4fe, -0x4d7,0x4cb,0x4b9,0x4cb,0x4b9,0x4cb,0x4b9,0x4c2,0x4c2,0x4ef,0x4ef,0x4f2,0x4ef,0x4ef,0x4ef,0, -0x4ef,0x4d4,0x4d1,0x4c2,0,0,0,0,0x11d,0x135,0x11d,0x990,0x11d,0,0x11d,0x135, -0x11d,0x135,0x11d,0x135,0x11d,0x135,0x11d,0x135,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f, -0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132, -0x12c,0x132,0x12c,0x132,0x12c,0,0,0x1b,0,0x453,0x432,0x420,0x429,0x426,0x420,0x435, -0x423,0x41d,0x420,0x441,0x438,0x42f,0x450,0x420,0x44d,0x44d,0x44d,0x44d,0x44d,0x44d,0x44d,0x44d, -0x44d,0x44d,0x43b,0x43e,0x441,0x441,0x441,0x453,0x402,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, -0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, -0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0,0,0,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, -0,0,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0,0,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff, -0,0,0x3ff,0x3ff,0x3ff,0,0,0,0x426,0x429,0x441,0x444,0x420,0x429,0x429,0, -0x3f9,0x3fc,0x3fc,0x3fc,0x3fc,0x3f9,0x3f9,0,9,9,9,9,9,9,9,9, -9,0x753,0x753,0x753,0x74d,0x336,0x2e5,0x2e5,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, -0xa9e,0xa9e,0xa9e,0xa9e,0,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, -0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0,0xa9e,0xa9e,0xa9e,0xa9e, -0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0, -0xa9e,0xa9e,0,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, -0xa9e,0xa9e,0,0,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, -0xa9e,0xa9e,0,0,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, -0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0, -0,0,0,0,0xab6,0xab6,0xabc,0,0,0,0,0xab3,0xab3,0xab3,0xab3,0xab3, -0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3, -0xab3,0xab3,0xab3,0xab3,0,0,0,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9, -0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0x12a5,0x12a5,0x1524,0x1524,0, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0x17bb,0,0,0, -0x12a5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05, -0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xe64,0,0, -0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a, -0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0,0,0, -0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, -0xe07,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1455,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5, -0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0x13c5,0,0,0,0, -0x930,0x930,0x930,0x930,0,0,0,0,0,0,0,0,0,0x15d5,0x15d5,0x15d5, -0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, -0x927,0x927,0x927,0,0,0,0,0,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7, -0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x12e7,0x1407,0x1407, -0x1407,0x1407,0x1407,0,0,0,0,0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0, -0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0, -0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0,0xaad,0xbd3,0xbd3,0xbd3,0xbd3,0,0,0,0, -0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd0,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0,0, -0,0,0,0,0,0,0,0,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4, -0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4, -0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0xaa4,0,0,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1, -0xaa1,0xaa1,0,0,0,0,0,0,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, -0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0,0,0,0, -0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0,0,0,0, -0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0,0,0,0,0,0,0,0, -0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, -0,0,0,0,0,0,0,0,0,0,0,0x1386,0x18ba,0x18ba,0x18ba,0x18ba, -0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0, -0x18ba,0x18ba,0,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0,0x18b7, -0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0,0x18b7, -0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0,0x18b7,0x18b7,0,0,0,0x19da,0x19da,0x19da,0x19da, -0x19dd,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da, -0,0,0,0,0,0,0,0,0,0,0,0,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0,0,0,0,0,0,0,0,0,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0,0,0,0,0,0,0,0,0,0,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x187e,0x1884,0x1884,0x1881, -0x1881,0x1881,0,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, -0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0,0x1881,0x1881, -0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0,0,0,0,0,0xa8c,0xa8c,0xa8c,0xa8c, -0xa8c,0xa8c,0,0,0xa8c,0,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c, -0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0xa8c,0,0xa8c, -0xa8c,0,0,0,0xa8c,0,0,0xa8c,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63, -0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0xf63,0,0xf60, -0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0xf5d,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338, -0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338, -0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0,0,0,0,0,0,0,0,0x1335, -0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd, -0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0x14cd,0,0x14cd,0x14cd,0,0, -0,0,0,0x14ca,0x14ca,0x14ca,0x14ca,0x14ca,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9, -0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc3,0xcc3, -0xcc3,0xcc3,0xf39,0xf39,0,0,0,0xcc6,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,0,0,0,0,0,0xe0d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d, -0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d,0x1a6d, -0x1a6d,0x1a6d,0,0,0,0,0,0,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5, -0,0,0,0,0x14a0,0x14a0,0x11e5,0x11e5,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, -0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0,0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, -0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0xc12,0xc30,0xc30,0xc30,0,0xc30,0xc30,0, -0,0,0,0,0xc30,0xc30,0xc30,0xc30,0xc12,0xc12,0xc12,0xc12,0,0xc12,0xc12,0xc12, -0,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, -0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0x16f2,0x16f2,0,0,0xc33,0xc33,0xc33,0, -0,0,0,0xc48,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0xbac,0x1689,0,0,0, -0,0,0,0,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbb2,0xbb2,0xbac,0,0,0, -0,0,0,0,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x140a,0x140a,0,0,0,0,0x12f0, -0x12f0,0x12f0,0x12f0,0x12f0,0x12f6,0x12f6,0x13c8,0x12f6,0x12f6,0x12f6,0x12f3,0,0,0,0,0, -0,0,0,0,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c, -0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0,0,0,0xf66,0xf69,0xf69, -0xf69,0xf69,0xf69,0xf69,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, -0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0,0,0xf87,0xf87,0xf87,0xf87, -0xf87,0xf87,0xf87,0xf87,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84, -0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0,0,0,0,0,0xf81,0xf81,0xf81,0xf81, -0xf81,0xf81,0xf81,0xf81,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0x1302, -0x1302,0x1302,0x1302,0x1302,0x1302,0x1302,0,0,0,0,0,0,0,0x12ff,0x12ff,0x12ff, -0x12ff,0,0,0,0,0,0,0,0,0,0,0,0,0x12fc,0x12fc,0x12fc, -0x12fc,0x12fc,0x12fc,0x12fc,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, -0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, -0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0,0,0,0,0,0,0,0x1488,0x1488, -0x1488,0x1488,0x1488,0x1488,0x16cb,0x16cb,0x16ce,0x16ce,0x171c,0x171c,0x171c,0x171c,0,0,0,0, -0,0,0,0,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0x16c8,0,0, -0,0,0,0,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0,0,0,0x1a0d,0x1a10,0x1a0a, -0x1a0a,0x1a0a,0x1992,0x19a4,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0x199b, -0x199b,0x199b,0x199b,0x199b,0x199b,0x199b,0,0,0,0,0,0,0,0,0x1995,0x1995, +0x846,0xa8c,0xa8c,0xa8c,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x8f1,0x8f1,0x8f1,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0x8ee,0, +0,0xa8c,0xa8c,0xa8c,0xb43,0xb46,0xb46,0xb43,0xb43,0xb43,0xb46,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb46,0xb43,0xb46,0xb46,0xb43,0xb43,0xb46,0xb46,0xb46,0xb43,0xb46,0xb43, +0xb43,0xb43,0xd53,0xd53,0xd53,0xd53,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, +0xd50,0xd50,0xd4d,0xd4d,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,0x84f,0x84f,0x84f,0x84f,0x8f4,0x8f4,0x8f4,0x8f4,0x8f4,0x8f4, +0x8f4,0x8f4,0x8f4,0x8f4,0x8f4,0x9ba,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb7,0xcb7, +0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7, +0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcb7,0xcba,0xcba,0xcba,0xd02, +0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xcbd,0xcbd,0xcae,0xcae,0xcb1,0xcc3,0xcc0,0, +0,0x171c,0x16a4,0x16a4,0x107d,0x107d,0x107d,0x107d,0xfa5,0x107d,0x107d,0x107d,0xfa5,0x107d,0x107d,0x107d, +0x107d,0x107a,0,0,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xfa2,0xf9f,0xfa8,0xfa2,0xfa8,0xfa2,0xfa2, +0xfa2,0xfa8,0xfa8,0,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,0x117f,0x117f,0x117f, +0,0,0x111c,0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0, +0,0,0,0,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872, +0x1872,0x1872,0x1872,0x1872,0x186c,0x1875,0x1875,0x1875,0x1875,0x1875,0x186f,0x1a6a,0x187e,0x187e,0,0, +0,0,0,0x1a1f,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x12b1,0x5f4,0x15f,0x15f, +0,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x168,0,0,0x16b,0x16b,0,0,0x16b, +0x16b,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0,0x5b5,0x5b5, +0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0,0x5b5,0,0,0,0x5b5,0x5b5,0x5b5,0x5b5,0,0, +0x5f7,0xa4a,0x5f4,0x15f,0x15f,0x5f4,0x5f4,0x5f4,0x5f4,0,0,0x15f,0x15f,0,0,0x162, +0x162,0x6de,0xb4c,0,0,0,0,0,0,0,0,0x5f1,0,0,0,0, +0x5b2,0x5b2,0,0x5b2,0x165,0x165,0x5ee,0x5ee,0,0,0x321,0x321,0x321,0x321,0x321,0x321, +0x321,0x321,0x321,0x321,0x5b5,0x5b5,0x15c,0x15c,0x159,0x159,0x159,0x159,0x159,0x15c,0x159,0xeee, +0x15ea,0x15e7,0x1713,0,0,0xafe,0x60f,0xa74,0,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0, +0,0,0,0x1fe,0x1fe,0,0,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe, +0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0,0x1fe,0x1fb, +0,0x1fe,0x1fb,0,0x1fe,0x1fe,0,0,0x612,0,0x1f2,0x1f2,0x1f2,0x60f,0x60f,0, +0,0,0,0x60f,0x60f,0,0,0x60f,0x60f,0x618,0,0,0,0xe97,0,0, +0,0,0,0,0,0x1fb,0x1fb,0x1fb,0x1fe,0,0x1fb,0,0,0,0,0, +0,0,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x60f,0x615,0x1f8,0x1f8, +0x1f5,0xe97,0x168c,0,0,0,0,0,0,0,0,0,0,0x606,0x609,0x1e6, +0,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0xa71,0x1ef,0,0x1ef,0x1ef,0x1ef,0,0x1ef, +0x1ef,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0,0x5c4,0x5c4, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0,0x5c4,0x5c4,0,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0,0, +0x60c,0x1e9,0x1e6,0x1e6,0x1e6,0x609,0x609,0x609,0x609,0x609,0,0x609,0x609,0x1e6,0,0x1e6, +0x1e6,0x6e4,0,0,0x1ec,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1e9,0xa6e,0xafb,0xafb,0,0,0x327,0x327,0x327,0x327,0x327,0x327, +0x327,0x327,0x327,0x327,0x11b8,0xa6b,0,0,0,0,0,0,0,0x14fd,0x163e,0x1644, +0x163e,0x1641,0x1641,0x1641,0,0x639,0x2a6,0x2a6,0,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2, +0x2af,0,0,0x2b2,0x2b2,0,0,0x2b2,0x2b2,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd, +0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0,0x5cd,0x5cd, +0,0xae9,0x5cd,0x5cd,0x5cd,0x5cd,0,0,0x63c,0x2ac,0x639,0x639,0x2a6,0x639,0x639,0x639, +0xea9,0,0,0x2a6,0x2a9,0,0,0x2a9,0x2a9,0x6ea,0,0,0,0,0,0x1b4e, +0x1b51,0x1839,0x639,0x636,0,0,0,0,0x5ca,0x5ca,0,0x5cd,0x2ac,0x2ac,0xea9,0xea9, +0,0,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a0,0xaec,0x10f2,0x10f2, +0x10f2,0x10f2,0x10f2,0x10f2,0,0,0,0,0,0,0,0,0,0,0x63f,0x32a, +0,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0,0,0,0x2bb,0x2bb,0x2bb,0,0x2bb,0x2bb, +0x2be,0x2bb,0,0,0,0x2bb,0x2bb,0,0x2bb,0,0x2bb,0x2bb,0,0,0,0x2bb, +0x2bb,0,0,0,0x2bb,0x2bb,0x2bb,0,0,0,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x2bb,0x2bb,0xba3,0x2bb,0x2bb,0x2bb,0,0,0,0,0x645,0x2b5,0x645,0x2b5,0x2b5,0, +0,0,0x2b5,0x2b5,0x2b5,0,0x2b8,0x2b8,0x2b8,0x648,0,0,0xdbf,0,0,0, +0,0,0,0x642,0,0,0,0,0,0,0,0,0,0,0xbee,0x330, +0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x330,0x32d,0x32d,0x32d,0xac8,0xa8f,0xa8f,0xa8f,0xa8f, +0xa8f,0xa92,0xa8f,0,0,0,0,0,0x1416,0x2c4,0x2c7,0x2c7,0x1719,0x2d0,0x2d0,0x2d0, +0x2d0,0x2d0,0x2d0,0x2d0,0x2cd,0,0x2d0,0x2d0,0x2d0,0,0x2d0,0x2d0,0x2d0,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d0,0x5d3,0x5d3,0x13f5,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0,0,0x18f9,0xdc5,0x64e,0x64e, +0x64e,0x2c7,0x2c7,0x2c7,0x2c7,0,0x64e,0x64e,0x651,0,0x64e,0x64e,0x64e,0x6ed,0,0, +0,0,0,0,0,0x64b,0x64b,0,0xe6a,0xe6a,0x1500,0,0x1a7c,0x189f,0,0, +0x2ca,0x2ca,0xeac,0xeac,0,0,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1, +0,0,0,0,0,0,0,0x1764,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2, +0x153f,0x140a,0x22e,0x22e,0x1692,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x231,0,0x234,0x234, +0x234,0,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234, +0x234,0,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x231,0x234,0x234,0,0x234,0x234,0x234, +0x234,0x234,0,0,0xb01,0xa77,0x22e,0x624,0x627,0x22e,0x624,0x22e,0x22b,0,0x624,0x627, +0x627,0,0x627,0x627,0x624,0x62a,0,0,0,0,0,0,0,0x621,0x621,0, +0,0,0,0,0x1a6d,0x1884,0x231,0,0x231,0x231,0xcf3,0xcf3,0,0,0x333,0x333, +0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0,0xc78,0xc78,0x1920,0,0,0,0, +0,0,0,0,0,0,0,0,0x1647,0x140d,0x291,0x291,0x17f1,0x29d,0x29d,0x29d, +0x29d,0x29d,0x29d,0x29d,0x29a,0,0x29d,0x29d,0x29d,0,0x29d,0x29d,0x29d,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x291,0x633,0x633,0x633,0xe9a,0,0x291,0x291, +0x291,0,0x294,0x294,0x28e,0x6e7,0x10ef,0x1545,0,0,0,0,0x1548,0x1548,0x1548,0x633, +0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x1545,0x149d,0x297,0x297,0xe9a,0xe9a,0,0,0x28b,0x28b, +0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0xd9b,0x1545,0x1545, +0x1545,0xd9e,0xda4,0xda4,0xda4,0xda4,0xda4,0xda4,0,0x183c,0x82e,0x82e,0,0x83d,0x83d,0x83d, +0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x837,0x83a,0x83a,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0, +0,0,0x83d,0x83d,0x83d,0x83d,0x834,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d, +0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0,0x83d,0x83d,0x83d,0x83d,0x83d, +0x83d,0x83d,0x83d,0x83d,0,0x83d,0,0,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0x83d,0, +0,0,0x8e8,0,0,0,0,0x8e5,0x82e,0x82e,0x8e5,0x8e5,0x8e5,0,0x8e5,0, +0x82e,0x82e,0x831,0x82e,0x831,0x831,0x831,0x8e2,0,0,0,0,0,0,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0,0,0x82e,0x82b,0x828,0,0,0, +0,0,0,0,0,0,0,0,0,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df, +0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df, +0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x2df,0x654,0x2df,0x2dc,0x654,0x654,0x654,0x654, +0x654,0x654,0x65d,0,0,0,0,0x2a,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2df,0x2e2,0x65a, +0x65a,0x65a,0x65a,0x65a,0x65a,0x654,0x657,0x2d3,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9,0x2d9, +0x2d9,0x2d9,0x2d6,0x2d6,0,0,0,0,0,0x243,0x243,0,0x243,0,0x1749,0x243, +0x243,0x1749,0x243,0,0x1749,0x243,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x243,0x243,0x243,0x243, +0x1749,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x1749,0x243,0x243,0x243,0,0x243,0,0x243, +0x1749,0x1749,0x243,0x243,0x1749,0x243,0x243,0x23d,0x243,0x62d,0x243,0x23a,0x62d,0x62d,0x62d,0x62d, +0x62d,0x62d,0x17be,0x62d,0x62d,0x243,0,0,0x249,0x249,0x249,0x249,0x249,0,0x246,0, +0x630,0x630,0x630,0x630,0x630,0x62d,0x1965,0,0x237,0x237,0x237,0x237,0x237,0x237,0x237,0x237, +0x237,0x237,0,0,0x240,0x240,0x11bb,0x11bb,0x726,0x726,0x726,0x723,0x726,0x726,0x726,0x726, +0,0x726,0x726,0x726,0x726,0x723,0x726,0x726,0x726,0x726,0x723,0x726,0x726,0x726,0x726,0x723, +0x726,0x726,0x726,0x726,0x723,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, +0x726,0x723,0x858,0xdd1,0xdd1,0,0,0,0,0x741,0x741,0x73e,0x741,0x73e,0x73e,0x753, +0x73e,0x753,0x741,0x741,0x741,0x741,0x741,0x717,0x741,0x73e,0x74d,0x74d,0x750,0x6f9,0x744,0x744, +0x71d,0x71d,0x71d,0x71d,0x10f8,0x116a,0x116a,0x116a,0x741,0x741,0x741,0x73e,0x741,0x741,0x8fa,0x741, +0,0x741,0x741,0x741,0x741,0x73e,0x741,0x741,0x741,0x741,0x73e,0x741,0x741,0x741,0x741,0x73e, +0x741,0x741,0x741,0x741,0x73e,0x741,0x8f7,0x8f7,0x8f7,0x741,0x741,0x741,0x741,0x741,0x741,0x741, +0x8fa,0x73e,0x8fa,0x8fa,0x8fa,0,0x855,0x855,0x852,0x852,0x852,0x852,0x852,0x852,0x8fd,0x852, +0x852,0x852,0x852,0x852,0x852,0,0xdc8,0x852,0xba6,0xba6,0xdcb,0xdce,0xdc8,0xed9,0xed9,0xed9, +0xed9,0x10f5,0x10f5,0,0,0,0,0,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0,0x11b5, +0,0,0,0,0,0x11b5,0,0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, +0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0xb73, +0x7a1,0,0x7a1,0x7a1,0x7a1,0x7a1,0,0,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0, +0x7a1,0,0x7a1,0x7a1,0x7a1,0x7a1,0,0,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0xb70, +0x7a1,0,0x7a1,0x7a1,0x7a1,0x7a1,0,0,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1, +0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0xb70,0x7a1,0,0x7a1,0x7a1, +0x7a1,0x7a1,0,0,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0,0x7a1,0,0x7a1,0x7a1, +0x7a1,0x7a1,0,0,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0xb73,0x7a1,0x7a1,0x7a1,0x7a1, +0x7a1,0x7a1,0x7a1,0,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1, +0x7a1,0x7a1,0x7a1,0xb70,0x7a1,0,0x7a1,0x7a1,0x7a1,0x7a1,0,0,0x7a1,0x7a1,0x7a1,0x7a1, +0x7a1,0x7a1,0x7a1,0xb70,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1, +0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x79e,0,0,0x1167,0x1167,0xc2d,0xb6d,0x798,0x7a4,0x795, +0x795,0x795,0x795,0x7a4,0x7a4,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x792,0x792, +0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0x792,0,0,0,0xb70,0xb70,0xb70,0xb70, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb6d,0xb6d,0xb6d,0xb6d, +0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0,0,0,0,0,0,0x783,0x783,0x783,0x783, +0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783, +0x783,0x148b,0,0,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0,0,0x81f,0x822,0x822,0x822, +0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822, +0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x81c,0x819,0,0,0,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x86a,0x86a,0x86a,0x825,0x825,0x825,0x12de,0x12de,0x12de, +0x12de,0x12de,0x12de,0x12de,0x12de,0,0,0,0,0,0,0,0x9bd,0x9bd,0x9bd,0x9bd, +0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x18a5,0x9bd,0x9bd,0x9bd,0x9bd,0xa0e,0xa0e, +0xa11,0x18fc,0,0,0,0,0,0,0,0,0,0x18a5,0x9c0,0x9c0,0x9c0,0x9c0, +0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0xa14,0xa14, +0xa17,0x9c9,0x9c9,0,0,0,0,0,0,0,0,0,0x9c3,0x9c3,0x9c3,0x9c3, +0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0xa1a,0xa1a, +0,0,0,0,0,0,0,0,0,0,0,0,0x9c6,0x9c6,0x9c6,0x9c6, +0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0,0x9c6,0x9c6,0x9c6,0,0xa1d,0xa1d, +0,0,0,0,0,0,0,0,0,0,0,0,0x7c2,0x7c2,0x7c2,0x7c2, +0x7c2,0x7c2,0x8be,0x7c2,0x7c2,0x8ca,0x8ca,0x8ca,0x8ca,0x8ca,0x8c4,0x8c4,0x8ca,0x8c7,0x90c,0x8c1, +0x7cb,0x7cb,0x7bc,0x7c8,0x7b6,0x7b0,0x7b9,0x7b3,0x7c5,0xb04,0,0,0x7bf,0x7bf,0x7bf,0x7bf, +0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0,0,0,0,0,0,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0,0,0,0,0,0,0x7ef,0x7ef,0x870,0x873, +0x7f5,0x86d,0x7f2,0x7ef,0x7f8,0x807,0x7fb,0x8d6,0x8d6,0x8d6,0x7ec,0x18f6,0x7fe,0x7fe,0x7fe,0x7fe, +0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0x7fe,0,0,0,0,0,0,0x801,0x801,0x801,0x801, +0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801, +0x801,0x801,0x801,0x801,0x169e,0,0,0,0,0,0,0,0x801,0x801,0x801,0x801, +0x801,0x801,0x801,0x801,0x801,0x8d0,0xda7,0,0,0,0,0,0xf24,0xf24,0xf24,0xf24, +0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24, +0xf24,0xf24,0,0,0,0,0,0,0,0,0,0,0xaa1,0xaa1,0xaa1,0xaa1, +0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1, +0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0xaa1,0x12e7,0x12e7,0,0xb07,0xb07,0xb07,0xa9e, +0xa9e,0xa9e,0xa9e,0xb07,0xb07,0xa9e,0xa9e,0xa9e,0,0,0,0,0xa9e,0xa9e,0xb07,0xa9e, +0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xb0a,0xb0a,0xb0a,0,0,0,0,0xa98,0,0,0, +0xaa4,0xaa4,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xab3,0xab3,0xab3,0xab3, +0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0,0, +0xab3,0xab3,0xab3,0xab3,0xab3,0,0,0,0,0,0,0,0,0,0,0, +0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xf2a,0xf2a,0,0,0,0, +0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd3,0xbd3,0xbd3,0xbd0,0xbd0,0xbd3,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, +0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0,0,0,0,0,0,0xbcd,0xbcd,0xbcd,0xbcd, +0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xbcd,0xf27,0,0,0,0xbca,0xbca,0xbaf,0xbaf,0xbaf,0xbaf, +0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf, +0xbaf,0xbaf,0xbaf,0xc39,0xc39,0xbac,0xbac,0xc39,0,0,0xba9,0xba9,0x1044,0x1044,0x1044,0x1044, +0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044, +0x1044,0xf57,0x1062,0xf57,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0,0x10b0,0xf54,0x1062,0xf54, +0xf54,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0xf57,0xf57,0xf57,0xf57,0xf57,0xf57,0x1062, +0x1062,0x1068,0x1068,0x1068,0x1068,0x1068,0x1068,0x1068,0x1068,0,0,0x1065,0xf51,0xf51,0xf51,0xf51, +0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0,0,0,0,0,0,0xf51,0xf51,0xf51,0xf51, +0xf51,0xf51,0xf51,0xf51,0xf51,0xf51,0,0,0,0,0,0,0xf4e,0xf4e,0xf4e,0xf4e, +0xf4e,0xf4e,0xf4e,0xf5a,0xf5d,0xf5d,0xf5d,0xf5d,0xf4e,0xf4e,0,0,0x13fe,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13f8,0x1836,0x1aa6,0x1aa6,0x1aa6,0x1aa6, +0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa9,0x1b39,0x1b39,0x1b39,0x1b39,0x1b39,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xca2,0xca2,0xcf6,0xcf9, +0xd05,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0x18e7,0,0x19a4,0x19a4,0xc9c,0xc9c,0xc9c,0xc9c, +0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,0xc9c,0xcab,0xcab,0xc96,0xc99,0xcab,0xcab,0x1104,0x1104,0x1104,0x1104, +0x1104,0x1104,0x1173,0x1101,0x1170,0x1170,0x1101,0x1101,0x1101,0x1170,0x1101,0x1170,0x1170,0x1170,0x1176,0x1176, +0,0,0,0,0,0,0,0,0x10fe,0x10fe,0x10fe,0x10fe,0xdf8,0xdf8,0xdf8,0xdf8, +0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8,0xeb8, +0xdf5,0xdf5,0xebe,0xebb,0,0,0,0xdfb,0xdfb,0xdef,0xdef,0xdef,0xdf2,0xdf2,0xdf2,0xdf2, +0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0,0,0,0xdf8,0xdf8,0xdf8,0xe1f,0xe1f,0xe1f,0xe1f, +0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0x1539,0x1539,0x1539,0x1539, +0x1539,0x1539,0x1539,0x1539,0x1539,0x1998,0x1995,0,0,0,0,0,0x1689,0x1689,0x1689,0x1689, +0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689, +0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0,0,0x1689,0x1689,0x1689,0x11d9,0x11d9,0x11d9,0x11d9, +0x11d9,0x11d9,0x11d9,0x11d9,0,0,0,0,0,0,0,0,0x108f,0x108c,0x108f,0xfdb, +0x108c,0x1092,0x1095,0x1098,0x109b,0x109e,0x10a1,0x108c,0x109e,0x109e,0x108c,0x108c,0x109e,0xfde,0x10a4,0x108c, +0x108c,0x108c,0x108c,0x108c,0x108c,0xfe1,0xfe4,0xfe7,0xfd8,0x10a7,0xfd8,0xfd8,0xfd8,0xfd8,0xfea,0x121e, +0x1263,0x126f,0x126f,0x161d,0x146a,0x146a,0x17a3,0,0,0,0,0,0x1bf,0x1bf,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1bf,0x1bf,0x1bf,0x1bf, +0x1bf,0x1bf,0,0,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0,0,0x1bf,0x1bf,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0,0x1c5,0,0x1c5,0,0x1c5,0,0x1c5,0x1bf,0x1bf,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1bf,0x1ce,0x1bf,0x1ce, +0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce,0x1bf,0x1ce,0,0,0x1da,0x1da,0x1da,0x1da, +0x1da,0x1da,0x1da,0x1da,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1cb,0x1cb,0x1da,0x1da, +0x1da,0,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1d4,0x1c5,0x1b6,0x1ce,0x1b6,0x1b6,0x1b3,0x1bf,0x1bf, +0x1bf,0,0x1bf,0x1bf,0x1c5,0x1d4,0x1c5,0x1d4,0x1c5,0x1b3,0x1b3,0x1b3,0x1bf,0x1bf,0x1bf,0x1ce, +0,0,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1d4,0,0x1b3,0x1b3,0x1b3,0x1bf,0x1bf,0x1bf,0x1ce, +0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1d4,0x1dd,0x1b3,0x1b3,0x1b3,0,0,0x1bf,0x1bf, +0x1bf,0,0x1bf,0x1bf,0x1c5,0x1d4,0x1c5,0x1d4,0x1c5,0x1b9,0x1b6,0,0x957,0x95a,0x95a,0x95a, +0xd08,9,0x1275,0x1275,0x1275,0x1275,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3f,0x9b7,0,0, +0x34b,0x3f,0x3f,0x3f,0x3f,0x3f,0x57,0x69,0x57,0x63,0x5d,0x3d2,0x5d6,0x5d9,0x8b8,0x8b8, +0xa05,0xa0b,0xa0b,0xa08,0xa08,0xa08,0xa08,0xc24,0xcea,0xcea,0xcea,0xcea,0xed0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x261,0x261,0x261,0x7d7, +0xc7b,0xd7a,0xd7a,0xd7a,0xd7a,0x100b,0x1479,0x1479,0,0,0,0,0x39c,0x39c,0x39c,0x39c, +0x39c,0x39c,0x39c,0x39c,0x39c,0x39c,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf,0xb5b,0xb58,0xb5b,0xb58, +0xb58,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xef4,0xef1,0xef4,0xef1,0x104d,0x1050,0x1050,0x11ac,0x11a9, +0,0,0,0,0,0xb61,0xb5e,0xb5e,0xb52,0xb4f,0xb55,0xb52,0xb76,0xb76,0xb76,0xb76, +0xb76,0xb76,0,0x11af,0,0,0,0,0,0x11af,0,0,0xbd6,0xbd6,0xbd6,0xbd6, +0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0x11ca,0x11ca, +0,0,0,0,0,0,0,0xbd9,0x10fb,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x116d,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0, +0,0,0,0,0,0,0,0,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, +0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0,0,0,0, +0,0,0,0,0,0,0,0,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885, +0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9, -0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0xed9,0, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0,0x1836,0x1836,0x1800,0,0, -0x1803,0x1803,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x197a,0x197a,0x197a,0x1a49,0x1a49,0x1a4c,0,0,0,0,0,0,0,0, -0x1a43,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0x1a40,0,0,0,0,0,0,0, +0x89a,0x89a,0x89d,0x89d,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x89a,0x1983,0x1983,0x1980,0x1980, +0,0x540,0x53a,0x540,0x53a,0x540,0x53a,0x540,0x53a,0x540,0x53a,0x53a,0x53d,0x53a,0x53d,0x53a, +0x53d,0x53a,0x53d,0x53a,0x53d,0x53a,0x53d,0x53a,0x53d,0x53a,0x53d,0x53a,0x53d,0x53a,0x53d,0x53a, +0x53a,0x53a,0x53a,0x540,0x53a,0x540,0x53a,0x540,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x540,0x53a, +0x53a,0x53a,0x53a,0x53a,0x53d,0x9ed,0x9ed,0,0,0x6d8,0x6d8,0x588,0x588,0x543,0x546,0x9ea, +0,0,0,0,0,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513, +0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513, +0x513,0xe5b,0x1626,0x1701,0,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531, +0x531,0x531,0x531,0x531,0x531,0x531,0x531,0,0x594,0x594,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0, +0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0x5a0,0xe61,0xe61,0xe61,0xe61,0x1a10,0x1a10,0,0, +0,0,0,0,0,0,0,0x1983,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0, +0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x9f0,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528, +0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528, +0x528,0x528,0x528,0x528,0x528,0xae3,0xae3,0,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894, +0x894,0x894,0x894,0x894,0x894,0,0,0,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891, +0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x9f6,0x891,0x891,0x891,0x9f6,0x891,0, +0,0,0,0,0,0,0,0,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc, +0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01, +0xe01,0xe01,0xe07,0xe07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3, +0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0x1089,0x1089,0xfbd,0xfc6,0xfc0,0xfc0,0xfc0,0xfc6, +0,0,0,0,0,0,0,0,0x188a,0x1887,0x1758,0x1755,0x174c,0x1752,0x1752,0x17e8, +0x17e5,0x17e8,0x17e5,0x199e,0x199e,0x199b,0x1a76,0x1a73,0x188a,0x1887,0x1a70,0x1887,0x1a70,0x1887,0x188a,0x1887, +0x188a,0x1887,0x199e,0x199b,0x199e,0x1aee,0,0,0,0,0x1adf,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x1a79,0x1893,0x1893,0x1893,0x17e8,0x17e5,0x12c9, +0x11c7,0x11c7,0x10e6,0xd7a,0xd7a,0xd7a,0xd7a,0xd7a,0xbc7,0xbc7,0xbc7,0xbc4,0xbc4,0xc42,0xc42,0xbc4, +0xbc1,0xbc1,0xbc1,0xbc1,0x183f,0,0,0,0xff0,0xff0,0xff0,0xff3,0xff3,0xff3,0xff6,0xff6, +0xff9,0xff6,0,0,0,0,0,0,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9, +0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc6,0xcc6,0xccc,0xccc, +0,0,0,0,0,0,0,0,0xe3a,0xe3a,0xe3a,0xe3a,0xec7,0x15b7,0,0, +0,0,0,0,0,0,0xe40,0xe40,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37, +0xe37,0xe37,0,0,0,0,0,0,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xec1, +0xec1,0xec1,0xec1,0xec1,0xec1,0xec1,0xec1,0xec1,0xec1,0xec1,0xe31,0xec4,0,0,0,0, +0,0,0,0,0,0,0,0xe2e,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x1032,0,0,0,0x10ad,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf39, +0xf45,0xf45,0xf36,0xf36,0xf36,0xf36,0,0xffc,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c,0xf3c, +0xf3c,0xf3c,0,0,0,0,0xf36,0xf36,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x1410,0x12d8,0x13f2, +0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2, +0x12d2,0x12d2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0, +0xde0,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xeaf,0xdda,0xdda,0xeaf,0xeaf,0xdda,0xdda,0xeaf,0xeaf,0, +0,0,0,0,0,0,0,0,0xddd,0xddd,0xddd,0xeaf,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xeaf,0xdda,0,0,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7, +0xdd7,0xdd7,0,0,0xdd4,0xde3,0xde3,0xde3,0xfb4,0x1086,0xfb4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x1a94,0x1a91,0x1a04,0x1947,0x1947,0x1947,0x16da,0x16da,0x16da,0x16da, -0x16da,0x16da,0x16da,0x16dd,0,0,0,0,0,0,0,0,0x16d4,0x16d4,0x16d4,0x16d4, -0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x16d4,0x171f,0x171f, -0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x171f,0x16d1,0x16d1,0x16d1,0x16d1,0x16d7,0x16d7,0x16d7, -0x16d7,0x16d7,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8, -0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18f0,0x18f0,0x18f0,0x18f0,0x18ab,0x18ab,0x18ab,0x18ab,0,0, +0,0,0,0xfb1,0xfb1,0xfb7,0xfab,0xfae,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x122d, +0x122d,0x122d,0x122d,0x11df,0x1248,0x1248,0x11df,0x11df,0x11e8,0x11e8,0x11e2,0x11e5,0x11e5,0x11df,0x1269,0, +0,0,0,0,0,0,0,0,0,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0, +0,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0,0,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0, +0,0,0,0,0,0,0,0,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6, +0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x12c6,0x1494,0x1494,0x1494,0x1494,0x12c6,0x12c0,0x1755,0x1755, +0x17eb,0x17ee,0x17d6,0x17d6,0x1ae5,0x1ae5,0,0,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488, +0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0xf69,0xf69,0xf69,0xf63,0xf63,0x106b,0xf63,0xf63, +0x106b,0xf63,0xf63,0xf6c,0xf66,0x106e,0,0,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60, +0xf60,0xf60,0,0,0,0,0,0,0x735,0x735,0x735,0x735,0,0,0,0, +0,0,0,0,0,0,0,0,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, +0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0,0,0,0,0xf06, +0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06, +0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0,0,0,0, +0x273,0x273,0x273,0x273,0x273,0x273,0x273,0,0,0,0,0,0,0,0,0, +0,0,0,0x14d,0x14d,0x14d,0x14d,0x14d,0,0,0,0,0,0x7ad,0x61b,0x21f, +0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x219,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f, +0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0,0x21f,0x21f,0x21f,0x21f,0x21f,0,0x21f,0, +0x21f,0x21f,0,0x21f,0x21f,0,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x222, +0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c, +0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, +0xbf4,0xbf4,0xc03,0xbfd,0xbfa,0xc06,0xc06,0xc00,0xbf1,0xbf7,0,0,0,0,0,0, +0x4c2,0x4e6,0x4e3,0x4e6,0x4e3,0x9f9,0x9f9,0xada,0xad4,0x4c5,0x4c5,0x4c5,0x4c5,0x4fb,0x4fb,0x4fb, +0x4ec,0x4e9,0x501,0,0x4f2,0x4ef,0x504,0x504,0x4dd,0x4d1,0x4bf,0x4d1,0x4bf,0x4d1,0x4bf,0x4c8, +0x4c8,0x4f5,0x4f5,0x4f8,0x4f5,0x4f5,0x4f5,0,0x4f5,0x4da,0x4d7,0x4c8,0,0,0,0, +0x11d,0x135,0x11d,0x999,0x11d,0,0x11d,0x135,0x11d,0x135,0x11d,0x135,0x11d,0x135,0x11d,0x135, +0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132, +0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0,0,0x1b, +0,0x459,0x438,0x426,0x42f,0x42c,0x426,0x43b,0x429,0x423,0x426,0x447,0x43e,0x435,0x456,0x426, +0x453,0x453,0x453,0x453,0x453,0x453,0x453,0x453,0x453,0x453,0x441,0x444,0x447,0x447,0x447,0x459, +0x408,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405, +0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0, +0,0,0x405,0x405,0x405,0x405,0x405,0x405,0,0,0x405,0x405,0x405,0x405,0x405,0x405, +0,0,0x405,0x405,0x405,0x405,0x405,0x405,0,0,0x405,0x405,0x405,0,0,0, +0x42c,0x42f,0x447,0x44a,0x426,0x42f,0x42f,0,0x3ff,0x402,0x402,0x402,0x402,0x3ff,0x3ff,0, +9,9,9,9,9,9,9,9,9,0x75c,0x75c,0x75c,0x756,0x33c,0x2e8,0x2e8, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0,0xaa7,0xaa7,0xaa7, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, +0xaa7,0xaa7,0xaa7,0,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0,0xaa7,0xaa7,0,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0,0,0xaa7,0xaa7,0xaa7,0xaa7, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0,0,0xaa7,0xaa7,0xaa7,0xaa7, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0,0,0,0,0,0xabf,0xabf,0xac5,0, +0,0,0,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,0,0,0,0xac2, +0xac2,0xac2,0xac2,0xac2,0xac2,0xac2,0xac2,0xac2,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb7f,0xb7f,0x12bd,0x12bd,0x153c,0x153c,0,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b, +0xd0b,0xd0b,0xd0b,0xd0b,0x17d3,0,0,0,0x12bd,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb, -0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0,0,0,0, +0,0,0,0,0,0,0,0,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xe73,0,0,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16, +0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16, +0xe16,0xe16,0xe16,0xe16,0xe16,0,0,0,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, +0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x146d,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,0,0,0,0,0x939,0x939,0x939,0x939,0,0,0,0, +0,0,0,0,0,0x15ed,0x15ed,0x15ed,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930, +0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0x930,0,0,0,0,0, +0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff, +0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x12ff,0x141f,0x141f,0x141f,0x141f,0x141f,0,0,0,0,0, +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,0,0xab6, +0xbdf,0xbdf,0xbdf,0xbdf,0,0,0,0,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf, +0xbdc,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0,0,0,0,0,0,0,0,0,0, +0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad, +0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0xaad,0,0, +0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0xaaa,0,0,0,0,0,0, +0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593,0x1593, +0x1593,0x1593,0x1593,0x1593,0,0,0,0,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590, +0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590, +0x1590,0x1590,0x1590,0x1590,0,0,0,0,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c, +0,0,0,0,0,0,0,0,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0,0,0,0,0,0,0,0, +0,0,0,0x139e,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0, +0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0,0x18d2,0x18d2,0,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf, +0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf, +0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0x18cf,0,0x18cf, +0x18cf,0,0,0,0x19f2,0x19f2,0x19f2,0x19f2,0x19f5,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2, +0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0,0,0,0,0,0,0,0, +0,0,0,0,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc, +0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0,0,0,0,0, +0,0,0,0,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc, +0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0,0,0,0,0,0, +0,0,0,0,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, -0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0,0,0,0,0,0,0,0,0, -0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x116a,0x1107,0x1107,0x10f8,0x10f8,0x10f8,0x10f8,0x10f8,0,0, -0,0,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5, -0x10f5,0x10f5,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x18ea,0x1899,0x1899,0x18e7, -0x18e7,0x1899,0,0,0,0,0,0,0,0,0,0x1401,0xf7b,0xf7b,0x18ed,0, -0,0,0,0,0,0,0,0,0,0x1692,0,0,0x1200,0x1200,0x1200,0x1200, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0,0,0, -0,0,0,0,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0,0, -0,0,0,0,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1236,0x1236,0x1236,0x1236,0x1236, -0x11df,0x1236,0x1239,0x1239,0x1236,0x1236,0x1236,0x1257,0x123c,0,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc,0x11dc, -0x11dc,0x11dc,0x11dc,0x11dc,0x11d9,0x11e2,0x11e2,0x11e2,0x16f5,0x168f,0x168f,0x1818,0,0,0,0, -0,0,0,0,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392, -0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1440,0x138c,0x138f,0x1392,0,0,0,0,0, -0,0,0,0,0,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9, -0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0,0,0,0,0,0,0, -0,0,0,0,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, -0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, -0x1371,0x1371,0x1371,0x1371,0x191d,0x1956,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1896,0x189c,0x189c,0x1899,0x1899,0x1899,0,0x1899,0x1899,0x1899,0x1899,0x1899, +0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899, +0x1899,0x1899,0x1899,0x1899,0x1899,0,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1afa, +0x1afa,0x1afa,0x1afa,0x1afa,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0,0,0xa95,0,0xa95,0xa95, +0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0xa95, +0xa95,0xa95,0xa95,0xa95,0xa95,0xa95,0,0xa95,0xa95,0,0,0,0xa95,0,0,0xa95, +0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75, +0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0,0xf72,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f,0xf6f, +0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0, +0,0,0,0,0,0,0,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0,0x14d0,0,0x14d0,0x14d0, -0x14d0,0x14d0,0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d3,0,0, -0,0,0,0,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347, -0x1347,0x1347,0x1347,0x1347,0x1344,0x1344,0x1344,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1425,0x1428,0, -0,0,0,0,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0,0, -0,0,0,0,0x14fa,0x1458,0x1317,0x13cb,0,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320, -0x1320,0,0,0x1320,0x1320,0,0,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320, -0x1320,0x1320,0x1320,0x1320,0x1320,0,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0x1320,0,0x1320,0x1320, -0,0x1320,0x1320,0x1320,0x1320,0x1320,0,0x1722,0x145b,0x131d,0x1416,0x1317,0x1416,0x1317,0x1317,0x1317, -0x1317,0,0,0x1317,0x1317,0,0,0x131a,0x131a,0x141c,0,0,0x149d,0,0,0, -0,0,0,0x1416,0,0,0,0,0,0x1326,0x1323,0x1323,0x1320,0x1320,0x1317,0x1317, -0,0,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0x1419,0,0,0,0x1419,0x1419,0x1419,0x1419, -0x1419,0,0,0,0,0,0,0,0,0,0,0,0x19fe,0x19fe,0x19fe,0x1a01, -0x19fe,0x1a01,0x19fe,0x19fe,0x19fe,0x19fe,0,0x19fe,0,0,0x1a01,0,0x19fe,0x1a01,0x19fb,0x19fb, -0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb, -0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0x19fb,0,0x19e6,0x1a22,0x19e3,0x19e3,0x1a22,0x1a22,0x1a22,0x1a22,0x1a22, -0x1a22,0,0x1a22,0,0,0x1a25,0,0x1a25,0x1a25,0x1a22,0x19e3,0,0x19e3,0x19e3,0x1a2e,0x1a2e, -0x1a31,0x19e9,0x1a2b,0x19ec,0x19ef,0x19ef,0,0x19e0,0x19e0,0,0,0,0,0,0,0, -0,0x1a28,0x1a28,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0,0x14e5,0x14e5,0,0,0,0,0,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2, +0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5, +0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xcd5,0xccf,0xccf,0xccf,0xccf,0xf4b,0xf4b,0,0,0,0xcd2, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0,0,0,0,0,0xe19, +0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88, +0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0,0,0,0,0,0, +0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7, +0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0,0,0,0,0x14b8,0x14b8,0x11f7,0x11f7, +0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8, +0,0,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8,0x14b8, +0xc1e,0xc3c,0xc3c,0xc3c,0,0xc3c,0xc3c,0,0,0,0,0,0xc3c,0xc3c,0xc3c,0xc3c, +0xc1e,0xc1e,0xc1e,0xc1e,0,0xc1e,0xc1e,0xc1e,0,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e, +0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e, +0x170a,0x170a,0,0,0xc3f,0xc3f,0xc3f,0,0,0,0,0xc54,0xbb8,0xbb8,0xbb8,0xbb8, +0xbb8,0xbb8,0xbb8,0xbb8,0x16a1,0,0,0,0,0,0,0,0xbbb,0xbbb,0xbbb,0xbbb, +0xbbb,0xbbb,0xbbe,0xbbe,0xbb8,0,0,0,0,0,0,0,0x1311,0x1311,0x1311,0x1311, +0x1311,0x1422,0x1422,0,0,0,0,0x1308,0x1308,0x1308,0x1308,0x1308,0x130e,0x130e,0x13e0,0x130e, +0x130e,0x130e,0x130b,0,0,0,0,0,0,0,0,0,0xf7e,0xf7e,0xf7e,0xf7e, +0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e,0xf7e, +0xf7e,0xf7e,0,0,0,0xf78,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf9c,0xf9c,0xf9c,0xf9c, +0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c, +0xf9c,0xf9c,0,0,0xf99,0xf99,0xf99,0xf99,0xf99,0xf99,0xf99,0xf99,0xf96,0xf96,0xf96,0xf96, +0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0, +0,0,0,0,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0x131a,0x131a,0x131a,0x131a, +0x131a,0x131a,0x131a,0x131a,0x131a,0x131a,0x131a,0x131a,0x131a,0x131a,0x131a,0x131a,0x131a,0x131a,0,0, +0,0,0,0,0,0x1317,0x1317,0x1317,0x1317,0,0,0,0,0,0,0, +0,0,0,0,0,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf48,0xf48,0xf48,0xf48, +0xf48,0xf48,0xf48,0xf48,0xf48,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x14a6,0x14a6,0x14a6,0x14a6, +0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x14a3,0x14a3,0x14a3,0x14a3, +0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0, +0,0,0,0,0,0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x16e3,0x16e3,0x16e6,0x16e6, +0x1734,0x1734,0x1734,0x1734,0,0,0,0,0,0,0,0,0x16e0,0x16e0,0x16e0,0x16e0, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0,0,0,0,0,0,0x19b9,0x19b9,0x19b9,0x19b9, +0x19b9,0x19b9,0,0,0,0x1a28,0x1a2b,0x1a25,0x1a25,0x1a25,0x19aa,0x19bc,0x19b3,0x19b3,0x19b3,0x19b3, +0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0x19b3,0,0, +0,0,0,0,0,0,0x19ad,0x19ad,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb, +0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb, +0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb,0,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b, +0x181b,0x181b,0,0x184e,0x184e,0x1818,0,0,0x181b,0x181b,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x1992,0x1992,0x1992,0x1a64,0x1a64,0x1a67, +0,0x1ad3,0x1ad3,0x1b45,0x1b45,0x1b45,0x1b42,0x1b42,0x1a5e,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x1a5b,0x1a5b, +0x1a5b,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6,0x1ad6, +0x1ad6,0x1ad6,0x1ad6,0,0x1b42,0x1b42,0x1b42,0x1b45,0x1b42,0x1b45,0x1b42,0x1b45,0x1b3c,0x1b3f,0x1aaf,0x1aac, +0x1a1c,0x195f,0x195f,0x195f,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f2,0x16f5,0,0,0,0, +0,0,0,0,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, +0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737,0x1737, +0x1737,0x16e9,0x16e9,0x16e9,0x16e9,0x16ef,0x16ef,0x16ef,0x16ef,0x16ef,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x18c0,0x18c0,0x18c0,0x18c0, +0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x1908,0x1908, +0x1908,0x1908,0x18c3,0x18c3,0x18c3,0x18c3,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1803,0x1803,0x1803,0x1803, +0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1800,0x1800,0x1800, +0x1800,0x1800,0x1800,0x1800,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782, +0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0x1782,0, +0,0,0,0,0,0,0,0,0x1179,0x1179,0x1179,0x1179,0x1179,0x1179,0x117c,0x1119, +0x1119,0x110a,0x110a,0x110a,0x110a,0x110a,0,0,0,0,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, +0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d, +0x110d,0x110d,0x110d,0x110d,0x1902,0x18b1,0x18b1,0x18ff,0x18ff,0x18b1,0,0,0,0,0,0, +0,0,0,0x1419,0xf8d,0xf8d,0x1905,0,0,0,0,0,0,0,0,0, +0,0x16aa,0,0,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212, +0x1212,0x1212,0x1212,0x1212,0x1212,0,0,0,0,0,0,0,0x120f,0x120f,0x120f,0x120f, +0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0,0,0,0,0,0,0x1230,0x1230,0x1230,0x1230, +0x1230,0x1230,0x1230,0x124b,0x124b,0x124b,0x124b,0x124b,0x11f1,0x124b,0x124e,0x124e,0x124b,0x124b,0x124b,0x126c, +0x1251,0,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11eb,0x11f4,0x11f4,0x11f4, +0x170d,0x16a7,0x16a7,0x1830,0,0,0,0,0,0,0,0,0x13aa,0x13aa,0x13aa,0x13aa, +0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x1458, +0x13a4,0x13a7,0x13aa,0,0,0,0,0,0,0,0,0,0,0x12e1,0x12e1,0x12e1, +0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1, +0x12e1,0,0,0,0,0,0,0,0,0,0,0,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0,0x1389, +0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1935,0x196e,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x156f,0x156f,0x15bd,0x15b7,0x15b7,0x156f,0x15ba,0x1572,0x1572,0x1572,0x1572,0x1575,0x1575,0x1569,0x1566,0x1563, -0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x17e2,0x1569,0,0x1563,0x1707,0x1764, -0x17e5,0x17e5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x14e8,0x14e8,0x14e8,0x14e8, +0x14e8,0x14e8,0x14e8,0,0x14e8,0,0x14e8,0x14e8,0x14e8,0x14e8,0,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8, +0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0,0x14e8,0x14e8,0x14e8,0x14e8,0x14e8, +0x14e8,0x14e8,0x14e8,0x14e8,0x14e8,0x14eb,0,0,0,0,0,0,0x135f,0x135f,0x135f,0x135f, +0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135c,0x135c,0x135c,0x143a, +0x143a,0x143a,0x143a,0x143a,0x143a,0x143d,0x1440,0,0,0,0,0,0x1359,0x1359,0x1359,0x1359, +0x1359,0x1359,0x1359,0x1359,0x1359,0x1359,0,0,0,0,0,0,0x1512,0x1470,0x132f,0x13e3, +0,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0,0,0x1338,0x1338,0,0,0x1338, +0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0,0x1338,0x1338, +0x1338,0x1338,0x1338,0x1338,0x1338,0,0x1338,0x1338,0,0x1338,0x1338,0x1338,0x1338,0x1338,0,0x173a, +0x1473,0x1335,0x142e,0x132f,0x142e,0x132f,0x132f,0x132f,0x132f,0,0,0x132f,0x132f,0,0,0x1332, +0x1332,0x1434,0,0,0x14b5,0,0,0,0,0,0,0x142e,0,0,0,0, +0,0x133e,0x133b,0x133b,0x1338,0x1338,0x132f,0x132f,0,0,0x1431,0x1431,0x1431,0x1431,0x1431,0x1431, +0x1431,0,0,0,0x1431,0x1431,0x1431,0x1431,0x1431,0,0,0,0,0,0,0, +0,0,0,0,0x1a16,0x1a16,0x1a16,0x1a19,0x1a16,0x1a19,0x1a16,0x1a16,0x1a16,0x1a16,0,0x1a16, +0,0,0x1a19,0,0x1a16,0x1a19,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13, +0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0x1a13,0,0x19fe, +0x1a3d,0x19fb,0x19fb,0x1a3d,0x1a3d,0x1a3d,0x1a3d,0x1a3d,0x1a3d,0,0x1a3d,0,0,0x1a40,0,0x1a40, +0x1a40,0x1a3d,0x19fb,0,0x19fb,0x19fb,0x1a49,0x1a49,0x1a4c,0x1a01,0x1a46,0x1a04,0x1a07,0x1a07,0,0x19f8, +0x19f8,0,0,0,0,0,0,0,0,0x1a43,0x1a43,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1437,0x137d,0x143d,0x143a,0x1383,0x1383,0x1377,0x1383,0,0,0,0,0,0,0,0, -0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0x137a,0,0,0,0,0,0, -0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x1449, -0x13b0,0x13b0,0x1449,0x1449,0x1449,0x1449,0,0,0x13b0,0x13b0,0x13b3,0x13b3,0x1449,0x1449,0x13b0,0x144f, -0x144c,0x13a7,0x13b9,0x13b9,0x13aa,0x13aa,0x13ad,0x13ad,0x13ad,0x13b9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9, -0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d9,0x14d6,0x14d6,0x14d6,0x14d6,0x1509,0x1509,0,0, -0x1443,0x13a1,0x13a1,0x1395,0x139e,0,0,0,0,0,0,0,0,0,0,0, -0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0,0,0,0,0,0, -0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0,0,0, +0,0,0,0,0,0,0,0,0x1587,0x1587,0x15d5,0x15cf,0x15cf,0x1587,0x15d2,0x158a, +0x158a,0x158a,0x158a,0x158d,0x158d,0x1581,0x157e,0x157b,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584, +0x1584,0x1584,0x17fa,0x1581,0,0x157b,0x171f,0x177c,0x17fd,0x17fd,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1245,0x1206,0x1245,0x1206,0x1206, -0x1245,0x1245,0x1245,0x1245,0x1245,0x1245,0x124b,0x1248,0x175e,0x189c,0,0,0,0,0,0, -0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0,0,0,0,0,0, -0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989, +0,0,0,0,0,0,0,0,0x144f,0x1395,0x1455,0x1452,0x139b,0x139b,0x138f,0x139b, +0,0,0,0,0,0,0,0,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392, +0x1392,0x1392,0,0,0,0,0,0,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce, +0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x1461,0x13c8,0x13c8,0x1461,0x1461,0x1461,0x1461,0,0, +0x13c8,0x13c8,0x13cb,0x13cb,0x1461,0x1461,0x13c8,0x1467,0x1464,0x13bf,0x13d1,0x13d1,0x13c2,0x13c2,0x13c5,0x13c5, +0x13c5,0x13d1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1,0x14f1, +0x14ee,0x14ee,0x14ee,0x14ee,0x1521,0x1521,0,0,0x145b,0x13b9,0x13b9,0x13ad,0x13b6,0,0,0, +0,0,0,0,0,0,0,0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0, +0x13b0,0x13b0,0,0,0,0,0,0,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b, +0x154b,0x154b,0x154b,0x154b,0x154b,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, +0x121b,0x121b,0x121b,0x125a,0x1218,0x125a,0x1218,0x1218,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x1260,0x125d, +0x1776,0x18b4,0,0,0,0,0,0,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0,0,0,0,0,0,0x19a1,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,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x14c4,0x14c4,0x14c4,0x14c4, -0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4, -0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x1695,0,0,0x1503,0x14c1,0x1503,0x14be,0x14be,0x1503,0x1503, -0x1503,0x1503,0x14c1,0x1503,0x1503,0x1503,0x1503,0x1506,0,0,0,0,0x14bb,0x14bb,0x14bb,0x14bb, -0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14bb,0x14b8,0x14b8,0x14c7,0x14c7,0x14c7,0x14b8,0x189f,0x189f,0x189f,0x189f, -0x189f,0x189f,0x189f,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x16a1,0x16a1,0x16a1,0x16a1, -0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x169e,0x169e,0x169e,0x170a,0x170a,0x170a,0x170a,0x170a, -0x170a,0x170a,0x170a,0x170a,0x169e,0x1710,0x170d,0x169b,0,0,0,0,0x134d,0x134d,0x134d,0x134d, -0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0, -0,0,0,0,0,0,0,0,0,0,0,0x1353,0x181b,0x181b,0x181b,0x181b, -0x181b,0x181b,0x181b,0,0,0x181b,0,0,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b, -0,0x181b,0x181b,0,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b, -0x181b,0x181b,0x181b,0x181b,0x182d,0x17f4,0x17f4,0x17f4,0x17f4,0x17f4,0,0x17f4,0x17f7,0,0,0x182d, -0x182d,0x1833,0x183f,0x17fa,0x17f4,0x17fa,0x17f4,0x1830,0x17fd,0x17ee,0x17fd,0,0,0,0,0, -0,0,0,0,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0,0, -0,0,0,0,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0,0,0x177f,0x177f, -0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, -0x177f,0x177f,0x177f,0x177f,0x177f,0x177c,0x177c,0x177c,0x17af,0x17af,0x17af,0x17af,0,0,0x17af,0x17af, -0x177c,0x177c,0x177c,0x177c,0x17b2,0x177f,0x1779,0x177f,0x177c,0,0,0,0,0,0,0, +0,0,0,0,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc, +0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x16ad,0, +0,0x151b,0x14d9,0x151b,0x14d6,0x14d6,0x151b,0x151b,0x151b,0x151b,0x14d9,0x151b,0x151b,0x151b,0x151b,0x151e, +0,0,0,0,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d3,0x14d0,0x14d0, +0x14df,0x14df,0x14df,0x14d0,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0x18b7,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x15f6,0x15f9,0x1605,0x1605,0x15f9,0x15fc,0x15f6,0x1656,0,0,0,0, -0,0,0,0,0x1620,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x15ed,0x15ed,0x1641,0x1641,0x1641, -0x1620,0x1620,0x1620,0x1620,0x15e7,0x15ea,0x15ea,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a,0x188a, -0x188a,0x188a,0x188a,0x188a,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,0,0,0, -0,0,0,0,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0x1905,0,0, +0,0,0,0,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b6,0x16b6,0x16b6,0x1722,0x1722,0x1722,0x1722,0x1722,0x1722,0x1722,0x1722,0x1722,0x16b6,0x1728,0x1725,0x16b3, +0,0,0,0,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0,0,0,0,0,0,0,0,0, +0,0,0,0x136b,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0,0,0x1833,0,0, +0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0,0x1833,0x1833,0,0x1833,0x1833,0x1833,0x1833, +0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1833,0x1845,0x180c,0x180c,0x180c, +0x180c,0x180c,0,0x180c,0x180f,0,0,0x1845,0x1845,0x184b,0x1857,0x1812,0x180c,0x1812,0x180c,0x1848, +0x1815,0x1806,0x1815,0,0,0,0,0,0,0,0,0,0x1809,0x1809,0x1809,0x1809, +0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0,0,0,0,0,0,0x1797,0x1797,0x1797,0x1797, +0x1797,0x1797,0x1797,0x1797,0,0,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, +0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1794,0x1794,0x1794, +0x17c7,0x17c7,0x17c7,0x17c7,0,0,0x17c7,0x17c7,0x1794,0x1794,0x1794,0x1794,0x17ca,0x1797,0x1791,0x1797, +0x1794,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x160e,0x1611,0x161a,0x161a, +0x1611,0x1614,0x160e,0x166b,0,0,0,0,0,0,0,0,0x1635,0x1656,0x1656,0x1656, +0x1656,0x1656,0x1656,0x1605,0x1605,0x1656,0x1656,0x1656,0x1635,0x1635,0x1635,0x1635,0x15ff,0x1602,0x1602,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x18a2,0x18a2,0x18a2,0x18a2, +0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0,0,0,0,0,0,0,0x191d,0x191d,0x191d,0x191d, +0x191d,0x191d,0x191d,0x191d,0x191d,0x191d,0x1b2d,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1ab2,0x1a7f,0x1ab2,0x1ab2, +0x1ab2,0x1a7f,0x1ab2,0x1a7f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x19ef,0x19e9,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x19ec,0x19ec,0x19ec,0x19ec, +0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0x19ec,0,0,0,0,0,0,0x1569,0x1569,0x1569,0x1569, +0x1569,0x1569,0x1569,0x1569,0x1569,0,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, +0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1566, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x1566,0x15c9, +0x1569,0x156c,0x156c,0x1560,0x155d,0x155d,0,0,0,0,0,0,0,0,0,0, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a, +0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0,0,0,0x156f,0x1572,0x1578,0x1578, +0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578, +0,0,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0,0x1575,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x1575,0x15cc,0x15cc,0x1575,0x15cc,0x15cc,0, +0,0,0,0,0,0,0,0,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0, +0x15f6,0x15f6,0,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6, +0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0, +0,0,0x164d,0,0x164d,0x164d,0,0x164d,0x164d,0x164d,0x1650,0x164d,0x1653,0x1653,0x15f9,0x164d, +0,0,0,0,0,0,0,0,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3, +0x15f3,0x15f3,0,0,0,0,0,0,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0,0x16c2, +0x16c2,0,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0, +0x172b,0x172b,0,0x16bf,0x16bf,0x172b,0x16bf,0x172e,0x16c2,0,0,0,0,0,0,0, +0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0x16bc,0,0,0,0,0,0, +0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91, +0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a91,0x1a94,0x1a91,0x1a91,0,0,0,0, +0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0x1a8e,0,0,0,0,0,0, +0x1b48,0x1b2a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb,0x16cb, +0x16cb,0x16cb,0x16c8,0x1731,0x1731,0x16c5,0x16c5,0x16ce,0x16ce,0,0,0,0,0,0,0, +0x1971,0x1971,0x1941,0x193e,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c, +0x195c,0,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c, +0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x195c,0x193e,0x193e,0x1971,0x1971,0x1971,0x1971,0x1971,0, +0,0,0x193e,0x193e,0x1971,0x1974,0x197a,0x1944,0x1944,0x1938,0x1938,0x1938,0x1938,0x1938,0x1938,0x1938, +0x1938,0x1938,0x1938,0x1938,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x1a22,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1a97,0x1a64,0x1a97,0x1a97,0x1a97,0x1a64,0x1a97,0x1a64,0,0,0,0, +0x17f4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1761,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, +0x175b,0x175b,0,0,0,0,0,0,0,0,0,0,0,0,0,0x175e, +0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305, +0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x14a9,0,0,0,0,0,0, +0x14a9,0x14a9,0x14a9,0x14a9,0,0,0,0,0,0,0,0,0,0,0,0, +0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06, +0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x19d7,0x19d1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0x19d4,0,0, -0,0,0,0,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0,0x1551,0x1551, -0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, -0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x154e,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0, -0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x154e,0x15b1,0x1551,0x1554,0x1554,0x1548,0x1545,0x1545,0,0, -0,0,0,0,0,0,0,0,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b,0x154b, -0x154b,0x154b,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542,0x1542, -0x1542,0,0,0,0x1557,0x155a,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560, -0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0x1560,0,0,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, -0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0,0x155d,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, -0x15b4,0x155d,0x15b4,0x15b4,0x155d,0x15b4,0x15b4,0,0,0,0,0,0,0,0,0, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0,0x15de,0x15de,0,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0,0,0,0x1638,0,0x1638,0x1638,0,0x1638, -0x1638,0x1638,0x163b,0x1638,0x163e,0x163e,0x15e1,0x1638,0,0,0,0,0,0,0,0, -0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0,0,0,0,0,0, -0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0,0x16aa,0x16aa,0,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, -0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa,0x16aa, -0x16aa,0x16aa,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0,0x1713,0x1713,0,0x16a7,0x16a7,0x1713,0x16a7,0x1716, -0x16aa,0,0,0,0,0,0,0,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4,0x16a4, -0x16a4,0x16a4,0,0,0,0,0,0,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76, -0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76,0x1a76, -0x1a76,0x1a79,0x1a76,0x1a76,0,0,0,0,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73,0x1a73, -0x1a73,0x1a73,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3, -0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b3,0x16b0,0x1719,0x1719,0x16ad,0x16ad,0x16b6, -0x16b6,0,0,0,0,0,0,0,0x1959,0x1959,0x1929,0x1926,0x1944,0x1944,0x1944,0x1944, -0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944, -0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944,0x1944, -0x1926,0x1926,0x1959,0x1959,0x1959,0x1959,0x1959,0,0,0,0x1926,0x1926,0x1959,0x195c,0x1962,0x192c, -0x192c,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1920,0x1923,0x1923,0x1923,0x1923, -0x1923,0x1923,0x1923,0x1923,0x1923,0x1923,0x1a07,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x17dc,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1749,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x1746,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,0x1491,0,0,0,0,0,0,0xccf,0xccf,0xccf,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, -0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0,0xccc,0xccc,0xccc,0xccc,0x12ea,0,0,0, -0,0,0,0,0,0,0,0,0x1491,0x1491,0x1491,0x1491,0,0,0,0, +0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd, +0x18bd,0x18ba,0x18ba,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1968,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0x196b, +0x196b,0x196b,0x196b,0x196b,0x196b,0x196b,0,0,0,0,0,0,0,0,0,0, +0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7, +0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0,0,0,0,0, +0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5, -0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a2,0x18a2,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1950,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1953, -0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0,0, -0,0,0,0,0,0,0,0,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f, -0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f, -0x198f,0x198f,0x198f,0,0,0,0,0,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0, +0x1a2e,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a31,0x1a2e,0x19c5,0x19c5,0x19c5,0x1a2e,0x1a2e,0x1a34, +0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0x19c2,0,0,0,0,0,0, +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,0,0,0,0,0,0,0, +0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374, +0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0, +0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0,0,0,0,0x1377,0x1377, +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,0, +0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0,0,0,0,0,0, +0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d, +0x131d,0x131d,0,0,0x1425,0x1425,0x1425,0x1425,0x1425,0x1320,0,0,0,0,0,0, +0,0,0,0,0x12f3,0x12f3,0x12f6,0x12f6,0x12f9,0x12ea,0,0,0,0,0,0, +0,0,0,0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0x12f0,0,0x12ea, +0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3, +0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0,0,0,0, +0,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3, +0x12f3,0x12f3,0x12f3,0x12f3,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x19d1,0x19d1,0x19d1,0x19d4,0x19d1,0x19d1,0x19d1,0x19d4,0x19d7,0x19d7,0x19d7,0x19da, +0x19da,0x19cb,0x19dd,0x19dd,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0,0, +0,0,0,0,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1, +0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d4,0x16dd,0x16d1,0x16d1,0, +0,0,0,0,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, +0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0,0,0x1a82, +0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82,0x1a82, +0x1a82,0x1a82,0x1a82,0x1a82,0,0,0,0,0,0,0,0,0,0,0,0, +0x11d3,0x11d3,0x11d3,0x11d3,0x11d3,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0,0,0,0,0x17c1, +0x11d3,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0, +0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0,0,0,0,0,0,0,0x1242, +0x1242,0x1242,0x1242,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6, +0x15a8,0x1632,0x17af,0x17b2,0x1854,0,0,0,0,0,0,0,0,0,0,0, +0x1851,0x1851,0x1a9d,0x1a9d,0x1a9a,0x1a9a,0x1a9a,0,0,0,0,0,0,0,0,0, +0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, +0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x1b24,0x1b24,0x1b24,0x1b24,0x1b24,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1a13,0x1a16,0x1a16,0x1a16,0x1a16,0x1a16,0x1a16,0x1a16, -0x1a16,0x1a13,0x19ad,0x19ad,0x19ad,0x1a13,0x1a13,0x1a19,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa,0x19aa, -0x19aa,0x19aa,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, -0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, -0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0,0x1359,0x1359,0x1359,0x1359,0x1359,0x1359,0x1359,0x1359, -0x1359,0x1359,0,0,0,0,0x135f,0x135f,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1, -0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1, -0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae,0x18ae, -0x18ae,0x18ae,0,0,0,0,0,0,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305, -0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0,0,0x140d,0x140d,0x140d,0x140d, -0x140d,0x1308,0,0,0,0,0,0,0,0,0,0,0x12db,0x12db,0x12de,0x12de, -0x12e1,0x12d2,0,0,0,0,0,0,0,0,0,0,0x12d8,0x12d8,0x12d8,0x12d8, -0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0,0x12db, -0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db, -0x12db,0x12db,0x12db,0x12db,0,0,0,0,0,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db, -0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x19b9,0x19b9,0x19b9,0x19bc, -0x19b9,0x19b9,0x19b9,0x19bc,0x19bf,0x19bf,0x19bf,0x19c2,0x19c2,0x19b3,0x19c5,0x19c5,0x19b6,0x19b6,0x19b6,0x19b6, -0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0x19b6,0,0,0,0,0,0,0x16b9,0x16b9,0x16b9,0x16b9, -0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, -0x16b9,0x16b9,0x16b9,0x16bc,0x16c5,0x16b9,0x16b9,0,0,0,0,0,0x1a6a,0x1a6a,0x1a6a,0x1a6a, -0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a, -0x1a6a,0x1a6a,0x1a6a,0x1a6a,0x1a6a,0,0,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67, -0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0x1a67,0,0,0,0, -0,0,0,0,0,0,0,0,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x175b,0x175b,0x175b, -0x175b,0x175b,0x175b,0,0,0,0,0x17a9,0x11c1,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, -0,0,0,0,0,0,0,0x122d,0x122d,0x122d,0x122d,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, -0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x1590,0x161d,0x1797,0x179a,0x183c,0,0,0, -0,0,0,0,0,0,0,0,0x1839,0x1839,0x1a82,0x1a82,0x1a7f,0x1a7f,0x1a7f,0, -0,0,0,0,0,0,0,0,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815, -0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0x1815,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x1a0d,0x1b21,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x19f5, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88, -0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1aa3,0x1aa3,0x1aa3,0x1aa3, +0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b1e,0x1b1e,0x1b1e,0x1b1e, +0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b1e,0x1b1e,0x1b1e,0x1b1e, +0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x18cc,0x18cc,0x18cc,0x18cc,0,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0,0x18cc,0x18cc,0, -0x18c9,0x18c9,0x18c9,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x193e,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x179d,0x179d,0x179d,0,0,0x1941,0,0,0,0,0,0, -0,0,0,0,0x17a0,0x17a0,0x17a0,0x17a0,0,0,0,0,0,0,0,0, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0,0,0,0, -0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0,0,0,0,0, -0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0,0,0, -0,0,0,0,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0,0, -0x130b,0x1410,0x1413,0x1311,0x13bc,0x13bc,0x13bc,0x13bc,0,0,0,0,0,0,0,0, +0x18e4,0x18e4,0x18e4,0x18e4,0,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0x18e4,0,0x18e4,0x18e4,0, +0x18e1,0x18e1,0x18e1,0x1b12,0x1b1b,0x1b1b,0x1b1b,0x1b15,0x1b15,0,0,0,0,0,0,0, +0,0,0x1956,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x17b5,0x17b5,0x17b5,0,0,0x1959,0,0,0,0,0,0, +0,0,0,0,0x17b8,0x17b8,0x17b8,0x17b8,0x1b18,0,0,0,0,0,0,0, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0,0,0,0, +0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0,0,0,0,0, +0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0,0,0, +0,0,0,0,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0,0, +0x1323,0x1428,0x142b,0x1329,0x13d4,0x13d4,0x13d4,0x13d4,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971, -0x1971,0x1971,0x1971,0x1971,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1974,0x1a34,0x1a34, -0x1a34,0,0,0,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, -0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0,0,0,0,0,0,0x1a34,0x1a34, -0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34, -0x1a34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34,0x1a34, -0x1a3a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0,0, -0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5, -0x18d5,0x18d5,0x18d5,0,0,0,0,0,0,0,0,0,0x1845,0x1845,0x1845,0x1845, -0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0,0,0,0, +0,0,0,0,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989, +0x1989,0x1989,0x1989,0x1989,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x198c,0x1a4f,0x1a4f, +0x1a4f,0,0,0,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986, +0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0,0,0,0,0,0,0x1a4f,0x1a4f, +0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f, +0x1a4f,0,0x1ab8,0x1ab8,0x1ab8,0,0,0,0,0,0,0,0,0x1ac1,0x1ac1,0x1ac1, +0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f,0x1a4f, +0x1a55,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0,0, +0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0,0, +0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, +0x18ed,0x18ed,0x18ed,0,0,0,0,0,0,0,0,0,0x185d,0x185d,0x185d,0x185d, +0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0,0, -0,0,0,0,0,0,0,0,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0, -0,0xd08,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1467, -0x1467,0x1845,0x1845,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb76,0xb76,0xc21,0xc21,0xc21,0xb76,0,0, +0,0,0,0,0,0,0,0,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0,0, +0,0,0,0,0,0,0,0,0xb82,0xb82,0xc30,0xc30,0xc30,0xb82,0,0, +0,0,0,0,0,0,0,0,0x1b33,0x1b33,0x1b33,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8, +0x1ab8,0x1ab8,0x1ab8,0x1b39,0x1b39,0x1ab8,0x1ab8,0x1b30,0x1b30,0x1b30,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9, -0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0x18f9,0,0,0,0, -0,0,0,0,0,0,0,0,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, -0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0,0,0,0, -0,0,0,0,0,0,0,0,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8, -0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0, -0,0,0,0,0,0,0,0,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2, -0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x1659, -0x1659,0,0,0,0,0,0,0,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91e,0,0x91e,0x91e,0,0,0x91e,0,0,0x91e,0x91e,0, -0,0x91e,0x91e,0x91e,0x91e,0,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b, -0x91b,0x91b,0,0x91b,0,0x91b,0x91b,0x91b,0x91b,0xa29,0x91b,0x91b,0,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0,0x91e, -0x91e,0x91e,0x91e,0,0,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91e,0,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91e,0x91e,0,0x91e,0x91e,0x91e,0x91e,0,0x91e,0x91e,0x91e,0x91e,0x91e,0,0x91e,0, -0,0,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0xb16,0xb16,0,0,0x91e,0x91e,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x915,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0xc54,0xc51, -0,0,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, -0x918,0x918,0x918,0x918,0x1494,0x1494,0x1494,0x1494,0x14f7,0x1494,0x1494,0x1497,0x149a,0x1497,0x1497,0x1494, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1878,0x1875, -0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875, -0x1875,0x1875,0x1875,0,0,0,0,0,0,0x190b,0x190b,0x190b,0x190b,0x190b,0x190b,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,0x1911,0x1911,0x1911,0x1911,0,0,0,0, +0,0,0,0,0,0,0,0,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0,0,0,0, +0,0,0,0,0,0,0,0,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0, +0,0,0,0,0,0,0,0,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde, +0xcde,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde,0x16f8,0x16f8,0x16f8,0x16f8,0x16f8,0x1671, +0x1671,0,0,0,0,0,0,0,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x927,0x927,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,0x927,0,0x927,0x927,0,0,0x927,0,0,0x927,0x927,0, +0,0x927,0x927,0x927,0x927,0,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x924,0x924, +0x924,0x924,0,0x924,0,0x924,0x924,0x924,0x924,0xa32,0x924,0x924,0,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x924,0x924,0x924,0x924,0x927,0x927,0,0x927, +0x927,0x927,0x927,0,0,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0,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, +0x927,0x927,0,0x927,0x927,0x927,0x927,0,0x927,0x927,0x927,0x927,0x927,0,0x927,0, +0,0,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0xb22,0xb22,0x1ac4,0,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x924,0x924,0x924,0x91e,0x924,0x924,0x924,0x924,0x924,0x924,0xc60,0xc5d, +0,0,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921, +0x921,0x921,0x921,0x921,0x14ac,0x14ac,0x14ac,0x14ac,0x150f,0x14ac,0x14ac,0x14af,0x14b2,0x14af,0x14af,0x14ac, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x150f, +0x150f,0x150f,0x150f,0x150f,0,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f, +0x150f,0x150f,0x150f,0x150f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1, +0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1, +0x1ac1,0,0,0,0x1aeb,0x1aeb,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1ae8,0x1af4,0x1ae8,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x1afd,0x1afd,0x1afd,0x1af7,0x1afd,0x1afd,0x1afd, +0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x15b4,0x15b4,0x15b4,0x15b4, +0x15b4,0x15b4,0x15b4,0,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, +0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0,0,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0,0x15b4, +0x15b4,0,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0,0,0,0,0,0x191a,0x191a,0x191a,0x191a, +0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x1917,0x1917,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x191a,0x191a,0x191a,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1962, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0,0x159c,0x159c,0x159c,0x159c, -0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0,0,0x159c, -0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0,0x159c,0x159c,0,0x159c,0x159c,0x159c,0x159c,0x159c,0, -0,0,0,0,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902, -0x1902,0x1902,0x1902,0x1902,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x1902, -0x1902,0x1902,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x194a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, -0x1773,0x1773,0x1773,0x1773,0x1773,0,0,0,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x1773, -0x1773,0x1773,0x1773,0x1773,0x1776,0x1776,0,0,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770, -0x1770,0x1770,0,0,0,0,0x1773,0x176d,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4, -0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18b4,0x18f3,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1788,0x1788,0x1788,0x1788, -0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x17b5,0x17b5,0x17b5,0x17b5,0x1785,0x1785,0x1785,0x1785, -0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0,0,0,0,0,0x1782,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1932,0x1932,0x1932,0x1932, -0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x1932,0x195f,0x195f,0x195f,0x195f, -0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0x192f,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x19ce,0x19ce,0x19ce,0x19ce, -0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x19ce,0x1a1c,0x1a1f, -0x19ce,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0x19cb,0,0,0,0,0x19c8, -0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70, -0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0, -0x1a70,0x1a70,0x1a70,0x1a9a,0x1a70,0x1a70,0x1a9a,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a9a,0x1a9a, -0x1a70,0x1a70,0x1a70,0x1a70,0x1a70,0x1a9a,0,0,0,0,0,0,0,0,0x1a70,0x1a70, -0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0,0x1869,0x1869,0x1869,0x1869,0,0x1869,0x1869,0, -0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0x1869,0, -0x132c,0x132c,0x132c,0x132c,0x132c,0,0,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, -0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0x141f,0,0,0,0,0,0,0,0,0, -0x153c,0x153c,0x153c,0x153c,0x15ab,0x15ab,0x15ab,0x15a5,0x15a8,0x15a8,0x15a8,0x1761,0,0,0,0, -0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0x1539,0,0,0,0,0x1536,0x1536, +0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b,0,0,0, +0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x178b,0x178b,0x178b,0x178b,0x178b,0x178e,0x178e,0,0, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0,0,0,0,0x178b,0x1785, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, -0x165f,0x1659,0x1659,0x1659,0x165f,0x1659,0x1659,0x1659,0x1659,0,0,0,0,0,0,0, -0,0,0,0,0,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, -0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, -0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0,0,0x118e,0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e, -0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, -0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0,0x118e,0x118e,0,0x118e,0,0,0x118e, -0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e, -0,0x118e,0,0x118e,0,0,0,0,0,0,0x118e,0,0,0,0,0x118e, -0,0x118e,0,0x118e,0,0x118e,0x118e,0x118e,0,0x118e,0x118e,0,0x118e,0,0,0x118e, -0,0x118e,0,0x118e,0,0x118e,0,0x118e,0,0x118e,0x118e,0,0x118e,0,0,0x118e, -0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e, -0,0x118e,0x118e,0x118e,0x118e,0,0x118e,0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, -0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, -0x118e,0x118e,0x118e,0x118e,0,0,0,0,0,0x118e,0x118e,0x118e,0,0x118e,0x118e,0x118e, -0x118e,0x118e,0,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e,0x118e, -0x118e,0x118e,0x118e,0x118e,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1185,0x1185,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0,0,0,0,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0,0,0,0,0,0,0,0,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0,0,0,0,0,0,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0,0,0,0,0,0,0,0,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0,0, -0x17bb,0x17bb,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0,0,0,0, -0x196e,0x196e,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0x1a3a,0,0,0,0,0,0,0, -0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb, -0x17bb,0x17bb,0x17bb,0,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb, -0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, -0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x17c1,0x1a34,0,0,0,0,0, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x190b,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0, +0x17cd,0x17cd,0x17cd,0x17cd,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d,0,0, +0,0,0,0x179a,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a, +0x194a,0x194a,0x194a,0x194a,0x1977,0x1977,0x1977,0x1977,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947,0x1947, +0x1947,0x1947,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6, +0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x19e6,0x1a37,0x1a3a,0x19e6,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3,0x19e3, +0x19e3,0x19e3,0x19e3,0,0,0,0,0x19e0,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b, +0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b, +0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0,0x1a8b,0x1a8b,0x1a8b,0x1ab5,0x1a8b,0x1a8b,0x1ab5,0x1a8b, +0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1ab5,0x1ab5,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1a8b,0x1ab5,0,0, +0,0,0,0,0,0,0x1a8b,0x1a8b,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0, +0x1881,0x1881,0x1881,0x1881,0,0x1881,0x1881,0,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0,0x1344,0x1344,0x1344,0x1344,0x1344,0,0,0x1341, +0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0, +0,0,0,0,0,0,0,0,0x1554,0x1554,0x1554,0x1554,0x15c3,0x15c3,0x15c3,0x15bd, +0x15c0,0x15c0,0x15c0,0x1779,0,0,0,0,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, +0x1551,0x1551,0,0,0,0,0x154e,0x154e,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1677,0x1671,0x1671,0x1671,0x1677,0x1671,0x1671,0x1671, +0x1671,0,0,0,0,0,0,0,0,0,0,0,0,0x173d,0x173d,0x173d, +0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, +0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0,0, +0x11a0,0x11a0,0x11a0,0x11a0,0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, +0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, +0,0x11a0,0x11a0,0,0x11a0,0,0,0x11a0,0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, +0x11a0,0x11a0,0x11a0,0,0x11a0,0x11a0,0x11a0,0x11a0,0,0x11a0,0,0x11a0,0,0,0,0, +0,0,0x11a0,0,0,0,0,0x11a0,0,0x11a0,0,0x11a0,0,0x11a0,0x11a0,0x11a0, +0,0x11a0,0x11a0,0,0x11a0,0,0,0x11a0,0,0x11a0,0,0x11a0,0,0x11a0,0,0x11a0, +0,0x11a0,0x11a0,0,0x11a0,0,0,0x11a0,0x11a0,0x11a0,0x11a0,0,0x11a0,0x11a0,0x11a0,0x11a0, +0x11a0,0x11a0,0x11a0,0,0x11a0,0x11a0,0x11a0,0x11a0,0,0x11a0,0x11a0,0x11a0,0x11a0,0,0x11a0,0, +0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, +0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0,0,0,0, +0,0x11a0,0x11a0,0x11a0,0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, +0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1197,0x1197,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0,0,0,0,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0,0,0,0, +0,0,0,0,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0,0, +0,0,0,0,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0,0,0,0, +0,0,0,0,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0,0,0x17d3,0x17d3,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986, +0x1986,0x1986,0x1986,0x1986,0,0,0,0,0x1986,0x1986,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55,0x1a55, +0x1a55,0,0,0,0,0,0,0,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3, +0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0,0x17d3,0x17d3,0x17d3,0x17d3, +0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986, +0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9, +0x17d9,0x17d9,0x1a4f,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x723,0x723,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,3,3,3,3,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -3,3,3,3,3,3,3,3,3,3,3,3,0x10a4,0x10a4,0x10a4,0x10a4, -0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,3,3,0x10a4,0x10a4,0x10a4, -0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x1269,3,0x10a4,0x10a4,0x10a4, -0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x1125,3,0x10a4,0x10a4,0x10a4, -0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,3,3,3,3,3,3,3,3,3,3,0x1581,0x1581,0x1581,0x1581, -0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x1581,0x17bb,3,3,3,3,3,3, +0,0,0x72c,0x72c,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +3,3,3,3,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,3,3,3,3,3,3,3,3, +3,3,3,3,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6, +0x10b6,0x10b6,0x10b6,3,3,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6, +0x10b6,0x10b6,0x10b6,0x1281,3,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6, +0x10b6,0x10b6,0x10b6,0x1137,3,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6,0x10b6, +0x10b6,0x10b6,0x10b6,0x10b6,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,3,3,3,3,3,3, +3,3,3,3,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1599,0x17d3,0x1b09,3,3,3,3,3,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,0x10aa,0x10aa, -0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, -0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x1023,0x112b,0x112b,3,3,3,3,3, -3,3,3,3,3,3,3,3,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011, -0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x1011,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b, -0x112b,0x112b,0x112b,0x158a,3,3,3,3,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e,0x100e, -0x100e,3,3,3,3,3,3,3,0x1143,0x1143,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,3,3, +3,3,3,3,3,3,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, +0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, +0x1035,0x113d,0x113d,3,3,3,3,3,3,3,3,3,3,3,3,3, +0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023, +0x1023,0x1023,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x113d,0x15a2,3,3,3,3, +0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,3,3,3,3,3,3,3, +0x1155,0x1155,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,3,3,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,0x1128,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x13d1,0x1269,0x1269,0x1269,0x14dc,0x1584,0x1584,0x15c3,0x15c3,0x1791,0x1806,0x1806, -0x1a7c,3,3,3,0x1935,0x18bd,0x18bd,0x18bd,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x13ce,0x13ce,3,3,3,0x1269,0x1269,0x1269,0x1269,0x1584,0x1584,0x1584,0x160b, -0x160b,0x16e3,0x1791,0x1806,0x1806,3,3,3,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x165c,0x165c,0x165c, -0x165c,0x18fc,3,3,3,3,3,3,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791, -0x1791,0x1791,0x1791,0x1791,3,3,3,3,0x18bd,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, -0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1a34,0x1a34,0x1a34,0x1a34, -3,3,3,3,3,3,3,3,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c, -0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,3,3,0x1791,0x1791,0x1791,0x1791,0x1806,0x1935,0x1935,0x1935, -0x1791,0x1791,0x1791,0x18bd,0x18bd,3,3,3,0x1791,0x1791,0x1791,0x1806,0x1806,0x1806,0x1806,0x1935, -0x1935,0x19f2,0x1a7c,3,3,3,0x1a7c,0x19f2,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1806,0x1806, -0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x18c0,0x18c0,0x18c0,0x19f2,3, -0x1a7c,3,3,3,3,0x1a7c,0x1935,0x1935,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x18bd, -0x18bd,0x18bd,0x1935,0x1935,0x19f2,3,3,0x19f2,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd, -0x1935,0x19f2,0x1a7c,3,3,3,3,0x1a7c,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x18c0,0x1938, -0x1938,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +0x113a,0x1137,0x1137,0x1137,0x1137,0x1137,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x13e9,0x1281,0x1281,0x1281, +0x14f4,0x159c,0x159c,0x15db,0x15db,0x17a9,0x181e,0x181e,0x1a97,0x1b09,3,3,0x194d,0x18d5,0x18d5,0x18d5, +0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x13e6,0x13e6,3,3,3, +0x1281,0x1281,0x1281,0x1281,0x159c,0x159c,0x159c,0x1620,0x1620,0x16fb,0x17a9,0x181e,0x181e,3,3,3, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x1674,0x1674,0x1674,0x1674,0x1914,0x1b09,0x1ac1,3,3,3,3, +0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,3,3,3,3, +0x18d5,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1,0x1ac1, +0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, +0x173d,0x173d,0x173d,0x173d,0x1a4f,0x1a4f,0x1a4f,0x1a4f,3,3,3,3,3,3,3,3, +0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,0x1674,3,3, +0x17a9,0x17a9,0x17a9,0x17a9,0x181e,0x194d,0x194d,0x194d,0x17a9,0x17a9,0x17a9,0x18d5,0x18d5,3,3,3, +0x181e,0x181e,0x181e,0x18d8,0x18d8,0x18d8,0x1a0a,3,0x1a97,3,3,3,0x1b09,0x1a97,0x194d,0x194d, +0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x18d5,0x18d5,0x18d5,0x194d,0x194d,0x1a0a,0x1b09,3,0x1a0a, +0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x194d,0x1a0a,0x1a97,0x1b09,3,3,3,0x1a97, +0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x18d8,0x1950,0x1950,0x1b0c,0x1b0c,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,0x723,0x723,0x1842,0x1a37,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, -0x5d3,0x5d0,0x5d0,0x5d0,9,0x90c,9,9,9,9,9,9,9,9,9,9, +3,3,3,3,3,3,3,3,3,3,0x72c,0x72c,0x185a,0x1a52,0x1abb,0x1abb, +0x1abb,6,6,6,6,6,6,6,6,6,6,6,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d6,0x5d6,0x5d6,9,0x915,9,9, +9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, -9,9,9,9,9,9,9,9,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07, -0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,9,9,9,9,9,9,9,9, -9,9,9,9,9,9,9,9,0xa5,0xa5,0xa5,0xa5,0xa5,0x765,0x765,0x1977, -0x1977,0x1977,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, -0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, -0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0xc,0xc,0x127e,0x127e, -0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1287,0x13c2,0x128a,0x157e,0x1515,0x15cc,0x15cc,0x15cc, -0x15cc,0x15cc,0x1665,0x1662,0x1668,0x1662,0x1668,0x172e,0x17c4,0x17c4,0x17c4,0x1851,0x1851,0x1848,0x184b,0x1848, -0x184b,0x1848,0x184b,0x1848,0x184b,0x184e,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, +9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, +0xa5,0xa5,0xa5,0xa5,0xa5,0x76e,0x76e,0x198f,0x198f,0x198f,0xc,0xc,0xc,0xc,0xc,0xc, +0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,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,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, -0x9de,0x9de,0x9de,0x101a,0x101a,0x101a,0xf,0xf,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, -0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, -0xc03,0xc03,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296, +0x1296,0x1296,0x1296,0x1296,0xc,0xc,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296, +0x129f,0x13da,0x12a2,0x1596,0x152d,0x15e4,0x15e4,0x15e4,0x15e4,0x15e4,0x167d,0x167a,0x1680,0x167a,0x1680,0x1746, +0x17dc,0x17dc,0x17dc,0x1869,0x1869,0x1860,0x1863,0x1860,0x1863,0x1860,0x1863,0x1860,0x1863,0x1866,0xc,0xc, +0x1ad0,0x1ad0,0x1acd,0x1aca,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, +0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x102c,0x102c,0x102c,0xf,0xf, +0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, +0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,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,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, -0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, -0x113a,0x113a,0xf,0xf,0x14e2,0x14e2,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, -0x1a85,0x1a85,0xf,0xf,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, -0x1614,0x1614,0x1614,0x1614,0x1614,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0xf,0xf,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,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,0x114c,0x114c,0x114c,0x114c, +0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, +0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x1b0f,0xf,0x14fa,0x14fa,0x1aa0,0x1aa0, +0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0xf,0xf,0x1629,0x1629,0x1629,0x1629, +0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x197d,0x197d,0x197d,0x197d, +0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d, +0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0xf,0xf,0x942,0x942,0x942,0x942, +0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, +0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0xf,0xf,0xf,0xf,0xf,0xf, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0x723,0x723,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0xf, -0xf,0xf,0xf,0xf,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b, -0x193b,0x193b,0x193b,0x193b,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, -0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0xf,0xf, -0xf,0xf,0xf,0xf,0x366,0x366,0x369,0xa5,0x3a8,0x37b,0x37b,0x37e,0xf6,0xf6,0x15,0x15, -0x15,0x15,0x15,0x86d,0x372,0xb4,0x39c,0x3a5,0xe7,0x372,0xc0,0xc0,0xa5,0xcc,0xcc,0x366, -0xf0,0xed,0x378,0x75,0x45,0x45,0x48,0x48,0x48,0x48,0x48,0x4b,0x48,0x48,0x48,0x18, -0x10b,0x5dc,0x105,0x105,0x38a,0xc6,0xc3,0x387,0x384,0x381,0x396,0xbd,0x390,0x393,0xc9,0xcc, -0x38d,0x38d,0xc9,0xcc,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0xa5,0x112e,0x112e,0x112e,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0x36,0x36,0x90,0x348,0x24,0x339,0x36,0x8d,0x24,0x348,0x87,0x90, -0x90,0x90,0x87,0x87,0x90,0x90,0x90,0x360,0x24,0x90,0x34b,0x24,0x81,0x90,0x90,0x90, -0x90,0x90,0x24,0x24,0x3f,0x339,0x345,0x24,0x90,0x24,0x3b7,0x2d,0x90,0x51,0x273,0x3cf, -0x90,0x90,0x7e,0x87,0x90,0x90,0x24f,0x90,0x87,0x8a,0x8a,0x8a,0x8a,0x75f,0x756,0xa20, -0xb16,0x963,0x966,0x966,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x27,0x42,0x3f6,0x2a,0x6e7, -0x750,0x759,0x759,0x759,0x957,0x957,0xb10,0xb10,0xb10,0xb10,0xeca,0xecd,0xecd,0x10a7,0x125a,0x126f, -0x1272,0x1272,0x145e,0x15c6,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x30,0x9c6, -0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6, -0x9c6,0x9c6,0x9c6,0xac5,0x960,0x95d,0x95d,0x95d,0x95d,0x966,0x963,0x963,0x963,0x963,0x954,0x95d, -0xb0d,0xc4b,0xc6f,0xd05,0xed0,0xed0,0xed0,0x33f,0x33f,0x33,0x33,0x33,0x33,0x33,0x33,0x33f, -0x33f,0x33f,0x33f,0x39,0x7b,0xa5,0xa5,0xa5,0xdb,0xb1,0xa8,0x987,0x768,0x768,0x765,0x765, -0x765,0x765,0x96c,0x9c3,0x96c,0x96c,0x978,0xa2f,0xa26,0xb19,0xb25,0x975,0xb25,0xb25,0xbd6,0xb25, -0xb22,0xbd9,0xb25,0x95a,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, -0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0xa2,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xa5,0xcf,0xcf,0xcf, -0xcf,0xcf,0xd2,0xa5,0xcf,0xcf,0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0x369,0x369,0xa5,0xa5, -0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2, -0xcf,0xcf,0x396,0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xa5,0xcf,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0xa5,0x369,0xa5,0xa5,0xa5,0x765,0x765,0x765,0x765,0x765, -0x765,0x765,0x765,0x765,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0xa5,0x765,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xde,0xd5,0xde,0xd5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0x366,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x504,0x504,0xa5,0xa5,0xa5,0xa5, -0xcf,0xcf,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x50a,0x507,0xa5,0xa5,0xa5,0xa5,0xa5, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0x72c,0x72c,0x1827,0x1827,0x1827,0x1827, +0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0xf,0xf,0xf,0xf,0xf,0x1953,0x1953,0x1953,0x1953, +0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1aa0,0x1aa0,0x1aa0,0x1aa0, +0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0, +0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0xf,0xf,0xf,0xf,0xf,0xf,0x36c,0x36c,0x36f,0xa5, +0x3ae,0x381,0x381,0x384,0xf6,0xf6,0x15,0x15,0x15,0x15,0x15,0x876,0x378,0xb4,0x3a2,0x3ab, +0xe7,0x378,0xc0,0xc0,0xa5,0xcc,0xcc,0x36c,0xf0,0xed,0x37e,0x75,0x45,0x45,0x48,0x48, +0x48,0x48,0x48,0x4b,0x48,0x48,0x48,0x18,0x10b,0x5e2,0x105,0x105,0x390,0xc6,0xc3,0x38d, +0x38a,0x387,0x39c,0xbd,0x396,0x399,0xc9,0xcc,0x393,0x393,0xc9,0xcc,0x21,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0xa5,0x1140,0x1140,0x1140,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x36,0x36,0x90,0x34e, +0x24,0x33f,0x36,0x8d,0x24,0x34e,0x87,0x90,0x90,0x90,0x87,0x87,0x90,0x90,0x90,0x366, +0x24,0x90,0x351,0x24,0x81,0x90,0x90,0x90,0x90,0x90,0x24,0x24,0x3f,0x33f,0x34b,0x24, +0x90,0x24,0x3bd,0x2d,0x90,0x51,0x276,0x3d5,0x90,0x90,0x7e,0x87,0x90,0x90,0x24f,0x90, +0x87,0x8a,0x8a,0x8a,0x8a,0x768,0x75f,0xa29,0xb22,0x96c,0x96f,0x96f,0x2a,0x2a,0x2a,0x2a, +0x2a,0x2a,0x2a,0x27,0x42,0x3fc,0x2a,0x6f0,0x759,0x762,0x762,0x762,0x960,0x960,0xb1c,0xb1c, +0xb1c,0xb1c,0xedc,0xedf,0xedf,0x10b9,0x1272,0x1287,0x128a,0x128a,0x1476,0x15de,0x354,0x354,0x354,0x354, +0x354,0x354,0x354,0x354,0x354,0x354,0x30,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, +0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0xace,0x969,0x966,0x966,0x966, +0x966,0x96f,0x96c,0x96c,0x96c,0x96c,0x95d,0x966,0xb19,0xc57,0xc7b,0xd11,0xee2,0xee2,0xee2,0x345, +0x345,0x33,0x33,0x33,0x33,0x33,0x33,0x345,0x345,0x345,0x345,0x39,0x3c,0x348,0x348,0x348, +0x348,0x3c,0x3c,0x3c,0x3c,0x3c,0x54,0x66,0x54,0x60,0x5a,0x1ac7,0xb9d,0xb9d,0xb9d,0xb9d, +0xb9d,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x10e9,0x1af7,0x1af7,0x1af7,0x7b,0xa5,0xa5,0xa5, +0xdb,0xb1,0xa8,0x990,0x771,0x771,0x76e,0x76e,0x76e,0x76e,0x975,0x9cc,0x975,0x975,0x981,0xa38, +0xa2f,0xb25,0xb31,0x97e,0xb31,0xb31,0xbe2,0xb31,0xb2e,0xbe5,0xb31,0x963,0x36c,0x36c,0x36c,0x36c, +0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c, +0xa2,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xa5,0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xa5,0xcf,0xcf,0xa5,0xa5, +0xa5,0xa5,0xcf,0xcf,0x36f,0x36f,0xa5,0xa5,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xcf,0xcf,0x39c,0xcf,0x39c,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xa5,0xcf,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0xa5,0x36f, +0xa5,0xa5,0xa5,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0xa5,0x76e,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xde,0xd5,0xde,0xd5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x36c,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0x50a,0x50a,0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0x510,0x50d,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, 0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x765, -0x978,0x765,0x765,0x765,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, -0xa5,0xa5,0xa5,0xa5,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, -0x366,0x366,0x366,0x366,0xa5,0xa5,0x366,0x366,0x366,0x366,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, -0x96c,0x96c,0x96c,0x96c,0x396,0x396,0xa5,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0xa5,0xa5, -0xa5,0xa5,0xcf,0xcf,0xcf,0xcf,0x396,0x396,0xcf,0xcf,0x396,0x396,0xa5,0xa5,0xa5,0xa5, -0x396,0x396,0xcf,0xcf,0x396,0x396,0xa5,0xa5,0xa5,0xa5,0x396,0x396,0x366,0xa5,0xcf,0x396, -0xa5,0xa5,0x366,0x396,0x396,0x396,0xcf,0xcf,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x396,0x366,0x396,0x366,0xa5,0xcf,0xcf,0xcf,0xcf,0xcf, -0xcf,0xa5,0xa5,0x366,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x978,0x978,0x978,0x978, -0x978,0x9d8,0x9d8,0x978,0xae,0xae,0xae,0xae,0xa5,0x396,0x396,0xa5,0xa5,0x366,0xa5,0xa5, -0xa5,0xa5,0x366,0x366,0xa5,0xa5,0xa5,0xa5,0xad7,0xad7,0x969,0x969,0xb1c,0x765,0xae,0xae, -0x36c,0xba,0x36c,0xae,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0xa5,0xae,0xae,0xae, -0xa5,0xa5,0xa5,0xa5,0x396,0xa5,0x396,0xa5,0xa5,0xa5,0xa5,0xa5,0x501,0x501,0x501,0x501, -0x501,0x501,0x501,0x501,0x501,0x501,0x501,0x501,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0x396,0x396,0xcf,0x396,0x366,0x366,0xa5,0x366,0x36c,0x366,0x366,0xa5, -0x366,0x396,0xcf,0x396,0x765,0x765,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, -0x96c,0x96c,0xb19,0xc00,0x1284,0xae,0xae,0xae,0xae,0x112e,0xa5,0xa5,0xae,0xae,0x1134,0x1134, -0xba,0xba,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0x112e,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x369,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x112e,0xa5,0x112e,0xa5,0xa5,0xa5,0xa5,0x112e, -0x112e,0x112e,0xa5,0x1014,0xa5,0xa5,0xa5,0xb7,0xb7,0xb7,0xb7,0x10b3,0x10b3,0xa5,0xab,0xab, -0xae,0xa5,0xa5,0xa5,0x972,0x96f,0x972,0x96f,0x972,0x96f,0x972,0x96f,0x972,0x96f,0x972,0x96f, -0x972,0x96f,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0x336,0xa5,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x112e,0xa5,0xa5,0xa5, -0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x112e,0x396,0xcf,0x396,0x396, -0xd2,0xcf,0xcf,0x396,0x396,0xd2,0xcf,0x396,0xd2,0xcf,0xcf,0x396,0xcf,0x396,0xea,0xe1, -0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0x396,0xcf,0xcf,0x396,0x396,0x396,0x396,0xcf,0xcf,0x396, -0xd2,0x396,0xd2,0x396,0x396,0x396,0x396,0x396,0x3a2,0xe4,0x396,0xe4,0xe4,0xcf,0xcf,0xcf, -0x396,0x396,0x396,0x396,0xcf,0xcf,0xcf,0xcf,0x396,0x396,0xcf,0xcf,0xcf,0xd2,0xcf,0xcf, -0xd2,0xcf,0xcf,0xd2,0x396,0xd2,0xcf,0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0xcf,0x396,0xcf, -0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x399,0x396,0xd2,0xcf, -0x396,0x396,0x396,0x396,0xcf,0xcf,0x396,0x396,0xcf,0xd2,0x399,0x399,0xd2,0xd2,0xcf,0xcf, -0xd2,0xd2,0xcf,0xcf,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0x396,0x396, -0xd2,0xd2,0x396,0x396,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, -0xcf,0x396,0xcf,0xcf,0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x396,0xcf,0xcf, -0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, -0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x396,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x76e,0x981,0x76e,0x76e,0x76e,0x36c,0x36c,0x36c,0x36c, +0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0xa5,0xa5,0xa5,0xa5,0x36c,0x36c,0x36c,0x36c, +0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0xa5,0xa5,0x36c,0x36c, +0x36c,0x36c,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x39c,0x39c,0xa5,0x36c, +0x36c,0x36c,0x36c,0x36c,0x36c,0x36c,0xa5,0xa5,0xa5,0xa5,0xcf,0xcf,0xcf,0xcf,0x39c,0x39c, +0xcf,0xcf,0x39c,0x39c,0xa5,0xa5,0xa5,0xa5,0x39c,0x39c,0xcf,0xcf,0x39c,0x39c,0xa5,0xa5, +0xa5,0xa5,0x39c,0x39c,0x36c,0xa5,0xcf,0x39c,0xa5,0xa5,0x36c,0x39c,0x39c,0x39c,0xcf,0xcf, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x39c,0x36c, +0x39c,0x36c,0xa5,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xa5,0xa5,0x36c,0x76e,0x76e,0x76e,0x76e, +0x76e,0x76e,0x76e,0x76e,0x981,0x981,0x981,0x981,0x981,0x9e1,0x9e1,0x981,0xae,0xae,0xae,0xae, +0xa5,0x39c,0x39c,0xa5,0xa5,0x36c,0xa5,0xa5,0xa5,0xa5,0x36c,0x36c,0xa5,0xa5,0xa5,0xa5, +0xae0,0xae0,0x972,0x972,0xb28,0x76e,0xae,0xae,0x372,0xba,0x372,0xae,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x507,0x507,0x507,0x507, +0x507,0x507,0x507,0x507,0xa5,0xae,0xae,0xae,0xa5,0xa5,0xa5,0xa5,0x39c,0xa5,0x39c,0xa5, +0xa5,0xa5,0xa5,0xa5,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507,0x507, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x39c,0x39c,0xcf,0x39c, +0x36c,0x36c,0xa5,0x36c,0x372,0x36c,0x36c,0xa5,0x36c,0x39c,0xcf,0x39c,0x76e,0x76e,0x975,0x975, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0xb25,0xc0c,0x129c,0xae,0xae,0xae, +0xae,0x1140,0xa5,0xa5,0xae,0xae,0x1146,0x1146,0xba,0xba,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x1140,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0x36f,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0x1140,0xa5,0x1140,0xa5,0xa5,0xa5,0xa5,0x1140,0x1140,0x1140,0xa5,0x1026,0xa5,0xa5,0xa5,0xb7, +0xb7,0xb7,0xb7,0x10c5,0x10c5,0xa5,0xab,0xab,0xae,0xa5,0xa5,0xa5,0x97b,0x978,0x97b,0x978, +0x97b,0x978,0x97b,0x978,0x97b,0x978,0x97b,0x978,0x97b,0x978,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c, +0x33c,0x33c,0x33c,0x33c,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0x1140,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0x1140,0x39c,0xcf,0x39c,0x39c,0xd2,0xcf,0xcf,0x39c,0x39c,0xd2,0xcf,0x39c, +0xd2,0xcf,0xcf,0x39c,0xcf,0x39c,0xea,0xe1,0xcf,0x39c,0xcf,0xcf,0xcf,0xcf,0x39c,0xcf, +0xcf,0x39c,0x39c,0x39c,0x39c,0xcf,0xcf,0x39c,0xd2,0x39c,0xd2,0x39c,0x39c,0x39c,0x39c,0x39c, +0x3a8,0xe4,0x39c,0xe4,0xe4,0xcf,0xcf,0xcf,0x39c,0x39c,0x39c,0x39c,0xcf,0xcf,0xcf,0xcf, +0x39c,0x39c,0xcf,0xcf,0xcf,0xd2,0xcf,0xcf,0xd2,0xcf,0xcf,0xd2,0x39c,0xd2,0xcf,0xcf, +0x39c,0xcf,0xcf,0xcf,0xcf,0xcf,0x39c,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0x39f,0x39c,0xd2,0xcf,0x39c,0x39c,0x39c,0x39c,0xcf,0xcf,0x39c,0x39c, +0xcf,0xd2,0x39f,0x39f,0xd2,0xd2,0xcf,0xcf,0xd2,0xd2,0xcf,0xcf,0xd2,0xd2,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0x39c,0x39c,0xd2,0xd2,0x39c,0x39c,0xd2,0xd2,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x39c,0xcf,0xcf,0xcf,0x39c,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xcf,0x39c,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xd2, +0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0x39c, +0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, 0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf, -0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf, -0xcf,0xcf,0xd2,0xd2,0xd2,0xd2,0xcf,0xd8,0xcf,0xcf,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0xd2,0xd2,0xd2,0xd2,0xcf,0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xd2,0xcf,0xd8, +0xcf,0xcf,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, 0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, -0x132,0x132,0x132,0x132,0x132,0x132,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x12c,0x12c,0x12c,0x12c, +0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x11d,0x11d, +0x11d,0x11d,0x11d,0x11d,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, 0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, -0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, -0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x132,0x132,0x330,0x132,0x132,0x132,0x132,0x132, -0x132,0x132,0x11d,0x11d,0x98a,0xac2,0x1854,0x1854,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c, +0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f, +0x132,0x132,0x336,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x11d,0x11d,0x993,0xacb,0x186c,0x186c, 0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c, -0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c, -0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c, -0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c, -0x12f,0x135,0x132,0x12c,0x132,0x12c,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9, -0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x1854,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46, -0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132, -0x12c,0x132,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x12f,0x135,0x132,0x12c, -0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x12f,0x132,0x12c,0x12f, -0x132,0x12c,0x12f,0x135,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, -0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f, -0x12f,0x12f,0x12f,0x12f,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, -0x132,0x132,0x132,0x132,0x132,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, -0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x135,0x135,0x135,0x135, -0x135,0x135,0x135,0x135,0x12c,0x132,0x309,0x30c,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854, -0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x1854,0x12f,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, -0x12c,0x12f,0x12c,0x12c,0x12f,0x12f,0x12c,0x12c,0x12f,0x12f,0x12c,0x12f,0x12c,0x12f,0x12c,0x12c, -0x12f,0x12c,0x12c,0x12f,0x12c,0x12f,0x12c,0x12c,0x12f,0x12c,0x12f,0x12f,0x12c,0x12c,0x12c,0x12f, -0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12c,0x12c,0x12f,0x12c, -0x12f,0x12f,0x12f,0x12c,0x12f,0x12f,0x12f,0x12f,0x1a46,0x1a46,0x12f,0x12f,0x12f,0x12f,0x12c,0x12c, -0x12f,0x12c,0x12c,0x12c,0x12c,0x12f,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, -0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12c,0x12c, -0x12f,0x12c,0x12f,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12f,0x12c,0x12c, -0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1a46,0x1854,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, -0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x132,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132, -0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f, -0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132, -0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f, +0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c, +0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c, +0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f,0x135, +0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x10cb,0x10cb, +0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x186c,0x1a61, +0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x132, +0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x132,0x12c,0x132,0x12c,0x132,0x12c, +0x132,0x12c,0x12f,0x135,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c, +0x132,0x12c,0x132,0x12c,0x12f,0x132,0x12c,0x12f,0x132,0x12c,0x12f,0x135,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12f, +0x12f,0x12f,0x12f,0x12f,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x12c,0x132,0x30c,0x30f, +0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c,0x186c, +0x12f,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12c,0x12f,0x12c,0x12c,0x12f,0x12f,0x12c,0x12c, +0x12f,0x12f,0x12c,0x12f,0x12c,0x12f,0x12c,0x12c,0x12f,0x12c,0x12c,0x12f,0x12c,0x12f,0x12c,0x12c, +0x12f,0x12c,0x12f,0x12f,0x12c,0x12c,0x12c,0x12f,0x12c,0x12c,0x12c,0x12c,0x12c,0x12f,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12f,0x12c,0x12c,0x12f,0x12c,0x12f,0x12f,0x12f,0x12c,0x12f,0x12f,0x12f,0x12f, +0x1a61,0x1a61,0x12f,0x12f,0x12f,0x12f,0x12c,0x12c,0x12f,0x12c,0x12c,0x12c,0x12c,0x12f,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x12f,0x12f,0x12c,0x12c,0x12f,0x12c,0x12f,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12f,0x12f,0x12f,0x12c,0x12c,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x1a61,0x186c, +0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f,0x93f, +0x132,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x132, +0x12c,0x12f,0x135,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f, +0x135,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f, 0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f, -0x135,0x132,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x135,0x132,0x12c,0x12f,0x12f,0x12f,0x12f,0x12f, 0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, -0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x135,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x135, 0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, -0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, -0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x132,0x132,0x132, -0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x1a1,0x1a1,0x5f1,0x5f1,0x2fd,0x300,0x31b,0x31b, -0x31b,0x31b,0x31b,0x31b,0x31b,0x31b,0x31b,0x31b,0x19b,0xd5f,0xd5c,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, -0x13d4,0x1029,0x1029,0xcd5,0xcd5,0xc0f,0xcd5,0xcd5,0x1041,0x5f7,0x5f7,0x19e,0xa4d,0x1a7,0x1a7,0x1a7, -0x1a7,0x1a7,0x1a7,0x1a7,0x1a1,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x5b8,0x5b8,0x5b8, -0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b2,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8, -0x5b8,0x5bb,0x5b8,0x5b8,0x5b2,0x5b8,0x5b8,0x5b8,0x5b8,0x5b8,0x1152,0x10c5,0x5fa,0x1a1,0x19e,0x19e, -0x19e,0x5f7,0x5f7,0x5f7,0x5f4,0x5f7,0x5f7,0x5f7,0x5f7,0x19e,0x19e,0x19e,0x19e,0x6d8,0xeee,0x10c5, -0x1a4,0x660,0x663,0x5d6,0x5d6,0x1041,0x1152,0x1152,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5, -0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x1b0,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x99f,0x99f,0xb6d,0xb6d,0x303,0xb70,0x11a0,0x11a0,0x11a0, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, +0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0x135,0x135,0x135,0x135,0x135,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, +0x1a1,0x1a1,0x5fa,0x5fa,0x300,0x303,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e, +0x19b,0xd6b,0xd68,0x10da,0x10da,0x10da,0x10da,0x10da,0x13ec,0x103b,0x103b,0xce1,0xce1,0xc1b,0xce1,0xce1, +0x1053,0x600,0x600,0x19e,0xa56,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a1,0x1a7,0x1a7,0x1a7, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be, +0x5be,0x5b8,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be,0x5c1,0x5be,0x5be,0x5b8,0x5be,0x5be,0x5be, +0x5be,0x5be,0x1164,0x10d7,0x603,0x1a1,0x19e,0x19e,0x19e,0x600,0x600,0x600,0x5fd,0x600,0x600,0x600, +0x600,0x19e,0x19e,0x19e,0x19e,0x6e1,0xf00,0x10d7,0x1a4,0x669,0x66c,0x5dc,0x5dc,0x1053,0x1164,0x1164, +0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, +0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x9a8, +0x9a8,0xb79,0xb79,0x306,0xb7c,0x11b2,0x11b2,0x11b2,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, 0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, -0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, -0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, -0x204,0x204,0x204,0xef7,0xef7,0xef7,0xef7,0xef7,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, +0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, +0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, +0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x204,0x204,0x204,0xf09,0xf09,0xf09,0xf09,0xf09, 0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, -0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4, -0x207,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204, +0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201, +0x201,0x201,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0x207,0x204,0x204,0x204,0x204,0x204,0x204,0x204, 0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204, -0x204,0x204,0x204,0x204,0x25b,0x255,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267, -0x282,0x27c,0x26d,0x267,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x26d,0x267,0x25b,0x255,0x25b,0x255, -0x26d,0x267,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x26d,0x267,0x25b,0x255, -0x25b,0x255,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x26d,0x267, -0x282,0x27c,0x282,0x27c,0x26d,0x267,0x282,0x27c,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267, -0x282,0x27c,0x26d,0x267,0x282,0x27c,0x25b,0x255,0x25b,0x255,0x25b,0x255,0x26d,0x267,0x26d,0x267, -0x26d,0x267,0x26d,0x267,0x26d,0x267,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c, -0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x282,0x27c, -0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x282,0x27c,0x26d,0x267, -0x26d,0x267,0x282,0x27c,0x26d,0x267,0x267,0x267,0x267,0x267,0x270,0x6ea,0xd74,0xd74,0xd8c,0xd74, -0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x3d2,0x276,0x276,0x276,0x276, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x270,0x270,0x270,0x270,0x270,0x270, -0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c, -0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c,0x282,0x27c, -0x282,0x27c,0xd77,0xd74,0xd77,0xd74,0xd77,0xd74,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x1149,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x1146,0x1635,0x1635,0xd95,0x62a,0x28e,0x504,0x510,0x510,0x510,0x510,0x510,0x510,0x510, -0x510,0x510,0x6d2,0x6d2,0x6d2,0x6d2,0x6cc,0x6cc,0x573,0x588,0x588,0x588,0x588,0x585,0x4bf,0x56d, -0x87f,0x87f,0x87f,0x9db,0x9f9,0x9f6,0x897,0x306,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c, -0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x339,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339, -0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x351,0x351, -0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x351, -0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e,0x34e, -0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, -0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, -0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7, -0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7,0x3e7, -0x9c9,0x417,0x40e,0x40b,0x411,0x414,0x405,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408, -0x41a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405, -0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405, -0x405,0x405,0x6c9,0x6c9,0x420,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x459,0x459,0x459,0x459,0x459, -0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x423, -0x441,0x41d,0x447,0x44a,0x444,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x456,0x456,0x456,0x456,0x456, -0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x423, -0x441,0x41d,0x441,0x9cc,0x42c,0x567,0x56a,0x570,0x4b3,0x519,0x59d,0x516,0x5a3,0x5a0,0x5a9,0x5a6, -0x564,0x561,0x564,0x561,0x55e,0x55b,0x504,0x570,0x55e,0x55b,0x55e,0x55b,0x55e,0x55b,0x55e,0x55b, -0x576,0x57c,0x57f,0x579,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, -0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, -0xadd,0xadd,0xc09,0x4b6,0x5d9,0x5d6,0x5d9,0x5d6,0xe73,0xe70,0xe73,0x13ec,0x13e9,0x13ec,0x13e9,0x13ec, -0x13e9,0x13ec,0x14f4,0x14f1,0x4c8,0x4da,0x4da,0x4f8,0x4f8,0x4ce,0x4bc,0x4ce,0x4bc,0x4ce,0x4bc,0x4ce, -0x4bc,0x4ce,0x4bc,0x4ce,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, -0x591,0x591,0x591,0x591,0x591,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xace,0xace,0xace,0xace,0x597, -0x597,0x597,0x597,0x597,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5, -0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5, -0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0x4c5,0xace,0xace,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513, -0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513, -0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x51c,0x51c,0x513,0x51c,0x513,0x51c, -0x51c,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x513,0x51c,0x513,0x51c,0x513,0x51c, -0x51c,0x513,0x513,0x51c,0x51c,0x51c,0x513,0x513,0x513,0x513,0x1215,0x1215,0x9de,0x9de,0x9de,0x9de, -0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51c,0x51f, -0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f, -0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f, -0x51f,0x51c,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c, -0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c, -0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c, -0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51c,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51c,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c, -0x51c,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51c,0x51f,0x51c,0x51f,0x51f,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06, -0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xc06,0xe52,0xe52,0xe52,0xe52, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f,0x51f, -0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528, -0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528,0x528, -0x528,0x528,0x1020,0x1020,0x1020,0x1020,0x1020,0x531,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, +0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x25b,0x255,0x26d,0x267, +0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x285,0x27f,0x26d,0x267,0x26d,0x267,0x285,0x27f, +0x26d,0x267,0x26d,0x267,0x25b,0x255,0x25b,0x255,0x26d,0x267,0x26d,0x267,0x285,0x27f,0x26d,0x267, +0x285,0x27f,0x26d,0x267,0x26d,0x267,0x25b,0x255,0x25b,0x255,0x26d,0x267,0x26d,0x267,0x26d,0x267, +0x26d,0x267,0x285,0x27f,0x26d,0x267,0x26d,0x267,0x285,0x27f,0x285,0x27f,0x26d,0x267,0x285,0x27f, +0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x285,0x27f,0x26d,0x267,0x285,0x27f,0x25b,0x255, +0x25b,0x255,0x25b,0x255,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x285,0x27f, +0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267, +0x26d,0x267,0x26d,0x267,0x26d,0x267,0x285,0x27f,0x26d,0x267,0x26d,0x267,0x26d,0x267,0x26d,0x267, +0x26d,0x267,0x26d,0x267,0x285,0x27f,0x26d,0x267,0x26d,0x267,0x285,0x27f,0x26d,0x267,0x267,0x267, +0x267,0x267,0x273,0x6f3,0xd80,0xd80,0xd98,0xd80,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8, +0x3d8,0x3d8,0x3d8,0x3d8,0x279,0x279,0x279,0x279,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf, +0x3cf,0x3cf,0x273,0x273,0x273,0x273,0x273,0x273,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f, +0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f, +0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0x285,0x27f,0xd83,0xd80,0xd83,0xd80,0xd83,0xd80, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x115b,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1158,0x164a,0x164a,0xda1,0x633,0x291, +0x50a,0x516,0x516,0x516,0x516,0x516,0x516,0x516,0x516,0x516,0x6db,0x6db,0x6db,0x6db,0x6d5,0x6d5, +0x579,0x58e,0x58e,0x58e,0x58e,0x58b,0x4c5,0x573,0x888,0x888,0x888,0x9e4,0xa02,0x9ff,0x8a0,0x309, +0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x342, +0x342,0x342,0x342,0x342,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f, +0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x33f, +0x33f,0x33f,0x33f,0x33f,0x33f,0x33f,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, +0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354, +0x354,0x354,0x354,0x354,0x354,0x354,0x354,0x354,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,0x36c,0x36c,0x36c,0x36c,0x36c,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed, +0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed, +0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x3ed,0x9d2,0x41d,0x414,0x411,0x417,0x41a,0x40b,0x40e, +0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x420,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b, +0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b, +0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x40b,0x6d2,0x6d2,0x426,0x465,0x465,0x465, +0x465,0x465,0x465,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, +0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x429,0x447,0x423,0x44d,0x450,0x44a,0x462,0x462,0x462, +0x462,0x462,0x462,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c, +0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x429,0x447,0x423,0x447,0x9d5,0x432,0x56d,0x570,0x576, +0x4b9,0x51f,0x5a3,0x51c,0x5a9,0x5a6,0x5af,0x5ac,0x56a,0x567,0x56a,0x567,0x564,0x561,0x50a,0x576, +0x564,0x561,0x564,0x561,0x564,0x561,0x564,0x561,0x57c,0x582,0x585,0x57f,0x52b,0x52b,0x52b,0x52b, 0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, -0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52e,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, -0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b, -0x52b,0x52b,0x52b,0x52b,0x537,0x534,0x537,0x53a,0x534,0x537,0x534,0x537,0x534,0x537,0x534,0x534, -0x534,0x534,0x534,0x534,0x537,0x537,0x534,0x537,0x537,0x534,0x537,0x537,0x534,0x537,0x537,0x534, -0x537,0x537,0x534,0x534,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591, -0xace,0xace,0xace,0xace,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543, -0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543,0x543, -0x543,0x543,0x543,0x17b8,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, -0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, -0x546,0x546,0x546,0x546,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x591,0x9f3,0x54f,0x549,0x54f, -0x549,0x54f,0x549,0x54f,0x549,0x54f,0x549,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549, -0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x54c,0x54f, -0x549,0x54c,0x549,0x54c,0x549,0x54c,0x549,0x549,0x549,0x549,0x549,0x549,0x54c,0x54c,0x549,0x54c, -0x54c,0x549,0x54c,0x54c,0x549,0x54c,0x54c,0x549,0x54c,0x54c,0x549,0x549,0x549,0x549,0x549,0x54f, -0x549,0x54f,0x549,0x54f,0x549,0x549,0x549,0x549,0x549,0x549,0x54f,0x549,0x549,0x549,0x549,0x549, -0x54c,0x54f,0x54f,0x54c,0x54c,0x54c,0x54c,0x558,0x58b,0x552,0x555,0x9ea,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,0x1026,0x1026,0x1026,0x1026, -0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xff0,0xace,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, -0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,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,0xace,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594, -0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594, -0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, -0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x717,0x6f3,0x6f3,0x6f3,0x6f3,0x6ed,0x6f3,0x6f3, -0x708,0x6f3,0x6f3,0x702,0x6ff,0x705,0x705,0x705,0x705,0x705,0x708,0x6ed,0x6f9,0x6ed,0x6ed,0x6ed, -0x73e,0x73e,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b, -0x70b,0x70b,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6ed,0x6f0,0x73e,0x6ed,0x73e, -0x6ed,0x741,0x6fc,0x6f6,0x6fc,0x6f6,0x711,0x711,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,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x723,0x723,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x729,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c, -0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c, -0x72c,0x72c,0x72c,0x72c,0x729,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c, -0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x72c, -0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765, -0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x978,0x978,0x978,0x978,0x978, -0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a, -0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a,0x77a, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb67, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x795,0x795,0x795,0x795,0x795,0x795,0x795,0x795, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0xb64,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798, -0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x798,0x8a0,0x8a0,0x8a0,0x8a3,0x8a3,0x8a0,0x8a0,0x8a0, -0x89a,0x89d,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8c4,0x8c4,0x7b9,0x8b5, -0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x8b5,0x7b9,0x7b9,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7fb,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x8ca,0x8ca,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x80d,0x80d, -0x801,0x801,0x801,0x801,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x8a6,0x804,0x804,0x8d0,0x8d0,0xe5b,0xe5b, -0xe5b,0xe5b,0xe8e,0xe8e,0x8a9,0x8a9,0xe5b,0x8a9,0x8a9,0x8a9,0x8ac,0x8a9,0xe5b,0x8a9,0x8a9,0xda7, -0x807,0x8d3,0x8d3,0x8d3,0x8d3,0x80a,0x8d3,0xe8e,0xe8e,0xe8e,0x8d3,0x8d6,0x807,0x906,0xe94,0xdaa, -0xdaa,0xe8e,0xe8e,0xe5b,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, -0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, -0x81c,0x81c,0x81c,0x81c,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, -0x855,0x852,0x858,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0xf12,0xf12,0xf12,0xf12,0xf12, -0xf12,0xf12,0xf12,0xf12,0xf0f,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, -0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, -0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x85e,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,0x85b,0x85b,0x85b,0x85b,0x85b,0x85b,0x876,0x876,0x876,0x876, -0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876,0x876, -0x876,0x876,0x876,0x876,0x1137,0x1137,0x1137,0x180c,0x180c,0x180c,0x180c,0x180c,0x879,0x879,0x879,0x879, -0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879, -0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x879,0x87c,0x87c,0x87c,0x87c, -0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c, -0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x87c,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x885,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, -0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x885, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x885,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x885,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882, -0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882, -0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x885,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x885,0x882,0x885,0x885,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, -0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x885,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882, -0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x885,0x885,0x885,0x885,0x885,0x885, +0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0x52b,0xae6,0xae6,0xc15,0x4bc,0x5df,0x5dc,0x5df,0x5dc, +0xe82,0xe7f,0xe82,0x1404,0x1401,0x1404,0x1401,0x1404,0x1401,0x1404,0x150c,0x1509,0x4ce,0x4e0,0x4e0,0x4fe, +0x4fe,0x4d4,0x4c2,0x4d4,0x4c2,0x4d4,0x4c2,0x4d4,0x4c2,0x4d4,0x4c2,0x4d4,0x597,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x4cb,0x4cb,0x4cb, +0x4cb,0x4cb,0x4cb,0xad7,0xad7,0xad7,0xad7,0x59d,0x59d,0x59d,0x59d,0x59d,0x4cb,0x4cb,0x4cb,0x4cb, +0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, +0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0xad7,0xad7, +0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519, +0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519,0x519, +0x519,0x519,0x522,0x522,0x519,0x522,0x519,0x522,0x522,0x519,0x519,0x519,0x519,0x519,0x519,0x519, +0x519,0x519,0x519,0x522,0x519,0x522,0x519,0x522,0x522,0x519,0x519,0x522,0x522,0x522,0x519,0x519, +0x519,0x519,0x1224,0x1224,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, +0x9e7,0x9e7,0x9e7,0x9e7,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x522,0x522,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x522, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x522,0x525,0x522,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x522,0x522,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x522,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x522,0x522,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x522,0x522,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x522,0x525,0x522,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525, +0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x522,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x522,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x522,0x522,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525,0x525,0x522,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x522,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x522,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x522,0x525,0x522,0x525,0x525,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xe5e,0xe5e,0xe5e,0xe5e,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525, +0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x525,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e, +0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e, +0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x1032,0x1032,0x1032,0x1032,0x1032,0x537, +0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531, +0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531, +0x534,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531, +0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x531,0x53d,0x53a,0x53d,0x540, +0x53a,0x53d,0x53a,0x53d,0x53a,0x53d,0x53a,0x53a,0x53a,0x53a,0x53a,0x53a,0x53d,0x53d,0x53a,0x53d, +0x53d,0x53a,0x53d,0x53d,0x53a,0x53d,0x53d,0x53a,0x53d,0x53d,0x53a,0x53a,0x597,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0xad7,0xad7,0xad7,0xad7,0x549,0x549,0x549,0x549, +0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549, +0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x17d0,0x54c,0x54c,0x54c,0x54c, +0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c, +0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x54c,0x597,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x9fc,0x555,0x54f,0x555,0x54f,0x555,0x54f,0x555,0x54f,0x555,0x54f,0x54f, +0x552,0x54f,0x552,0x54f,0x552,0x54f,0x552,0x54f,0x552,0x54f,0x552,0x54f,0x552,0x54f,0x552,0x54f, +0x552,0x54f,0x552,0x54f,0x552,0x54f,0x552,0x555,0x54f,0x552,0x54f,0x552,0x54f,0x552,0x54f,0x54f, +0x54f,0x54f,0x54f,0x54f,0x552,0x552,0x54f,0x552,0x552,0x54f,0x552,0x552,0x54f,0x552,0x552,0x54f, +0x552,0x552,0x54f,0x54f,0x54f,0x54f,0x54f,0x555,0x54f,0x555,0x54f,0x555,0x54f,0x54f,0x54f,0x54f, +0x54f,0x54f,0x555,0x54f,0x54f,0x54f,0x54f,0x54f,0x552,0x555,0x555,0x552,0x552,0x552,0x552,0x55e, +0x591,0x558,0x55b,0x9f3,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x1038,0x1038,0x1038,0x1038,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002, +0xad7,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0xad7, +0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, +0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, +0x59a,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, +0x720,0x6fc,0x6fc,0x6fc,0x6fc,0x6f6,0x6fc,0x6fc,0x711,0x6fc,0x6fc,0x70b,0x708,0x70e,0x70e,0x70e, +0x70e,0x70e,0x711,0x6f6,0x702,0x6f6,0x6f6,0x6f6,0x747,0x747,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6, +0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6, +0x6f6,0x6f6,0x6f6,0x6f6,0x6f9,0x747,0x6f6,0x747,0x6f6,0x74a,0x705,0x6ff,0x705,0x6ff,0x71a,0x71a, +0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729, +0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729, +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,0x72c,0x72c, +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, +0x732,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735, +0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x732,0x735,0x735,0x735, +0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735, +0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x735,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e, +0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e, +0x76e,0x76e,0x76e,0x981,0x981,0x981,0x981,0x981,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783, +0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783, +0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x783,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1, +0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0xb73,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1, +0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x79e,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0xb70, +0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1, +0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1,0x7a1, +0x8a9,0x8a9,0x8a9,0x8ac,0x8ac,0x8a9,0x8a9,0x8a9,0x8a3,0x8a6,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9, +0x8a9,0x8a9,0x8a9,0x8a9,0x8cd,0x8cd,0x7c2,0x8be,0x8be,0x8be,0x8be,0x8be,0x8be,0x8be,0x7c2,0x7c2, +0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801, +0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801, +0x801,0x801,0x801,0x804,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801, +0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801, +0x801,0x8d3,0x8d3,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801, +0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x879,0x879,0x879,0x879, +0x879,0x879,0x879,0x879,0x879,0x879,0x816,0x816,0x80a,0x80a,0x80a,0x80a,0x8af,0x8af,0x8af,0x8af, +0x8af,0x8af,0x80d,0x80d,0x8d9,0x8d9,0xe67,0xe67,0xe67,0xe67,0xea0,0xea0,0x8b2,0x8b2,0xe67,0x8b2, +0x8b2,0x8b2,0x8b5,0x8b2,0xe67,0x8b2,0x8b2,0xdb3,0x810,0x8dc,0x8dc,0x8dc,0x8dc,0x813,0x8dc,0xea0, +0xea0,0xea0,0x8dc,0x8df,0x810,0x90f,0xea6,0xdb6,0xdb6,0xea0,0xea0,0xe67,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x85e,0x85e,0x85e,0x85e, +0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85b,0x861,0x85e,0x85e,0x85e,0x85e,0x85e, +0x85e,0x85e,0x85e,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf21,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,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e,0x85e, +0x867,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,0x864,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f, +0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x87f,0x1149,0x1149,0x1149,0x1824, +0x1824,0x1824,0x1824,0x1824,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, 0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x885, -0x885,0x885,0x885,0x885,0x885,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x882, -0x882,0x882,0x882,0x882,0x882,0x882,0x885,0x882,0x882,0x882,0x882,0x882,0x882,0x882,0x180f,0x180f, -0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x888,0x888,0x9ed,0x9ed,0x888,0x888,0x888,0x888, -0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x9ed,0x888,0x888,0x888, -0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x888,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, -0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b, +0x882,0x882,0x882,0x882,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885, +0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885,0x885, +0x885,0x885,0x885,0x885,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, 0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, 0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, -0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0, -0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x8a0,0x89d,0x89d,0x8a0, -0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9, +0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88e,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88e, +0x88b,0x88e,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88e,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88e,0x88b,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x88e,0x88b, +0x88b,0x88b,0x88b,0x88b,0x88b,0x88b,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827, +0x891,0x891,0x9f6,0x9f6,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891, +0x891,0x891,0x891,0x891,0x9f6,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891,0x891, +0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894, +0x894,0x894,0x894,0x894,0x894,0x897,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894, +0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894, +0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x894,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9, 0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a9, -0x912,0x912,0x912,0x912,0x912,0x945,0x945,0x94b,0x94b,0x94b,0x90f,0x90f,0x90f,0x948,0x948,0x948, -0x948,0x948,0x948,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x909,0x94b,0x94b,0x94b,0x94b,0x94b, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x912,0x912,0x94b,0x94b,0x94b,0x90f,0x90f,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x94b,0x94b,0x94b,0x94b,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x912,0x912,0x912,0x912,0x912,0x912,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x1467,0x1467,0x91e,0x915,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x915,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x915,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x915,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x915,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x8a9,0x8a9,0x8a9,0x8a9,0x8a9,0x8a6,0x8a6,0x8a9,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2, +0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2, +0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x8b2,0x91b,0x91b,0x91b,0x91b,0x91b,0x94e,0x94e,0x954, +0x954,0x954,0x918,0x918,0x918,0x951,0x951,0x951,0x951,0x951,0x951,0x912,0x912,0x912,0x912,0x912, +0x912,0x912,0x912,0x954,0x954,0x954,0x954,0x954,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x1b36,0x1b36,0xd14,0x918,0x918, +0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x91b,0x91b, +0x954,0x954,0x954,0x918,0x918,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x918,0x918,0x918,0x918, 0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x918,0x918,0x954,0x954,0x954,0x954,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, +0x918,0x918,0x918,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x918,0x918,0x918,0x918,0x918,0x918,0x918, 0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e, -0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, -0x91b,0x91b,0x91b,0x91b,0x91e,0x91e,0x91e,0x91e,0x924,0x924,0x924,0x924,0x924,0x924,0xa4a,0xa4a, +0x918,0x918,0x918,0x918,0x918,0x918,0x147f,0x147f,0x927,0x91e,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,0x91e,0x924,0x924,0x924,0x924,0x924,0x924,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x91e,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x91e,0x924,0x924,0x924,0x924,0x924,0x924, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x91e,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x921,0x921,0x921,0x921, 0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921, -0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0xa47,0xa47,0xaa7,0xaa7,0xaa7,0xaa7, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0x924,0x924,0x924,0x924, +0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x921,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, +0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,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,0x924,0x924,0x924,0x924,0x924,0x924,0x933,0x933,0x933,0x933, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x12c3,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c, +0x927,0x927,0x927,0x927,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0xa53,0xa53,0x92a,0x92a,0x92a,0x92a, +0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a, +0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0xa50,0xa50,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0, +0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, 0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c, -0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93f,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93f,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, -0x93c,0x93c,0x93c,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x18c3,0x18c3,0x942,0x942,0x942,0x942, +0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x12db,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, 0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942, -0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x96c,0x978,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, -0x96c,0x96c,0x96c,0xa2c,0xa32,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, -0xc5d,0xc5d,0xc5d,0xc5d,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0xad4,0xad4, -0xad4,0xad4,0xad4,0xad4,0xa2c,0xa2c,0xb19,0xbfd,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, -0xb19,0xd11,0x1005,0x1005,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb31,0xb2e,0xc5d,0xc5d,0xc5d,0xc5d,0x1182, -0xd2c,0x1182,0x10b6,0x10b6,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x9d2,0x9cf,0x9d2,0x9cf,0x9d2,0x9cf,0xe46,0xe43,0xd32,0xd2f, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x97e,0x97b,0x9d2,0x9cf,0x97e,0x97b,0x97e,0x97b,0x97e,0x97b,0x97e,0x97b,0x97e, -0x97b,0x97e,0x97b,0x97e,0x97b,0x97e,0x97b,0x97e,0x97b,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x97e,0x97b,0x97e,0x97b,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x97e,0x97b,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x984,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x984,0x984,0x984,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x981,0x978,0x978,0x978, -0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, -0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, -0xa2c,0xad4,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xbfd,0xbfd,0xb19,0xb19,0xb19,0xb19, -0xb19,0xb19,0xc5a,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0x1017,0x1017,0x1008, -0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xb19,0xb19, -0xb19,0xb19,0xb19,0xb19,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xe4c,0xe4c,0xd11,0xd11,0xd11, -0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa56,0xa56,0xa56,0xa56,0xa56,0xa44,0xa80,0xa80,0xa80,0xa7a, -0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa7a,0xa80,0xa80,0xa80,0xa80, -0xa5f,0xa5f,0xa7d,0xa7d,0xa7d,0xa7d,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa74,0xb88,0xb88,0xb88,0xb88, -0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb5e,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88, -0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa7a,0xa80, -0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa80,0xa5f,0xa5f,0xa5f, -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,0xa71,0xa71,0xa71,0xa71,0xa71,0xa71, -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, -0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, -0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, -0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, +0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x942,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945, +0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x948,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x948,0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x948,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x948,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948, +0x945,0x945,0x945,0x945,0x945,0x948,0x948,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945, +0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x948,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x948,0x945, +0x945,0x948,0x945,0x945,0x945,0x945,0x948,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945, +0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x945,0x1827, +0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x18db,0x18db,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x975,0x981, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0xa35, +0xa3b,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xc69,0xc69,0xc69,0xc69, +0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0x975,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, +0xa35,0xa35,0xb25,0xc09,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xd1d,0x1017,0x1017, +0xb37,0xb37,0xb37,0xb37,0xb37,0xb3d,0xb3a,0xc69,0xc69,0xc69,0xc69,0x1194,0xd38,0x1194,0x10c8,0x10c8, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x9db,0x9d8,0x9db,0x9d8,0x9db,0x9d8,0xe52,0xe4f,0xd3e,0xd3b,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x987, +0x984,0x9db,0x9d8,0x987,0x984,0x987,0x984,0x987,0x984,0x987,0x984,0x987,0x984,0x987,0x984,0x987, +0x984,0x987,0x984,0x987,0x984,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x987,0x984,0x987,0x984,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x987,0x984,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x98d,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x98d,0x98d,0x98d,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x98a,0x981,0x981,0x981,0x9e7,0x9e7,0x9e7,0x9e7, +0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, +0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0xa35,0xadd,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xc09,0xc09,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xc66,0xd1d, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0x1029,0x1029,0x101a,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xe58,0xe58,0xd1d,0xd1d,0xd1d,0xa7d,0xa7d,0xa7d,0xa7d, +0xa7d,0xa7d,0xa5f,0xa5f,0xa5f,0xa5f,0xa5f,0xa4d,0xa89,0xa89,0xa89,0xa83,0xa89,0xa89,0xa89,0xa89, +0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa83,0xa89,0xa89,0xa89,0xa89,0xa68,0xa68,0xa86,0xa86, +0xa86,0xa86,0xa65,0xa65,0xa65,0xa65,0xa65,0xa7d,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb6a,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xa89,0xa89,0xa89,0xa89, +0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa83,0xa89,0xa89,0xa89,0xa89,0xa89, +0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa68,0xa68,0xa68,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,0xa7d,0xa7d,0xa7d,0xa7d, +0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, +0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xaa7,0xaa7,0xaa7,0xaa7, 0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7, -0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8, -0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8,0xac8, -0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07, -0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07, -0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xc57,0xc57,0xc57,0xc57,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb22,0xbdc,0xd1d,0xd14,0xd29,0xd11,0xb1f,0xb1f,0xd11,0xd11, -0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c, -0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c,0xb4f,0xb4c, -0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, -0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, -0xb79,0xb79,0xb79,0xb79,0xb79,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73, -0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76, +0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xaa7,0xab0,0xab0,0xab0,0xab0, +0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0, +0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xab0,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,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,0xbeb,0xbeb,0xbeb,0xbeb, +0xbeb,0xbeb,0xbeb,0xbeb,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, +0xb1f,0xb1f,0xb1f,0xc63,0xc63,0xc63,0xc63,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xb34,0xb34,0xb34,0xb34, +0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31, +0xb31,0xb31,0xb2e,0xbe8,0xd29,0xd20,0xd35,0xd1d,0xb2b,0xb2b,0xd1d,0xd1d,0xb5b,0xb58,0xb5b,0xb58, +0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58, +0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58,0xb5b,0xb58,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,0xb79,0xb79,0xb79,0xb79,0xb79,0xb79, +0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb76,0xb85,0xb85,0xb85,0xb85, +0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85,0xb85, +0xb85,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,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,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,0xb8e,0xb94,0xb94,0xb94,0xb94, 0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb82, -0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88, -0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb94,0xb94,0xb94,0xb94,0xb94, -0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0x1893, -0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6, -0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0x1890, -0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, -0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, -0xbbb,0xbbb,0xc36,0xbbb,0xbbb,0xbbb,0xc39,0xbbb,0xbbb,0xbbb,0xbbb,0xc36,0xbbb,0xbbb,0xbbb,0xbbb, -0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb, -0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4, -0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4,0xbc4, -0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, -0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca,0xbca, -0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, -0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, -0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, -0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, -0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c, -0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55,0xe55, -0xc3c,0xc3c,0xc15,0xc15,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xe70,0xe70,0xe73,0xe76,0xe70, -0xe67,0xe6a,0xe6a,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d, -0xc4e,0xc4e,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a,0xd7d,0xd7a, -0xd6b,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b, -0xc5d,0xc5d,0xc5d,0xc5a,0xc5a,0xc5a,0xc5a,0xc5a,0xed6,0x112e,0x112e,0x112e,0x112e,0x10ad,0x10ad,0x10ad, -0x1131,0x10b0,0x10b0,0x1131,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1512,0x1512,0x1512,0x1512,0x15c9, -0xc5a,0xc5a,0xc5a,0xc5a,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, -0xc78,0xc75,0xc78,0xc78,0xc78,0xc75,0xc75,0xc78,0xc7b,0xc7e,0xc7b,0xc7e,0xc7b,0xd71,0xd71,0xd71, -0xefa,0xd6b,0xd71,0xd6b,0xc6f,0xc72,0xc6f,0xc75,0xd74,0xd74,0xd74,0xd74,0xd86,0xd89,0xefa,0xefa, -0xc87,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3, -0xcf3,0xcf3,0xcf3,0xcf3,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0xc8a,0x1896,0x1896,0x198c, -0xcea,0xcea,0xcea,0xcea,0xc93,0xc99,0xc9c,0xc99,0xc9c,0xc99,0xc9c,0xcd8,0xcdb,0xc99,0xc9c,0xc99, -0xc99,0xc99,0xc9c,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcf0,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xced, -0xcea,0xced,0xc93,0xc93,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd, -0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd,0xcbd, -0xcbd,0xcbd,0xcbd,0xcbd,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf, -0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf, -0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0xccf,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed, -0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0x12ed,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x1626,0x1626, -0x1650,0x1626,0x18f6,0x1593,0x114c,0x1038,0xce1,0xce1,0xd02,0xd02,0xd02,0xd02,0xe49,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd0e,0xd0b,0xd0b,0xd83,0xd80,0x10da,0x10d4,0x147f, -0x10d1,0x10ce,0x11af,0x11ac,0x12ae,0x12ae,0x12b4,0x12ae,0x12b4,0x12ae,0x12b4,0x12ae,0x12b4,0x12ae,0x12b4,0x12ae, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd11,0xd11,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0x127e,0x127e,0x127e, -0xe4c,0xd11,0xd11,0xd11,0xd11,0x1014,0x1005,0x1005,0x1005,0x1005,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, -0xd23,0xd23,0xd20,0xd17,0xd20,0xd17,0xd20,0xd17,0xd20,0xd17,0xd26,0xd26,0xd26,0xd26,0xd38,0xd35, -0xe3d,0xfdb,0x117c,0x1179,0x1179,0x117c,0x1176,0x1176,0x1176,0x117c,0x117f,0x117f,0x13bf,0x1281,0x1281,0x127e, -0xd1a,0xd1a,0xd1a,0xd1a,0x1017,0x1017,0x1008,0x1008,0x1008,0x1005,0x1005,0x1005,0x1005,0x1008,0x112e,0x1008, -0x1008,0x1008,0x1005,0x1008,0x1017,0x1005,0x1005,0x1005,0x1008,0x1008,0x1005,0x1005,0x1008,0x1005,0x1005,0x1008, -0x10c2,0x10bf,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd53,0xec4, -0xe7c,0xe7c,0xe7c,0xd4d,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0xe82,0xe82,0xd4a,0xd59, -0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50, -0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50,0xd56,0xd50, -0x129f,0x129c,0x129f,0x129c,0x12a2,0x12a2,0x14ee,0x122a,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b, -0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b, -0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd89,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, -0xd6b,0xd71,0xd6b,0xd71,0xd6b,0xd71,0xd71,0xd6b,0xe5b,0xe5b,0xe8e,0xda7,0xdaa,0xe8e,0xe8e,0xdb0, -0xdb0,0xdb0,0xdb0,0xdad,0xdad,0xe91,0xe58,0xdb0,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xda1, -0xda1,0xda1,0xf03,0xf03,0xf00,0x1047,0xd9e,0xd9e,0xe8e,0xe5b,0xda7,0xdb0,0xdb0,0xe58,0xe58,0xda4, -0xda4,0xdad,0xdad,0xdad,0xdad,0xdad,0xe58,0xe58,0xe58,0xe8b,0xe8b,0xe8b,0xe8b,0xe5b,0xe5b,0xe5b, -0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xe5b,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, -0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4, -0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdd4,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda, -0xdda,0xdda,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd, -0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xea0,0xea0,0xea0,0xea0,0xea0,0xea3, -0xea3,0xea3,0xe40,0xde0,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, -0xe28,0xe28,0xe28,0xe28,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xdec,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdfe,0xdf2,0xe04,0xe01,0xdfb,0xdfb,0xdfb,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xba0,0xba0,0xba0,0xba0,0xba0,0xbb5,0xbb5,0xbb5,0xbb5, +0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0x18ab,0xbb2,0xbb2,0xbb2,0xbb2, +0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2, +0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0x18a8,0xbb5,0xbb5,0xbb5,0xbb5, +0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5, +0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbc7,0xbc7,0xc42,0xbc7, +0xbc7,0xbc7,0xc45,0xbc7,0xbc7,0xbc7,0xbc7,0xc42,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7, +0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbd0,0xbd0,0xbd0,0xbd0, +0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, +0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd6,0xbd6,0xbd6,0xbd6, +0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6, +0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbd6,0xbdf,0xbdf,0xbdf,0xbdf, +0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf, +0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xbdf,0xc0f,0xc0f,0xc0f,0xc0f, +0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, +0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc18,0xc18,0xc18,0xc18, +0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xc18,0xe61,0xe61,0xe61,0xe61, +0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xc48,0xc48,0xc21,0xc21, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xe7f,0xe7f,0xe82,0xe85,0xe7f,0xe76,0xe79,0xe79,0xe7c, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xc5a,0xc5a,0xd89,0xd86, +0xd89,0xd86,0xd89,0xd86,0xd89,0xd86,0xd89,0xd86,0xd89,0xd86,0xd89,0xd86,0xd77,0xd77,0xd7d,0xd77, +0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xc69,0xc69,0xc69,0xc66, +0xc66,0xc66,0xc66,0xc66,0xee8,0x1140,0x1140,0x1140,0x1140,0x10bf,0x10bf,0x10bf,0x1143,0x10c2,0x10c2,0x1143, +0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x152a,0x152a,0x152a,0x152a,0x15e1,0xc66,0xc66,0xc66,0xc66, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd38,0xd38,0xd38,0xd38, +0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0xc84,0xc81,0xc84,0xc84, +0xc84,0xc81,0xc81,0xc84,0xc87,0xc8a,0xc87,0xc8a,0xc87,0xd7d,0xd7d,0xd7d,0xf0c,0xd77,0xd7d,0xd77, +0xc7b,0xc7e,0xc7b,0xc81,0xd80,0xd80,0xd80,0xd80,0xd92,0xd95,0xf0c,0xf0c,0xc93,0xc96,0xc96,0xc96, +0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, +0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0xc96,0x18ae,0x18ae,0x19a4,0xcf6,0xcf6,0xcf6,0xcf6, +0xc9f,0xca5,0xca8,0xca5,0xca8,0xca5,0xca8,0xce4,0xce7,0xca5,0xca8,0xca5,0xca5,0xca5,0xca8,0xce4, +0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, +0xce4,0xce4,0xce4,0xce4,0xcfc,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf9,0xcf6,0xcf9,0xc9f,0xc9f, +0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9, +0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9,0xcc9, +0xcdb,0xcdb,0xcdb,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1b00, +0xcd8,0xcd8,0xcd8,0xcd8,0x1302,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, +0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb, +0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb, +0xcdb,0xcdb,0xcdb,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305,0x1305, +0x1305,0x1305,0x1305,0x1305,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb, +0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x13fb,0x1401,0x163b,0x163b,0x1665,0x163b,0x190e,0x15ab, +0x115e,0x104a,0xced,0xced,0xd0e,0xd0e,0xd0e,0xd0e,0xe55,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd7d,0xd77,0xd7d,0xd77, +0xd7d,0xd77,0xd7d,0xd77,0xd1a,0xd17,0xd17,0xd8f,0xd8c,0x10ec,0x10e6,0x1497,0x10e3,0x10e0,0x11c1,0x11be, +0x12c6,0x12c6,0x12cc,0x12c6,0x12cc,0x12c6,0x12cc,0x12c6,0x12cc,0x12c6,0x12cc,0x12c6,0xd38,0xd38,0xd38,0xd38, +0xd38,0xd1d,0xd1d,0xd38,0xd38,0xd38,0xd38,0xd38,0xd38,0x1296,0x1296,0x1296,0xe58,0xd1d,0xd1d,0xd1d, +0xd1d,0x1026,0x1017,0x1017,0x1017,0x1017,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0xd2f,0xd2f,0xd2c,0xd23, +0xd2c,0xd23,0xd2c,0xd23,0xd2c,0xd23,0xd32,0xd32,0xd32,0xd32,0xd44,0xd41,0xe49,0xfed,0x118e,0x118b, +0x118b,0x118e,0x1188,0x1188,0x1188,0x118e,0x1191,0x1191,0x13d7,0x1299,0x1299,0x1296,0xd26,0xd26,0xd26,0xd26, +0x1029,0x1029,0x101a,0x101a,0x101a,0x1017,0x1017,0x1017,0x1017,0x101a,0x1140,0x101a,0x101a,0x101a,0x1017,0x101a, +0x1029,0x1017,0x1017,0x1017,0x101a,0x101a,0x1017,0x1017,0x101a,0x1017,0x1017,0x101a,0x10d4,0x10d1,0xd62,0xd5c, +0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd5f,0xed6,0xe8e,0xe8e,0xe8e,0xd59, +0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0xe94,0xe94,0xd56,0xd65,0xd62,0xd5c,0xd62,0xd5c, +0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c, +0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0xd62,0xd5c,0x12b7,0x12b4,0x12b7,0x12b4, +0x12ba,0x12ba,0x1506,0x123f,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77, +0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77,0xd7d,0xd77, +0xd7d,0xd77,0xd7d,0xd77,0xd95,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd7d,0xd77,0xd7d, +0xd77,0xd7d,0xd7d,0xd77,0xe67,0xe67,0xea0,0xdb3,0xdb6,0xea0,0xea0,0xdbc,0xdbc,0xdbc,0xdbc,0xdb9, +0xdb9,0xea3,0xe64,0xdbc,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xdad,0xf15,0xf15, +0xf12,0x1059,0xdaa,0xdaa,0xea0,0xe67,0xdb3,0xdbc,0xdbc,0xe64,0xe64,0xdb0,0xdb0,0xdb9,0xdb9,0xdb9, +0xdb9,0xdb9,0xe64,0xe64,0xe64,0xe9d,0xe9d,0xe9d,0xe9d,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, +0xe67,0xe67,0xe67,0xe67,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0, +0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0, +0xde0,0xde0,0xde0,0xde0,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde6,0xde9,0xde9, +0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xde9, +0xde9,0xde9,0xde9,0xde9,0xde9,0xde9,0xeb2,0xeb2,0xeb2,0xeb2,0xeb2,0xeb5,0xeb5,0xeb5,0xe4c,0xdec, +0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34, 0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,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,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16, -0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16,0xe16, -0xe19,0xe19,0xe19,0xe1c,0xe19,0xe19,0xe1f,0xe1f,0xe2e,0xe2e,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, -0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, -0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, -0xe2e,0xe2e,0xe2e,0xe2e,0xe61,0xe3a,0xeb8,0xeb8,0xeb8,0xeb8,0xe3a,0xe3a,0xeb8,0xeb8,0xebb,0x1251, -0x1230,0x1230,0xe61,0xe61,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0x11ca,0x121b, -0x121b,0x121b,0x11ca,0x11ca,0xeb8,0xeb8,0xe3a,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,0xe52,0xe52,0xe52,0xe52,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, -0x1218,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, -0x1614,0x1614,0x1614,0x1614,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,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff6, -0xff6,0xff6,0xed3,0x1659,0x111c,0x1002,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c, -0x111c,0x1002,0x111c,0x1002,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044, -0x1044,0x1044,0x1044,0x1044,0x1044,0x1098,0xef1,0xfed,0xef1,0xef1,0xef1,0xef1,0xeeb,0xeeb,0xeeb,0xef1, -0x1476,0x1479,0x166e,0x16fe,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c, -0x102c,0x102c,0x102c,0x102c,0xf0c,0x102c,0x102c,0x102c,0xf09,0xf09,0xf09,0xefd,0xefd,0xefd,0x102c,0xf06, -0x13fb,0x12bd,0x13da,0x13da,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12, -0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12, -0xf12,0xf12,0xf12,0xf12,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, -0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, -0xf1b,0xf1b,0xf1b,0xf1b,0xf21,0xf21,0xf21,0xf1e,0xf1e,0xf1e,0xf1b,0xf1b,0xf1b,0xf1b,0xf1e,0xf1b, -0xf1b,0xf1b,0xf21,0xf1e,0xf21,0xf1e,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, -0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, -0xf1b,0xf21,0xf1e,0xf1e,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b,0xf1b, -0xf1b,0xf1b,0xf1b,0x191a,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1755,0x174f,0x1911,0x1911,0x1911, -0x1914,0x190e,0x1914,0x190e,0x104a,0x104a,0x104a,0xf2d,0xf30,0xf30,0xf30,0xf30,0xf30,0x102f,0x102f,0x102f, -0xf30,0xf30,0xf30,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f, -0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x104d,0xf2d,0xf2d,0x104a,0x104a,0x104a,0x104a,0xf2d,0xf2d, -0x104a,0x104a,0xf2d,0xf2d,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36, -0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36, -0xf36,0xf36,0xf36,0xf36,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035, -0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0xf57, -0xf57,0xf57,0xf57,0xf57,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c, -0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c,0xf6c, -0xf6c,0xf6c,0xf6c,0xf6c,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf78, -0xf75,0xf75,0xf75,0xf75,0xf72,0xf72,0xf72,0x105f,0x105f,0x105f,0x105f,0xf72,0xf72,0x1065,0x1062,0xf6f, -0xf6f,0xf7e,0xf7b,0xf7b,0x105f,0x105f,0xf72,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75, -0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf78,0xf75, -0xf78,0xf75,0xf75,0xf75,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93, -0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0xf93,0x106b,0x106b,0x106e,0x106e,0xf93,0x106b, -0x106b,0x106b,0x106b,0x106b,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f, -0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f, -0xf9f,0xf9f,0xf9f,0xf9f,0x1071,0xf9f,0x1071,0x1071,0x1071,0xfa8,0xfa8,0x1071,0x1071,0xfa8,0xf9f,0xfa8, -0xfa8,0xf9f,0x1071,0x1074,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1, +0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, +0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe0a,0xdfe,0xe10,0xe0d, +0xe07,0xe07,0xe07,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04, +0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04, +0xe04,0xe04,0xe04,0xe04,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,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, +0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe25,0xe25,0xe25,0xe28, +0xe25,0xe25,0xe2b,0xe2b,0xe3a,0xe3a,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,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, +0xe6d,0xe46,0xeca,0xeca,0xeca,0xeca,0xe46,0xe46,0xeca,0xeca,0xecd,0x1266,0x1245,0x1245,0xe70,0xe70, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x11dc,0x122a,0x122a,0x122a,0x11dc,0x11dc, +0xeca,0xeca,0xe46,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d, +0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d,0xe6d, +0xe5e,0xe5e,0xe5e,0xe5e,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x1227,0x14fa,0x14fa,0x14fa, +0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, +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,0xe91,0xe91,0xe91,0xe91, +0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1008,0x1008,0x1008,0xee5,0x1671, +0x112e,0x1014,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x112e,0x1014,0x112e,0x1014, +0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056,0x1056, +0x1056,0x10aa,0xf03,0xfff,0xf03,0xf03,0xf03,0xf03,0xefd,0xefd,0xefd,0xf03,0x148e,0x1491,0x1686,0x1716, +0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e,0x103e, +0xf1e,0x103e,0x103e,0x103e,0xf1b,0xf1b,0xf1b,0xf0f,0xf0f,0xf0f,0x103e,0xf18,0x1413,0x12d5,0x13f2,0x13f2, +0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24, +0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24,0xf24, +0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, +0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, +0xf33,0xf33,0xf33,0xf30,0xf30,0xf30,0xf2d,0xf2d,0xf2d,0xf2d,0xf30,0xf2d,0xf2d,0xf2d,0xf33,0xf30, +0xf33,0xf30,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, +0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf33,0xf30,0xf30, +0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0x1932, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176d,0x1767,0x1929,0x1929,0x1929,0x192c,0x1926,0x192c,0x1926, +0x105c,0x105c,0x105c,0xf3f,0xf42,0xf42,0xf42,0xf42,0xf42,0x1041,0x1041,0x1041,0xf42,0xf42,0xf42,0x1041, +0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041, +0x1041,0x1041,0x1041,0x105f,0xf3f,0xf3f,0x105c,0x105c,0x105c,0x105c,0xf3f,0xf3f,0x105c,0x105c,0xf3f,0xf3f, +0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, +0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, +0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, +0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0xf69,0xf69,0xf69,0xf69,0xf69, +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, +0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf8a,0xf87,0xf87,0xf87,0xf87, +0xf84,0xf84,0xf84,0x1071,0x1071,0x1071,0x1071,0xf84,0xf84,0x1077,0x1074,0xf81,0xf81,0xf90,0xf8d,0xf8d, +0x1071,0x1071,0xf84,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87, +0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf8a,0xf87,0xf8a,0xf87,0xf87,0xf87, +0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5, +0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0xfa5,0x107d,0x107d,0x1080,0x1080,0xfa5,0x107d,0x107d,0x107d,0x107d,0x107d, +0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1, 0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1,0xfb1, -0xfb1,0xfb1,0xfb1,0xfb1,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba, -0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba,0xfba, -0xfba,0xfba,0xfb7,0xfbd,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3, +0x1083,0xfb1,0x1083,0x1083,0x1083,0xfba,0xfba,0x1083,0x1083,0xfba,0xfb1,0xfba,0xfba,0xfb1,0x1083,0x1086, 0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3, -0xfc3,0xfc0,0xfc0,0xfc0,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0xff0,0xff0, -0xff0,0xff0,0x111f,0x1113,0xffc,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x1581, -0x1581,0x1581,0x1581,0x1581,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0x1263, -0x1263,0x17bb,0x17bb,0x17bb,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3,0xff3, -0xff3,0xff3,0xff3,0xff3,0x111c,0x111c,0x1002,0x111c,0x111c,0x111c,0x1002,0x111c,0x111c,0x111c,0xffc,0xffc, -0xffc,0xffc,0xffc,0x1116,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0xfff,0x1119,0x1119,0x1119,0x1119, -0x1119,0x1119,0x1119,0xfff,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1173,0x1173, -0x1728,0x17bb,0x17bb,0x17bb,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0xfff,0x1119,0xfff, -0xfff,0x1119,0x1119,0xfff,0x1008,0x1008,0x10ad,0x1005,0x10ad,0x10ad,0x10ad,0x10ad,0x1005,0x1005,0x1017,0x1005, -0x1005,0x1005,0x1005,0x1005,0x1005,0x1008,0x1017,0x1017,0x1008,0x1017,0x1005,0x1008,0x1008,0x100b,0x1017,0x1005, -0x1005,0x1017,0x1008,0x1008,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, -0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, -0x101d,0x101d,0x101d,0x101d,0x101d,0x18c3,0x18c3,0x18c3,0x18c3,0x193b,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, -0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, -0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, -0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1, -0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1,0x10a1, -0x18fc,0x18fc,0x18fc,0x1a34,0x1a34,0x1a34,0x1a34,0x18fc,0x18fc,0x18fc,0x18fc,0x18fc,0x10d1,0x10ce,0x10d1,0x10ce, -0x10d1,0x10ce,0x10d1,0x10ce,0x10d1,0x10ce,0x11b2,0x12b4,0x12b4,0x12b4,0x152a,0x167d,0x12b4,0x12b4,0x1482,0x1482, -0x1482,0x147c,0x1482,0x147c,0x1683,0x1680,0x173a,0x1737,0x173a,0x1737,0x173a,0x1737,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10fe,0x1167,0x10fe,0x1104, -0x1104,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,0x1167,0x1167,0x1167,0x1167, -0x1167,0x1167,0x1167,0x1167,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,0x1110,0x1110,0x1110,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1122,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125, -0x1122,0x1125,0x1125,0x1125,0x1122,0x1125,0x1122,0x1125,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125,0x1128,0x1125, -0x1125,0x1125,0x1125,0x1122,0x1125,0x1122,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1125,0x1125,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1122,0x1122,0x1122,0x1122,0x1122, -0x1122,0x1122,0x1122,0x1122,0x1122,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1266,0x1266, -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, -0x1125,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x14dc,0x14dc,0x14dc, -0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,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,0x1269,0x14dc,0x14dc,0x1125,0x1125,0x1125,0x1125,0x1125,0x1128,0x1125,0x1125, -0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1266,0x1266,0x1269,0x1269,0x1125,0x1125,0x1128,0x1128,0x1128,0x13ce,0x1125,0x1128, -0x1125,0x1125,0x1128,0x1278,0x1278,0x1269,0x1269,0x14dc,0x14dc,0x14dc,0x14dc,0x14dc,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269,0x1269,0x13ce,0x1269,0x1269,0x1269, -0x14dc,0x14dc,0x14dc,0x150c,0x150c,0x150c,0x150c,0x150c,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,0x1269,0x1125,0x1269,0x1128,0x1128,0x1125,0x1125,0x1128,0x1128, -0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128, -0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1128,0x1125,0x1125,0x1125, -0x1128,0x1125,0x1125,0x1125,0x1125,0x1128,0x1128,0x1128,0x1125,0x1128,0x1128,0x1128,0x1125,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1125,0x1128,0x1125,0x1128,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, -0x13ce,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269,0x14dc,0x1170,0x1170,0x1170,0x1170,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1269,0x14dc,0x14dc,0x14dc,0x14dc,0x1464,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1278,0x1278,0x1269,0x1269,0x1269,0x1269,0x1587,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1269,0x1125,0x1125,0x1125,0x1125,0x1125,0x1212,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1212,0x1125,0x1125, -0x1125,0x1212,0x1125,0x1212,0x1125,0x1212,0x1125,0x1212,0x1125,0x1125,0x1125,0x1212,0x1125,0x1125,0x1125,0x1125, -0x1125,0x1125,0x1212,0x1212,0x1125,0x1125,0x1125,0x1125,0x1212,0x1125,0x1212,0x1212,0x1125,0x1125,0x1125,0x1125, -0x1212,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x13ce,0x13ce,0x14dc, -0x14dc,0x1128,0x1128,0x1128,0x1125,0x1125,0x1125,0x1128,0x1128,0x1128,0x1128,0x1128,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1125,0x1125,0x1125,0x1128, -0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125, -0x1128,0x1128,0x1128,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x1125,0x113a,0x113a,0x113a,0x113a, -0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, -0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x1140,0x113d,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,0x118b,0x1293,0x118b,0x118b, -0x118b,0x118b,0x118b,0x118b,0x118b,0x118b,0x1188,0x1188,0x1188,0x1290,0x1290,0x1290,0x1290,0x1290,0x1293,0x146d, -0x146d,0x1857,0x151b,0x151b,0x151b,0x151b,0x151b,0x151e,0x151e,0x151e,0x17ca,0x17ca,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x1758,0x11c1,0x11c1,0x11c1,0x11c1, -0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1, -0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x11c1,0x1242,0x11f4,0x11f7,0x11f7, -0x11f4,0x11fa,0x11fa,0x11e8,0x11eb,0x14fd,0x1500,0x1500,0x1500,0x1365,0x17df,0x182a,0x11ee,0x11ee,0x11ee,0x11ee, -0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x11ee,0x1362,0x14a6,0x14a9,0x14a3,0x14ac,0x14ac,0x123f,0x123f,0x11f1,0x11f4, -0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4, -0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f1, -0x11f1,0x11f1,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x11f1,0x1209,0x1209,0x1209,0x1209, -0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, -0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1236,0x1236,0x1236,0x1221, -0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221, -0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1596,0x1596,0x1518,0x14eb, -0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1227,0x1227,0x1227,0x1227, -0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x13ef,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1269,0x1269,0x1269,0x1269,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1275,0x1275,0x1275,0x126c,0x126c,0x126c,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1278,0x1269,0x1269,0x1269,0x1269,0x13d1,0x13d1,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1584,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae, -0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x12ae,0x127b, -0x12b7,0x12b7,0x12b7,0x12b7,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, -0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1a3d,0x17c4,0x127e,0x127e,0x127e,0x127e, +0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3, +0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc, +0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfc9,0xfcf, +0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5, +0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xfd2,0xfd2,0xfd2, +0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x1002,0x1002,0x1002,0x1002,0x1131,0x1125, +0x100e,0x1131,0x1131,0x1131,0x1131,0x1131,0x1131,0x1131,0x1131,0x1131,0x1131,0x1599,0x1599,0x1599,0x1599,0x1599, +0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x127b,0x127b,0x17d3,0x17d3,0x17d3, +0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005, +0x112e,0x112e,0x1014,0x112e,0x112e,0x112e,0x1014,0x112e,0x112e,0x112e,0x100e,0x100e,0x100e,0x100e,0x100e,0x1128, +0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x1011,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x1011, +0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x1185,0x1185,0x1740,0x17d3,0x17d3,0x17d3, +0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x112b,0x1011,0x112b,0x1011,0x1011,0x112b,0x112b,0x1011, +0x101a,0x101a,0x10bf,0x1017,0x10bf,0x10bf,0x10bf,0x10bf,0x1017,0x1017,0x1029,0x1017,0x1017,0x1017,0x1017,0x1017, +0x1017,0x101a,0x1029,0x1029,0x101a,0x1029,0x1017,0x101a,0x101a,0x101d,0x1029,0x1017,0x1017,0x1029,0x101a,0x101a, +0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f, +0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f, +0x102f,0x18db,0x18db,0x18db,0x18db,0x1953,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1044,0x1044,0x1044,0x1044, +0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044, +0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x10b3,0x10b3,0x10b3,0x10b3, +0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3, +0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x1914,0x1914,0x1914,0x1a4f, +0x1a4f,0x1a4f,0x1a4f,0x1914,0x1914,0x1914,0x1914,0x1914,0x10e3,0x10e0,0x10e3,0x10e0,0x10e3,0x10e0,0x10e3,0x10e0, +0x10e3,0x10e0,0x11c4,0x12cc,0x12cc,0x12cc,0x1542,0x1695,0x12cc,0x12cc,0x149a,0x149a,0x149a,0x1494,0x149a,0x1494, +0x169b,0x1698,0x1752,0x174f,0x1752,0x174f,0x1752,0x174f,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104, +0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104, +0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1104,0x1110,0x1179,0x1110,0x1116,0x1116,0x1113,0x1113,0x1113, +0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113, +0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1179,0x1179,0x1179,0x1179,0x1179,0x1179,0x1179,0x1179, +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,0x1122,0x1122,0x1122,0x1122,0x1122, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1134,0x1134,0x1137,0x1137,0x1137,0x1137,0x1137,0x1134,0x1137,0x1137,0x1137, +0x1134,0x1137,0x1134,0x1137,0x1134,0x1137,0x1137,0x1137,0x1137,0x1137,0x113a,0x1137,0x1137,0x1137,0x1137,0x1134, +0x1137,0x1134,0x1134,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134, +0x1134,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1134,0x1134, +0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x1134,0x127e,0x127e,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1281,0x1281,0x1281, +0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x14f4,0x14f4,0x14f4,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1281,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1281,0x14f4,0x14f4,0x1137,0x1137,0x1137,0x1137,0x1137,0x113a,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +0x127e,0x127e,0x1281,0x1281,0x1137,0x1137,0x113a,0x113a,0x113a,0x13e6,0x1137,0x113a,0x1137,0x1137,0x113a,0x1290, +0x1290,0x1281,0x1281,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +0x1281,0x1281,0x1281,0x1281,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1281,0x1281,0x1281,0x13e6,0x1281,0x1281,0x1281,0x14f4,0x14f4,0x14f4,0x1524, +0x1524,0x1524,0x1524,0x1524,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1281,0x1137,0x1281,0x113a,0x113a,0x1137,0x1137,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, +0x113a,0x113a,0x113a,0x113a,0x113a,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a, +0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x113a,0x1137,0x1137,0x1137,0x113a,0x1137,0x1137,0x1137, +0x1137,0x113a,0x113a,0x113a,0x1137,0x113a,0x113a,0x113a,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x113a, +0x1137,0x113a,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x13e6,0x1137,0x1137,0x1137, +0x1137,0x1281,0x1281,0x14f4,0x1182,0x1182,0x1182,0x1182,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1281,0x14f4, +0x14f4,0x14f4,0x14f4,0x147c,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +0x1290,0x1290,0x1281,0x1281,0x1281,0x1281,0x159f,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x1281,0x1137,0x1137,0x1137,0x1137,0x1137,0x1221,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1221,0x1137,0x1137,0x1137,0x1221,0x1137,0x1221, +0x1137,0x1221,0x1137,0x1221,0x1137,0x1137,0x1137,0x1221,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1221,0x1221, +0x1137,0x1137,0x1137,0x1137,0x1221,0x1137,0x1221,0x1221,0x1137,0x1137,0x1137,0x1137,0x1221,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x13e6,0x13e6,0x14f4,0x14f4,0x113a,0x113a,0x113a, +0x1137,0x1137,0x1137,0x113a,0x113a,0x113a,0x113a,0x113a,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1137,0x1137,0x1137,0x113a,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x113a,0x113a,0x113a,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, +0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, +0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x1152,0x114f,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x119d,0x12ab,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d, +0x119d,0x119d,0x119a,0x119a,0x119a,0x12a8,0x12a8,0x12a8,0x12a8,0x12a8,0x12ab,0x1485,0x1485,0x186f,0x1533,0x1533, +0x1533,0x1533,0x1533,0x1536,0x1536,0x1536,0x17e2,0x17e2,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd, +0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd, +0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11cd,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0, +0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0, +0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x1770,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,0x11d3,0x1257,0x1206,0x1209,0x1209,0x1206,0x120c,0x120c,0x11fa, +0x11fd,0x1515,0x1518,0x1518,0x1518,0x137d,0x17f7,0x1842,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, +0x1200,0x1200,0x137a,0x14be,0x14c1,0x14bb,0x14c4,0x14c4,0x1254,0x1254,0x1203,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,0x1206,0x1203,0x1203,0x1203,0x1254,0x1254, +0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x1203,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, +0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, +0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x124b,0x124b,0x124b,0x1230,0x1230,0x1230,0x1230,0x1230, +0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230, +0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x1230,0x15ae,0x15ae,0x1530,0x1503,0x1239,0x1239,0x1239,0x1239, +0x1239,0x1239,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1236,0x1236,0x1236,0x1236,0x1239,0x1239,0x1239,0x1239, +0x123c,0x1239,0x1239,0x123c,0x1239,0x1239,0x1239,0x1407,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x1281,0x1281,0x1281,0x1281,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, +0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x128d,0x128d, +0x128d,0x1284,0x1284,0x1284,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, 0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, -0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x1662,0x1662,0x1662,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, -0x127e,0x127e,0x127e,0x127e,0x127e,0x172b,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x15c9,0x1662, -0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x12db,0x12db,0x12db,0x12db, -0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x1404,0x1404,0x1404,0x1404, -0x1404,0x1404,0x1404,0x12e1,0x12e1,0x12d5,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12d2,0x12db,0x12db,0x12db,0x12db, -0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db, -0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12f9,0x12f9,0x12f9,0x12f9, -0x12f9,0x12f9,0x12f9,0x12f9,0x12f0,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9, -0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x12f9,0x130e,0x130e,0x130e,0x130e, -0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e, -0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x130e,0x1314,0x1314,0x1314,0x1314, -0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314, -0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x132c,0x132c,0x132c,0x132c, +0x127e,0x127e,0x127e,0x127e,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +0x1281,0x1281,0x1281,0x1281,0x1290,0x1281,0x1281,0x1281,0x1281,0x13e9,0x13e9,0x1281,0x1281,0x1281,0x1281,0x1281, +0x1281,0x1281,0x1281,0x1281,0x159c,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +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,0x1293,0x12cf,0x12cf,0x12cf,0x12cf, +0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296, +0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1a58,0x17dc,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296, +0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296, +0x1296,0x1296,0x167a,0x167a,0x167a,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296, +0x1296,0x1743,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x15e1,0x167a,0x167a,0x167a,0x167a,0x167a, +0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3, +0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x141c,0x141c,0x141c,0x141c,0x141c,0x141c,0x141c,0x12f9, +0x12f9,0x12ed,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12ea,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3, +0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3, +0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc, +0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc, +0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x12fc,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311, +0x1308,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311, +0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1311,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326, +0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326, +0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x1326,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c, 0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c, -0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x1332,0x1332,0x1332,0x1332, -0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, -0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x132f,0x132f,0x132f,0x133e,0x133e,0x133e,0x133e, -0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e,0x133e, -0x133e,0x133e,0x133e,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x1347,0x1347,0x1347,0x1347, -0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347, -0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1422,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1356,0x1356,0x1356,0x1356, -0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356, -0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1371,0x1371,0x1371,0x1371, -0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x136e,0x136e,0x136e,0x142b,0x142b,0x142b,0x136e,0x136e, -0x142b,0x1434,0x142e,0x1431,0x1374,0x1374,0x136b,0x1374,0x1374,0x1368,0x15a2,0x191d,0x1383,0x1383,0x1383,0x1383, -0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1437,0x137d,0x137d,0x1437, -0x1437,0x1437,0x1437,0x1437,0x1437,0x137d,0x1437,0x1380,0x1380,0x1437,0x1380,0x1437,0x1383,0x1383,0x1383,0x1383, -0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383, -0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,0x1383,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,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x139e,0x139e,0x139e,0x139e, -0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139b,0x139b,0x139b,0x1443, -0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x139b,0x139b,0x1443,0x139b,0x1446,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,0x13b6,0x13b6,0x13b6,0x13b6, +0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x132c,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344, +0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344, +0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a, +0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a, +0x134a,0x134a,0x134a,0x134a,0x134a,0x1347,0x1347,0x1347,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356, +0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356,0x1353, +0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f, +0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f, +0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f,0x143a,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,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,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x136e,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1389,0x1386,0x1386,0x1386,0x1443,0x1443,0x1443,0x1386,0x1386,0x1443,0x144c,0x1446,0x1449, +0x138c,0x138c,0x1383,0x138c,0x138c,0x1380,0x15ba,0x1935,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b, +0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x144f,0x1395,0x1395,0x144f,0x144f,0x144f,0x144f,0x144f, +0x144f,0x1395,0x144f,0x1398,0x1398,0x144f,0x1398,0x144f,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,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6, +0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b3,0x13b3,0x13b3,0x145b,0x145b,0x145b,0x145b,0x145b, +0x145b,0x145b,0x145b,0x13b3,0x13b3,0x145b,0x13b3,0x145e,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6, 0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6, -0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x1662,0x1662,0x1662,0x1662, -0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x146a,0x146a,0x146a,0x146a,0x1662,0x1662,0x1662,0x1662, -0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x172b,0x1470,0x1470,0x1470,0x1470, -0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, -0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x148b,0x148b,0x148b,0x148b, -0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, -0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148e,0x148e,0x148e,0x148e, -0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, -0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,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,0x1494,0x1494,0x1494,0x1494, -0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494, -0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x1494,0x1494,0x1494,0x1494,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x14f7,0x1494,0x1494, -0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, -0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0, -0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14a0,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af, -0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af, -0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14b5,0x14b2,0x14af,0x14af,0x14af,0x14af, -0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x1809,0x1791,0x1791,0x1794,0x14dc,0x14dc,0x14dc,0x14dc, -0x14dc,0x14dc,0x14dc,0x14dc,0x14df,0x1587,0x1587,0x1587,0x1587,0x1587,0x1587,0x160e,0x14dc,0x14dc,0x14dc,0x14dc, -0x14dc,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x160b,0x160b, -0x160b,0x160b,0x160b,0x160b,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x14dc,0x16e3,0x16e3,0x1791, -0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1806,0x18bd,0x1794,0x1794,0x1794,0x160b,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160b,0x160b,0x14e2,0x14e2,0x14e2,0x14e2, -0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2, -0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14e2,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x1584,0x1584,0x1584,0x1584, -0x1584,0x1584,0x1587,0x1584,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x1587,0x160e,0x160e,0x1587, -0x1587,0x1587,0x1587,0x1587,0x1587,0x1587,0x1584,0x150f,0x1587,0x1587,0x1587,0x1791,0x1584,0x1584,0x1584,0x1584, -0x1584,0x1584,0x150f,0x1584,0x1584,0x1584,0x1584,0x1584,0x160b,0x16e3,0x16e3,0x16e3,0x1584,0x1584,0x1584,0x1584, -0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x1584,0x160b,0x153f,0x153f,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,0x153c,0x153c,0x153c,0x153c,0x153c,0x153f,0x153f,0x153f,0x153f, -0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f, -0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x153f,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572, -0x1572,0x156f,0x156f,0x156f,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x158d,0x158d,0x158d,0x158d, -0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d, -0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x16ef,0x16ef,0x16ef, -0x16ef,0x16ef,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88, -0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d,0x158d, -0x158d,0x158d,0x158d,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812, -0x17ca,0x17ca,0x17ca,0x17c7,0x17c7,0x17c7,0x17c7,0x17ca,0x185d,0x1860,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, -0x18db,0x18db,0x18db,0x16f8,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599,0x1599, -0x1620,0x1620,0x1620,0x1620,0x1767,0x1767,0x15f0,0x15f0,0x15f0,0x15f0,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, -0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x15ed,0x1644,0x1653,0x15e4,0x15f3,0x15f3,0x1698,0x15e7,0x15e7, -0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, -0x1623,0x1623,0x1623,0x1647,0x164d,0x164a,0x164a,0x164a,0x164a,0x15ff,0x1602,0x164a,0x164a,0x164a,0x164a,0x15fc, -0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x16e3,0x16e3,0x16e3,0x16e3, -0x16e3,0x1791,0x1806,0x16e3,0x16e3,0x16e3,0x16e3,0x1809,0x1806,0x18bd,0x16e3,0x1791,0x16e3,0x16e3,0x16e3,0x16e3, -0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce, +0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce, +0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f,0x147f, +0x147f,0x185d,0x185d,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe, +0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x1abe,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a, +0x167a,0x167a,0x167a,0x167a,0x1482,0x1482,0x1482,0x1482,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a, +0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x1743,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488, +0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488, +0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x1488,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3, +0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3, +0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a3,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6, +0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6, +0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9, +0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9, +0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14a9,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac, +0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac, +0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f, +0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x14ac, +0x14ac,0x14ac,0x14ac,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f, +0x150f,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x150f,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac, +0x14ac,0x14ac,0x14ac,0x14ac,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,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7, +0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7, +0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14cd,0x14ca,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7, +0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8, +0x15d8,0x15d8,0x15d8,0x15d8,0x1821,0x17a9,0x17a9,0x17ac,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4, +0x14f7,0x159f,0x159f,0x159f,0x159f,0x159f,0x159f,0x1623,0x14f4,0x14f4,0x14f4,0x14f4,0x14f4,0x159c,0x159c,0x159c, +0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, +0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x14f4,0x16fb,0x16fb,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, +0x17a9,0x17a9,0x17a9,0x181e,0x18d5,0x17ac,0x17ac,0x17ac,0x1620,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, +0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1620,0x1620,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, +0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa, +0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x14fa,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f, +0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f, +0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x150f,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159f,0x159c, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x159f,0x1623,0x1623,0x159f,0x159f,0x159f,0x159f,0x159f, +0x159f,0x159f,0x159c,0x1527,0x159f,0x159f,0x159f,0x17a9,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x1527,0x159c, +0x159c,0x159c,0x159c,0x159c,0x1620,0x16fb,0x16fb,0x16fb,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c, +0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x1620,0x1557,0x1557,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554, +0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554, +0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,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,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a, +0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x1587,0x1587,0x1587, +0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x15cf,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a, +0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a, +0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,0x158a,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,0x15a5,0x1707,0x1707,0x1707,0x1707,0x1707,0x17bb,0x17bb, +0x17bb,0x17bb,0x17bb,0x17bb,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x15a5,0x15a5,0x15a5,0x15a5, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x182a, +0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x17e2,0x17e2,0x17e2,0x17df, +0x17df,0x17df,0x17df,0x17e2,0x1875,0x1878,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x18f3,0x1710, +0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x15b1,0x1635,0x1635,0x1635,0x1635, +0x177f,0x177f,0x1608,0x1608,0x1608,0x1608,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, +0x1656,0x1656,0x1656,0x1605,0x1659,0x1668,0x15fc,0x160b,0x160b,0x16b0,0x15ff,0x15ff,0x1638,0x1638,0x1638,0x1638, +0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x165c, +0x1662,0x165f,0x165f,0x165f,0x165f,0x1617,0x166e,0x165f,0x165f,0x165f,0x165f,0x1614,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x17a9,0x181e,0x16fb, +0x16fb,0x16fb,0x16fb,0x1821,0x181e,0x18d5,0x16fb,0x17a9,0x16fb,0x16fb,0x16fb,0x16fb,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb, +0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x1629,0x1629,0x1629,0x1629, +0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1704,0x1704,0x1704,0x1704,0x1704,0x1827,0x1827,0x1827,0x1827, +0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x18db,0x18db,0x18db,0x1629,0x1629,0x1629,0x1629, +0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, +0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x18de, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, +0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, +0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635,0x1635, +0x1638,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x1638,0x1638,0x1638,0x1638,0x1638, +0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638,0x1638, +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,0x1671,0x1671,0x1671, +0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +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, +0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, 0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, -0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x16ec,0x16ec,0x16ec,0x16ec,0x16ec, -0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x18c3,0x18c3,0x18c3, -0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, -0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,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, -0x1617,0x1617,0x1617,0x18c6,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,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,0x1623,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x1623, -0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623,0x1623, -0x1623,0x1623,0x1623,0x1623,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, -0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659,0x1659, -0x1659,0x1659,0x1659,0x1659,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, -0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, -0x16a1,0x16a1,0x16a1,0x16a1,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf, -0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf, -0x16bf,0x16bf,0x16bf,0x16bf,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,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd, -0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd, -0x16dd,0x16da,0x16da,0x16da,0x16e3,0x16e3,0x16e3,0x1806,0x1806,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1806, -0x1806,0x1806,0x1791,0x1791,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e6,0x16e6,0x16e3,0x16e6,0x16e6,0x1791,0x1794, -0x1791,0x1791,0x1791,0x1791,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, -0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, -0x1725,0x1725,0x1725,0x1725,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x1743,0x1743,0x1743,0x1743,0x178e,0x178e,0x1743,0x178e,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x1743,0x1749,0x1749,0x1749,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773, -0x1773,0x1773,0x1773,0x1773,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788, -0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788, -0x1788,0x1788,0x1788,0x1788,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb, -0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb, -0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, -0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1806,0x1806,0x1806,0x1806, -0x1806,0x1806,0x1806,0x1806,0x1806,0x18bd,0x18bd,0x18bd,0x18bd,0x1935,0x1935,0x1935,0x1806,0x1806,0x1806,0x1806, -0x1806,0x1806,0x1806,0x18bd,0x18bd,0x18bd,0x18bd,0x1935,0x1935,0x1935,0x19f2,0x1935,0x180f,0x180f,0x180f,0x180f, -0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, -0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,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,0x1845,0x1845,0x1845,0x1845, -0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845, -0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x1845,0x18a5,0x18a5,0x18a5,0x18a5, -0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5, -0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18a5,0x18b1,0x18b1,0x18b1,0x18b1, -0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1, -0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18b1,0x18d5,0x18d5,0x18d5,0x18d5, -0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5, -0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x1902,0x1902,0x1902,0x1902, -0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x1902,0x18ff,0x18ff,0x18ff, -0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x18ff,0x193b,0x193b,0x193b,0x193b, -0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b, -0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x193b,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965, -0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x1965,0x196e,0x196e,0x196e,0x196e, -0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e, -0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x196e,0x1971,0x1971, -0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x1971,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f, -0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f, -0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x198f,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998,0x1998, -0x1998,0x1998,0x199e,0x199e,0x199e,0x199e,0x19a7,0x199e,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1, -0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19a1,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0, -0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0, -0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x1a13,0x1a13,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9, -0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9, -0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,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,0x19dd,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da, -0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x19da,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, -0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85, -0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a85,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88, -0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88, -0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0x1a88,0,0,0,0 +0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, +0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f2,0x16f2,0x16f2, +0x16fb,0x16fb,0x16fb,0x181e,0x181e,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x181e,0x181e,0x181e,0x17a9,0x17a9, +0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fe,0x16fe,0x16fb,0x16fe,0x16fe,0x17a9,0x17ac,0x17a9,0x17a9,0x17a9,0x17a9, +0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, +0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b, +0x17a6,0x17a6,0x175b,0x17a6,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x1761,0x1761,0x1761, +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,0x178b,0x178b,0x178b,0x178b,0x178b,0x178b, +0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0, +0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0, +0x17a9,0x17a9,0x17a9,0x181e,0x181e,0x181e,0x181e,0x194d,0x194d,0x1a0a,0x1a97,0x1b09,0x1b09,0x1b09,0x1a97,0x1a0a, +0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3, +0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3, +0x17d3,0x17d3,0x17d3,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986, +0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b, +0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b, +0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x181e,0x18d5,0x18d5,0x18d5,0x18d5,0x194d,0x194d,0x194d,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x18d5, +0x18d5,0x18d5,0x18d5,0x194d,0x194d,0x194d,0x1a0a,0x194d,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827, +0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827, +0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x1827,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, +0x182a,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3, +0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1b21,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,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x1836,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0,0x18f0, +0x18f0,0x18f0,0x18f0,0x18f0,0x18ea,0x18ea,0x18ea,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6, +0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1aa6,0x1b39,0x1b39,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d, +0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d, +0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, +0x188d,0x188d,0x1890,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d, +0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x188d,0x1ae2,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd, +0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd, +0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,0x18bd,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,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, +0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed, +0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x18ed,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a, +0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x191a,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917, +0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1917,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1923,0x1923,0x1923, +0x1923,0x1923,0x1923,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2, +0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953, +0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953, +0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x1953,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d, +0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d, +0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x197d,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986, +0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986, +0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1986,0x1989,0x1989,0x1989,0x1989,0x1989,0x1989, +0x1989,0x1989,0x1989,0x1989,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7, +0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7,0x19a7, +0x19a7,0x19a7,0x19a7,0x19a7,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b0,0x19b6,0x19b6, +0x19b6,0x19b6,0x19bf,0x19b6,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9,0x19b9, +0x19b9,0x19b9,0x19b9,0x19b9,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,0x19c8,0x1a2e,0x1a2e,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1, +0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1,0x19d1, +0x19d1,0x19d1,0x19d1,0x19d1,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef, +0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef,0x19ef, +0x19ef,0x19ef,0x19ef,0x19ef,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f5,0x19f2,0x19f2, +0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2,0x19f2, +0x19f2,0x19f2,0x19f2,0x19f2,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0, +0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa0, +0x1aa0,0x1aa0,0x1aa0,0x1aa0,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3, +0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1aa3, +0x1aa3,0x1aa3,0x1aa3,0x1aa3,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8, +0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1ab8, +0x1ab8,0x1ab8,0x1ab8,0x1ab8,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd, +0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1adc,0x1adc,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd,0x1afd, +0x1afd,0x1afd,0x1afd,0x1afd,0x1ae5,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae5,0x1ae2,0x1ae5,0x1ae2, +0x1ae2,0x1ae5,0x1ae2,0x1ae2,0x1ae2,0x1ae5,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1ae2,0x1af1,0x1af1, +0x1af1,0x1af1,0x1af1,0x1af1,0x1af1,0x1af1,0x1af1,0x1ae2,0x1aee,0x1ae8,0x1aee,0x1ae8,0x1aee,0x1ae8,0x1aee,0x1ae8, +0x1ae8,0x1ae8,0x1aee,0x1ae8,0x1aee,0x1ae8,0x1aee,0x1ae8,0x1aee,0x1ae8,0x1aee,0x1ae8,0x1aee,0x1ae8,0x1aee,0x1ae8, +0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b06,0x1b06,0x1b00,0x1b00, +0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06, +0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b00,0x1b00,0x1b00,0x1b00, +0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00, +0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b00,0x1b06,0x1b06,0x1b06,0x1b06, +0x1b06,0x1b06,0x1b06,0x1b06,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03, +0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03,0x1b03, +0x1b03,0x1b03,0x1b03,0x1b03,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06, +0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06,0x1b06, +0x1b06,0x1b06,0x1b06,0x1b06,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e, +0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b1e, +0x1b1e,0x1b1e,0x1b1e,0x1b1e,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27, +0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27,0x1b27, +0x1b27,0x1b27,0x1b27,0x1b27,0,0,0,0 }; static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index, - propsVectorsTrie_index+5924, + propsVectorsTrie_index+6044, nullptr, - 5924, - 37208, + 6044, + 37820, 0xa40, - 0x17a4, + 0x181c, 0x0, 0x0, 0x110000, - 0xa878, + 0xab54, nullptr, 0, false, false, 0, nullptr }; -static const uint32_t propsVectors[6813]={ +static const uint32_t propsVectors[6996]={ 0x67,0,0,0x67,0,0xe00000,0x67,0,0x1600000,0x67,0x80000,0x20,0x67,0x20000000,0,0x5067, 0,0xe00000,0x5000000,0,0x900020,0x5000000,0x80000,0xc4918820,0x5000000,0x80000,0xc5c18020,0x5000000,0x80000,0xc5e18820,0x5000000,0x180000, 0xc0918820,0x5000000,0x4000000,0x4100000,0x5000000,0x4000000,0x4200000,0x5000000,0x4000000,0x5500000,0x5000000,0x4000000,0x5600000,0x5000000,0x4000000,0xc200000, @@ -4258,12 +4344,12 @@ static const uint32_t propsVectors[6813]={ 0x4000000,0xc820000f,0x5000000,0x4000000,0xc9600002,0x5000000,0x4000001,0xc8445801,0x5000000,0x4000001,0xc8445802,0x5000000,0x4000001,0xc8c4000b,0x5000000,0x4000010, 0xc9071401,0x5000000,0x4000020,0x4200000,0x5000000,0x4000020,0xc820000e,0x5000000,0x4000020,0xc820000f,0x5000000,0x4000020,0xc881000e,0x5000000,0x4000020,0xc881000f, 0x5000000,0x4000020,0xc941000e,0x5000000,0x4000020,0xc941000f,0x5000000,0x4000022,0xc820000e,0x5000000,0x4000022,0xc820000f,0x5000000,0x4000400,0x4200400,0x5000000, -0x4000400,0xc8200001,0x5000000,0x4000400,0xc8200002,0x5000000,0x6800000,0x10201c00,0x5000000,0x6800010,0xc8201001,0x5000000,0x6800020,0x10201c00,0x5000000,0x7c00000, +0x4000400,0xc8200001,0x5000000,0x4000400,0xc8200002,0x5000000,0x6800000,0x10201c00,0x5000000,0x6800010,0xc9001001,0x5000000,0x6800020,0x10201c00,0x5000000,0x7c00000, 0x10200000,0x5000000,0x7c00020,0x10200000,0x5000000,0x7c00100,0xc8220402,0x5000000,0x7c00120,0xc8220405,0x5000000,0x7c00120,0xc8230402,0x5000000,0x7c00120,0xc8250402, 0x5000000,0x7c00120,0xc8250405,0x5000000,0x7c00500,0x10220400,0x5000000,0x7c00500,0x10230400,0x5000000,0x7c00500,0x10530400,0x5000000,0x7c00500,0xf8230400,0x5000000, 0x7c00d00,0x10230400,0x5000000,0x24000000,0x4100000,0x5000000,0x24000000,0x4200000,0x5000000,0x24000000,0x4810000,0x5000000,0x24000000,0x4b00000,0x5000000,0x24000000, 0x4e00000,0x5000000,0x24000000,0x5410000,0x5000000,0x24000000,0x5500000,0x5000000,0x24000000,0x5710000,0x5000000,0x24000000,0x6800000,0x5000000,0x24000000,0xc8200002, -0x5000000,0x24000000,0xc9500002,0x5000000,0x24000002,0x7000000,0x5000000,0x24000006,0xc8c0000b,0x5000000,0x24000008,0x5410000,0x5000000,0x24000008,0x5710000,0x5000000, +0x5000000,0x24000000,0xc9500002,0x5000000,0x24000002,0x4400000,0x5000000,0x24000006,0xc8c0000b,0x5000000,0x24000008,0x5410000,0x5000000,0x24000008,0x5710000,0x5000000, 0x24000020,0x4200000,0x5000000,0x24000020,0x4200001,0x5000000,0x24000020,0x4810000,0x5000000,0x24000020,0x4f00000,0x5000000,0x24000020,0x5001400,0x5000000,0x24000020, 0x5410000,0x5000000,0x24000020,0x5600000,0x5000000,0x24000020,0xc8200002,0x5000000,0x24000020,0xc9500002,0x5000000,0x24000022,0x5600000,0x5000000,0x2c000010,0x5248000, 0x5000000,0x2c000010,0xc9248002,0x5000000,0x40000001,0x4440020,0x5000000,0x40000001,0x463b020,0x5000000,0x40000001,0x4643020,0x5000000,0x40000001,0x4a5a040,0x5000000, @@ -4290,397 +4376,409 @@ static const uint32_t propsVectors[6813]={ 0x5000018,0x7c00100,0xc9830002,0x5000018,0x7c00100,0xfd830000,0x5000018,0x7c00900,0xfd830000,0x5000018,0x7e00100,0xfd830000,0x5000019,0x7c00100,0x8220400,0x5000019, 0x7c00100,0x8250400,0x5000019,0x7c00100,0x10220400,0x5000019,0x7c00100,0x10220401,0x5000019,0x7c00100,0x10230400,0x5000019,0x7c00100,0x10250401,0x5000019,0x7c00100, 0x18220400,0x5000019,0x7c00100,0x18230400,0x5000019,0x7c00100,0x20220400,0x5000019,0x7c00100,0x20220401,0x5000019,0x7c00100,0x20250400,0x5000019,0x7c00100,0x20250401, -0x5000019,0x7c00100,0xc8220402,0x5000019,0x7c00100,0xc8250401,0x5000019,0x7c00100,0xc8250402,0x5000019,0x7c00100,0xfc220400,0x5000019,0x7c00100,0xfc220401,0x5000019, -0x7c00100,0xfc250400,0x5000019,0x7c00100,0xfc250401,0x5000019,0x7c00500,0xc822040f,0x500001a,0x6800000,0x21329800,0x500001a,0x6800100,0x8962541,0x500001a,0x6800100, -0xfc962540,0x500001a,0x6800100,0xfc962541,0x500001a,0x7c00100,0x8230400,0x500001a,0x7c00100,0x20230400,0x500001a,0x7c00100,0xfc230400,0x500001f,0x4000000,0x4200000, -0x500001f,0x6800000,0x21329800,0x500001f,0x6800100,0xfc962540,0x500001f,0x6800100,0xfc962541,0x500001f,0x7c00100,0x8230400,0x500001f,0x7c00100,0x20230400,0x500001f, -0x7c00100,0xfc230400,0x5000023,0x6800100,0xfc962540,0x5000023,0x6800100,0xfc962541,0x5000023,0x7c00100,0xfc230400,0x5000023,0x7c00100,0xfc230401,0x5000024,0x6800000, -0x21329800,0x5000024,0x6800100,0x20962540,0x5000024,0x6800100,0xfc962540,0x5000024,0x7c00100,0x8230400,0x5000024,0x7c00100,0x20230400,0x5000024,0x7c00100,0xfc230400, -0x5000026,0x4000000,0x4200000,0x5000026,0x4000010,0x4400000,0x5000026,0x6800000,0xfd329800,0x5000026,0x7800100,0xc9830142,0x5000026,0x7c00100,0xfd830000,0x5000026, -0x7c00900,0xfd830000,0x5000026,0x7e00100,0xfd830000,0x5000067,0x1000,0,0x5000410,0x7c00500,0xf8230400,0x500041b,0x4000400,0x4200400,0x5000492,0x7c00500, -0xc8230401,0x50004a5,0x4000010,0x4b00000,0x50004a5,0x4000010,0x5071400,0x50004b1,0xc000010,0x4b48000,0x50004b9,0x7c00900,0x8230400,0x50004e9,0xc000010,0x4448000, -0x50004fe,0xc000010,0x4448000,0x5000536,0x4000000,0x4200000,0x50005be,0x4000000,0x4e00000,0x500061b,0x24000000,0x14810000,0x500061b,0x24000000,0x15410000,0x5000c94, -0x4000400,0x14200000,0x5000ca3,0xc000010,0x5049400,0x5000cc7,0x6800000,0xfd329800,0x5000ccb,0xc000010,0x4b48000,0x5000d19,0x6800000,0xfd329800,0x5000d1e,0x6800000, -0xfd329800,0x5000d22,0x6800000,0x21329800,0x5000d26,0x6800000,0xfd329800,0x5000d2a,0x4000000,0x4200000,0x5000d2a,0x6800000,0x21329800,0x5000d2f,0x6800000,0xfd329800, -0x5000e1f,0x7c00100,0xc8230408,0x5001000,0x80004,0xc4418820,0x5001000,0x4000000,0x4100000,0x5001000,0x4000000,0xc8100002,0x5001000,0x4000000,0xc8100003,0x5001000, -0x4000000,0xc8100006,0x5001000,0x4000000,0xc810000e,0x5001000,0x4000000,0xc810000f,0x5001000,0x4000000,0xc9500002,0x5001000,0x4000000,0xc9600002,0x5001000,0x4000100, -0xc8120403,0x5001000,0x4000100,0xc8150403,0x5001000,0x4000400,0x4200400,0x5001000,0x4000400,0xc8100002,0x5001000,0x4000400,0xc8100402,0x5001000,0x4000400,0xc8500002, -0x5001000,0x7c00120,0xc8120405,0x5001000,0x7c00d00,0x10130400,0x5001000,0x24000000,0x4100000,0x5001000,0x24000000,0x4200000,0x5001000,0x24000000,0x4e00000,0x5001000, -0x24000000,0x5400000,0x5001000,0x24000000,0x5500000,0x5001000,0x24000000,0x5600000,0x5001000,0x24000000,0xc8200002,0x5001000,0x24000000,0xc8f00002,0x5001000,0x24000000, -0xf8401000,0x5001000,0x24000002,0x4100000,0x5001000,0x24000002,0x4370000,0x5001000,0x24000002,0x7070000,0x5001000,0x24000006,0xfb000000,0x5001000,0x24000008,0x5710000, -0x5001000,0x24000008,0x5712c00,0x5001000,0x24000008,0xf9712c00,0x5001000,0x24000020,0x4100000,0x5001000,0x24000020,0x4100001,0x5001000,0x24000020,0x5500000,0x5001000, -0x24000020,0x5600000,0x5001000,0x24000020,0xc8100002,0x5001000,0x24000020,0xc9500002,0x5001000,0x2c000010,0xc8f0ac02,0x5001008,0x7c00100,0xfc220400,0x5001008,0x7c00100, -0xfc220401,0x5001008,0x7c00100,0xfc250400,0x5001008,0x7c00100,0xfc250401,0x500100e,0x7c00100,0xc8250401,0x500100e,0x7c00100,0xfc220400,0x500100e,0x7c00100,0xfc250400, -0x5001019,0x7c00100,0x8220400,0x5001019,0x7c00100,0x10220400,0x5001019,0x7c00100,0x20220401,0x5001019,0x7c00100,0xc8120402,0x5001019,0x7c00100,0xc812040f,0x5001019, -0x7c00100,0xc8150401,0x5001019,0x7c00100,0xc8150402,0x5001019,0x7c00100,0xc8220402,0x5001019,0x7c00100,0xc8250402,0x5001019,0x7c00100,0xfc220400,0x5001019,0x7c00100, -0xfc220401,0x5001019,0x7c00100,0xfc250400,0x5001019,0x7d00100,0xc0220402,0x5001067,0,0,0x5001400,0x6800c00,0xf8101000,0x5001417,0x4000400,0xc8100002, -0x5001417,0x7c00500,0x10130400,0x5001419,0x7c00500,0x10130400,0x5002000,0x4000000,0x5600000,0x5002000,0x4000000,0xc820000a,0x5002000,0x4000020,0xc820000a,0x5002012, -0x7c00100,0xc8e3040a,0x5002012,0x7c80100,0xc4e3040a,0x5002016,0x7c00100,0xc8e30c0a,0x5002016,0x7c00100,0xca530c0a,0x50025a4,0x4000008,0xc881000a,0x50025a4,0x4000008, -0xc941000a,0x50025a4,0x4000010,0xc887000a,0x50025a4,0x6800004,0xc920000a,0x50025a4,0xc000010,0xc884800a,0x50025bc,0x7c00d00,0xca530c0a,0x5003000,0x4000000,0xc8810011, -0x5003000,0x4000000,0xc8e00011,0x5003000,0x4000000,0xc9410011,0x5003000,0x4000000,0xc9500011,0x5003000,0x4000000,0xc9600011,0x5003000,0x4000001,0xc8445811,0x5003000, -0x4000006,0xc8e70011,0x5003000,0x4000008,0xc8e00011,0x5003000,0x4000008,0xc8e02c11,0x5003000,0x4000010,0xc8871411,0x5003000,0x4000010,0xc9271011,0x5003000,0x4000010, -0xc9271411,0x5003000,0x4000020,0xc8e00011,0x5003000,0x4000400,0xc8e00011,0x5003000,0x4000420,0xc8e00011,0x5003000,0x6800000,0xc8e01c11,0x5003000,0x6800040,0xc8e29811, -0x5003000,0xc000010,0xc880ac11,0x5003000,0xc000010,0xc8b48011,0x5003019,0x7c00100,0xc8e20411,0x5003019,0x7c00100,0xc8e50411,0x5003019,0x7c00140,0xc8e20411,0x5003019, -0x7c00140,0xc8e50411,0x5004000,0x4000400,0xc8200002,0x5004000,0x6800000,0xfc201c00,0x5004000,0x68000c0,0xfd329800,0x5004000,0x24000000,0x4200000,0x5004000,0x24000000, -0x4810000,0x5004000,0x24000000,0x5410000,0x5004000,0x24000000,0x5500000,0x5004000,0x24000000,0x5600000,0x5004000,0x24000000,0x5b00000,0x5004000,0x24000000,0x6410000, -0x5004000,0x24000006,0xf8d70000,0x5004000,0x24000008,0x5714000,0x5004000,0x24000008,0xf9713c00,0x5004000,0x24000010,0x5071400,0x5004000,0x24000010,0xf9071000,0x5004000, -0x24000020,0x4200000,0x5004000,0x24000020,0x4400000,0x5004000,0x24000020,0x5600000,0x5004000,0x24000400,0x4200000,0x5004000,0x24000420,0x4200000,0x5004000,0x2c000010, -0x4b48000,0x5004000,0x2c000010,0xf900ac00,0x5004000,0x44000001,0x5a45800,0x5004019,0x7c00100,0xfc220400,0x5004019,0x7c00100,0xfc250400,0x5004019,0x7c001c0,0xfc220400, -0x5004019,0x7c001c0,0xfc250400,0x5005000,0x4000000,0x4e00000,0x5005000,0x4000000,0x14e00000,0x5005000,0x4000000,0xc881000c,0x5005000,0x4000000,0xc8810010,0x5005000, -0x4000000,0xc8e00002,0x5005000,0x4000000,0xc8e0000c,0x5005000,0x4000000,0xc8e0000d,0x5005000,0x4000000,0xc8e00010,0x5005000,0x4000000,0xc941000c,0x5005000,0x4000000, -0xc9410010,0x5005000,0x4000000,0xc950000c,0x5005000,0x4000000,0xc960000c,0x5005000,0x4000002,0xc8e7000c,0x5005000,0x4000002,0xc8e70010,0x5005000,0x4000008,0xc8810010, -0x5005000,0x4000008,0xc9410010,0x5005000,0x4000010,0xc887140c,0x5005000,0x4000010,0xc8e7000c,0x5005000,0x4000010,0xc927100c,0x5005000,0x4000010,0xc927140c,0x5005000, -0x4000020,0xc8e0000c,0x5005000,0x4000026,0xc8e7000c,0x5005000,0x6800000,0xc8e01c02,0x5005000,0x6800000,0xc8e01c10,0x5005000,0xc000010,0xc880ac0c,0x5005000,0xc000010, -0xc8b4800c,0x5005000,0x24000000,0x4200000,0x5005000,0x24000000,0x4e00000,0x5005000,0x24100000,0xc0810001,0x5005000,0x24100000,0xc1410001,0x5005005,0x7c00100,0x40e30400, -0x5005011,0x7c00300,0x10e30000,0x5005011,0x7c00300,0xc8e30001,0x5005011,0x7c00300,0xfce30000,0x5005011,0x7c00900,0xfd230400,0x5005011,0x7c40300,0x20e30000,0x5005011, -0x7c40300,0xfce30000,0x5005012,0x4000000,0xc8e00002,0x5005012,0x4000000,0xc8e00003,0x5005012,0x7c00100,0xa130480,0x5005012,0x7c00100,0xc8e30402,0x5005012,0x7c80100, -0xc4e30402,0x5005012,0x7c80100,0xc6130480,0x5005014,0x7c00100,0xfce30000,0x5005014,0x7c00100,0xfce30001,0x5005014,0x7c00100,0xfe530000,0x5005014,0x7c00900,0xfd230000, -0x5005014,0x7c00900,0xfd230001,0x5005016,0x4000000,0xc8e00c03,0x5005016,0x4000000,0xc8e00c0d,0x5005016,0x7c00100,0xfce30c00,0x5005016,0x7c00100,0xfce30c01,0x5005016, -0x7c00100,0xfe530c00,0x5005016,0x7c00900,0xfd230c00,0x5005016,0x7c00900,0xfd230c01,0x50055a4,0x6800004,0xf9200000,0x50055a4,0x24000000,0x4810000,0x50055a4,0x24000000, -0x5410000,0x50055a4,0x24000008,0x4810000,0x50055a4,0x24000008,0x5410000,0x50055aa,0x24000010,0x4870000,0x50055b1,0x2c000010,0x4848000,0x50055b9,0x4000000,0x4e00000, -0x50055b9,0x24000000,0x4e00000,0x50055b9,0x24000002,0x4e00000,0x50055b9,0x24000002,0x5200000,0x50055b9,0x24000008,0x4810000,0x50055b9,0x24000008,0x5410000,0x50055b9, -0x24000008,0xc810000,0x50055bc,0x7000400,0xc9200c02,0x50055bc,0x7c00900,0x10930c00,0x50055bc,0x7c00900,0x10e30c00,0x50055bc,0x7c00d00,0xfe530c00,0x50055be,0x4000000, -0x4e00000,0x50055be,0x4000000,0xc8e00002,0x50055be,0x4000000,0xc8e00003,0x50055be,0x4000000,0xc8e0000d,0x50055be,0x4000000,0xc8e0000f,0x50055be,0x7c00300,0xfce30000, -0x50055bf,0x24000000,0x4810000,0x50055bf,0x24000000,0x5410000,0x50055c7,0x24000000,0x4810000,0x50055c7,0x24000000,0x5410000,0x5008004,0x7c00100,0xc8230401,0x5008004, -0x7c00100,0xfc230400,0x500800a,0x7c00100,0x20230401,0x500800a,0x7c00100,0xc8230401,0x500800a,0x7c00100,0xfc230400,0x500800a,0x7c00100,0xfc230401,0x500800f,0x7c00100, -0xfc230400,0x500801a,0x7c00100,0xfc230400,0x500801f,0x7c00100,0xc8230401,0x500801f,0x7c00100,0xfc230400,0x5008024,0x7c00100,0x20230400,0x5008024,0x7c00100,0xfc230400, -0x5010001,0x2000,0x14962460,0x5010001,0x2802020,0x10962460,0x5010001,0x2802400,0x10962460,0x5010001,0x2802400,0x10c62460,0x5010001,0x2880000,0xc6a65620,0x5010002, -0x2802100,0x20962460,0x5010002,0x2802400,0x20962460,0x5010004,0x2802100,0x8962460,0x5010004,0x2802100,0x20962460,0x5010004,0x2802100,0xfc962460,0x5010004,0x2802400, -0xfc962460,0x501000a,0x2802100,0x8962460,0x501000a,0x2802100,0x20962460,0x501000a,0x2802100,0xfc962460,0x501000a,0x2802400,0xfc962460,0x501000f,0x2802100,0x20962460, -0x501000f,0x2802100,0xfc962460,0x501000f,0x2802400,0xfc962460,0x5010010,0x2802100,0xfc962460,0x5010010,0x2802400,0xfc962460,0x5010010,0x2802900,0xfc962460,0x5010010, -0x2806400,0xfc962460,0x5010013,0x2802500,0x20962460,0x5010013,0x2802500,0x30962460,0x5010015,0x2802100,0x20962460,0x5010015,0x2802100,0xfc962460,0x5010015,0x2802100, -0xfc962461,0x5010015,0x2806400,0xfc962460,0x5010018,0x2802100,0xfd862460,0x5010018,0x2802400,0xfd862460,0x501001a,0x2802100,0xfc962460,0x501001f,0x2802100,0x20962460, -0x501001f,0x2802100,0xfc962460,0x501001f,0x2802400,0xfc962460,0x5010023,0x2802100,0x10962460,0x5010023,0x2802100,0x20962460,0x5010023,0x2802100,0xfc962460,0x5010023, -0x2806400,0xfc962460,0x5010024,0x2802100,0x20962460,0x5010024,0x2802100,0xfc962460,0x5010024,0x2802100,0xfc962461,0x5010026,0x2802100,0xfd862460,0x5010026,0x2802400, -0x21862460,0x5010026,0x2802400,0xfd862460,0x5010026,0x2806500,0xfd862460,0x501089e,0x2802400,0x18962460,0x50108c2,0x2802100,0xfc962460,0x50108c2,0x2802500,0xfc962460, -0x50108cd,0x2802400,0x8962460,0x50108dc,0x2802400,0x8962460,0x5010c98,0x2802400,0x8962460,0x5010c9c,0x2802400,0x18962460,0x5011001,0x2802400,0x10962460,0x5011001, -0x2802400,0x10c62460,0x5011001,0x2802400,0x20962460,0x5011001,0x2802400,0xc8962461,0x5011001,0x2802400,0xfc962460,0x501181d,0x2802400,0xfc962460,0x5011825,0x2802400, -0xfc962460,0x501182d,0x2802400,0xfc962460,0x501182f,0x2802400,0xfc962460,0x5011831,0x2802400,0xfc962460,0x5011836,0x2802400,0xfc962460,0x5011841,0x2802400,0x20962460, -0x5011847,0x2802400,0xfc962460,0x501184c,0x2802400,0xfc962460,0x5011855,0x2802400,0xfc962460,0x5011860,0x2802400,0xfc962460,0x5011863,0x2802400,0xfc962460,0x5011867, -0x2802400,0xfc962460,0x501186a,0x2802400,0x10962460,0x501186a,0x2802400,0x20962460,0x501186c,0x2802400,0x10962460,0x501186e,0x2802400,0x10962460,0x5011871,0x2802400, -0x10962460,0x5011875,0x2802400,0xfc962460,0x501187b,0x2802400,0x10962460,0x501187f,0x2802400,0x10962460,0x5011881,0x2802400,0x10962460,0x5011884,0x2802400,0x10962460, -0x5011887,0x2802400,0xfc962460,0x501188e,0x2802400,0x10962460,0x501188e,0x2802500,0x8962460,0x50125bc,0x3802500,0xc926246a,0x5015012,0x2802400,0x18962460,0x50159bc, -0x2802400,0x20962460,0x50159d0,0x2802400,0x10962460,0x5018004,0x2806400,0xfc962460,0x501800a,0x2806400,0xfc962460,0x501800f,0x2806400,0xfc962460,0x501801a,0x2806400, -0xfc962460,0x501801f,0x2806400,0xfc962460,0x5018024,0x2806400,0xfc962460,0x8000000,0x4000000,0x5600000,0x8000019,0x7c00100,0xc8220401,0x8000027,0x4000000,0x4200000, -0x8000027,0x4000000,0x4400000,0x8000027,0x4000000,0x4500000,0x8000027,0x4000000,0x4810000,0x8000027,0x4000000,0x4b00000,0x8000027,0x4000000,0x5410000,0x8000027, -0x4000000,0xc8c0000b,0x8000027,0x4000000,0xf8400000,0x8000027,0x4000010,0x4b00000,0x8000027,0x4000010,0x4c00000,0x8000027,0x6800000,0xfd329800,0x8000027,0x6800100, -0xfc462540,0x8000027,0x6800400,0x10962540,0x8000027,0x7c00100,0x8230400,0x8000027,0x7c00100,0x10230400,0x8000027,0x7c00100,0xc8230401,0x8000027,0x7c00100,0xfc230400, -0x8000067,0,0x1900000,0x8000067,0x1000,0,0x8001067,0,0,0x8005012,0x7c00100,0xfdf304c1,0x8005012,0x7c00100,0xfe0304e1,0x8010013, -0x2802400,0x20962460,0x8010013,0x2802500,0x20962460,0x8010027,0x2802100,0xc8962461,0x8010027,0x2802100,0xfc962460,0x8010027,0x2802400,0x8962460,0x8010027,0x2802400, -0x10962460,0x8010027,0x2802400,0x20962460,0x8010027,0x2802500,0x28962460,0x8010027,0x2806400,0xfc962460,0x8010027,0x2902100,0xc0962462,0x9000000,0x4000000,0x4700000, -0x9001000,0x4000000,0x5600000,0xc000000,0,0x4918820,0xc000000,0x4000000,0x4200000,0xc000000,0x4000000,0x5600000,0xc000000,0x4000400,0x4200400,0xc000000, -0x7c00100,0xc8220405,0xc000000,0x7c00500,0x10230400,0xc000000,0x24000000,0x4200000,0xc000000,0x2c000010,0xc9248002,0xc000002,0x4000000,0xf8200000,0xc000002,0x7c00100, -0x20230400,0xc000002,0x7c00100,0xfc230400,0xc000003,0x4000006,0xfb000400,0xc000005,0x4000400,0x44200400,0xc000006,0x7c00100,0x40250400,0xc000008,0x7c00100,0x20220400, -0xc000008,0x7c00100,0x20220401,0xc000008,0x7c00100,0x20250400,0xc000008,0x7c00100,0x20250401,0xc00000b,0x4000000,0x4200000,0xc00000b,0x4000010,0x4200000,0xc00000b, -0x4000010,0x4400000,0xc00000b,0x6800000,0x8200000,0xc00000b,0x7c00100,0x20230400,0xc00000b,0x7c00100,0xfc230400,0xc00000b,0xc000010,0x4248000,0xc00000e,0x7c00100, -0x8220400,0xc00000e,0x7c00100,0x10220400,0xc000013,0x7c00100,0xca633801,0xc000017,0x4000000,0x4200000,0xc000017,0x4000000,0x5600000,0xc000017,0x4000000,0xc400000, -0xc000017,0x4000010,0x4400000,0xc000017,0x4000010,0x5200000,0xc000017,0x6800000,0xfd329800,0xc000017,0x6800100,0xfd862540,0xc000017,0x7c00100,0x9830000,0xc000017, -0x7c00100,0x21830000,0xc000017,0xc000010,0x4448000,0xc000019,0x7c00100,0x8220400,0xc000019,0x7c00100,0x8250400,0xc000019,0x7c00100,0x10220400,0xc000019,0x7c00100, -0x18250400,0xc000019,0x7c00100,0x20220400,0xc000019,0x7c00100,0x20220401,0xc000019,0x7c00100,0x20250400,0xc000019,0x7c00100,0x20250401,0xc000019,0x7c00100,0xfc220401, -0xc000019,0x7c00100,0xfc250401,0xc00001b,0x80000,0xc4c18820,0xc00001b,0x4000000,0x84200000,0xc00001b,0x4000006,0x84500000,0xc00001b,0x4000010,0x84400000,0xc00001b, -0x4000010,0x84b70000,0xc00001b,0x4000800,0x84200000,0xc00001b,0x6800000,0x81329800,0xc00001b,0x7c00100,0x80230400,0xc00001b,0x7c00900,0x80230400,0xc00001b,0xc000010, -0x84b48000,0xc00001c,0x4000000,0x4200000,0xc00001c,0x6800100,0x29862540,0xc00001c,0x6800100,0xfd862400,0xc00001c,0x6800100,0xfd862540,0xc00001c,0xc000010,0x4448000, -0xc00001d,0x4000000,0x84810000,0xc00001d,0x4000000,0x85410000,0xc00001d,0x4000001,0x84445800,0xc00001d,0x7c00100,0x80230400,0xc000020,0x7c00100,0x80230400,0xc000021, -0x4000000,0x4200000,0xc000021,0x6800100,0x30962540,0xc000021,0x6800100,0xfc962540,0xc000021,0x6800100,0xfc962541,0xc000021,0x7c00100,0x8230400,0xc000021,0x7c00100, -0x20230400,0xc000021,0x7c00100,0x30230400,0xc000021,0x7c00100,0xfc230400,0xc000022,0x4000000,0x44200000,0xc000022,0x4000010,0x44200000,0xc000022,0x7c00100,0x40230400, -0xc000022,0xc000010,0x44248000,0xc000022,0x80000000,0x44218560,0xc000025,0x7c00100,0xfc230400,0xc000027,0x4000000,0x4200000,0xc000027,0x4000000,0x4400000,0xc000027, -0x7c00100,0x28230400,0xc000028,0x4000000,0x44200000,0xc000028,0x7c00100,0x40230400,0xc000028,0xc000010,0x44248000,0xc00002e,0x24000000,0x14200000,0xc00002e,0x24000000, -0x14400000,0xc000539,0x4000010,0x84400000,0xc00053e,0x4000010,0x84400000,0xc00053e,0x4000010,0x84b70000,0xc00053e,0xc000010,0x84b48000,0xc000582,0x4000001,0xc8c41c0b, -0xc000d34,0x6800000,0xfd329800,0xc001000,0x4000400,0x4500400,0xc005005,0x7c00100,0x40e30400,0xc005011,0x4020000,0x4e00000,0xc005011,0x4020000,0xc8e00002,0xc005011, -0x7c00300,0xc8e30002,0xc005011,0x7c40300,0x20e30000,0xc005011,0x7c40300,0xfce30000,0xc005029,0x4000000,0x44e00000,0xc005029,0x7c00100,0x40e30400,0xc005029,0x7c00900, -0x41230400,0xc0055a2,0x4008000,0x4e00000,0xc0055a2,0x4010000,0x4e00000,0xc0055be,0x4000000,0x4e00000,0xc008017,0x7c00100,0x9830000,0xc008017,0x7c00100,0x21830000, -0xc008017,0x7c00100,0xfd830000,0xc008017,0x7d00100,0xc1830000,0xc00801c,0x7c00100,0x29830000,0xc00801c,0x7c00100,0xfd830000,0xc00801c,0x7c00100,0xfd830001,0xc010001, -0x2000,0x14962460,0xc010008,0x2000,0xc962460,0xc010017,0x2802100,0xfd862460,0xc010017,0x2802400,0x9862460,0xc010017,0x2802400,0x11862460,0xc010017,0x2802400, -0x19862460,0xc010017,0x2802400,0xfd862460,0xc010017,0x2882000,0xc5862460,0xc01001b,0x2802100,0xa0962460,0xc01001b,0x3c02100,0x80962460,0xc01001b,0x12882000,0xc4962460, -0xc01001c,0x2802100,0x29862460,0xc01001c,0x2802100,0xfd862460,0xc01001c,0x2802400,0xfd862460,0xc010021,0x2802100,0x30962460,0xc010021,0x2802100,0xfc962460,0xc010021, -0x2806400,0xfc962460,0xc010022,0x2802100,0x40962460,0xc010022,0x2802400,0x50962460,0xc010022,0x2802500,0x40962460,0xc010025,0x2802500,0xfc962460,0xc010027,0x2802100, -0x20962460,0xc010027,0x2802100,0xfc962460,0xc010027,0x2802400,0x30962460,0xc0108c2,0x2802100,0x30962460,0xc0108c2,0x2802100,0xfc962460,0xc011001,0x2802400,0x10962460, -0xc011001,0x2802400,0x10c62460,0xc018017,0x2806400,0xfd862460,0xc01801c,0x2806400,0xfd862460,0xd000000,0x80000,0xc4918820,0xd000000,0x180000,0xc0918820,0xd000000, -0x4000000,0x14200000,0xd000000,0x4000000,0xc8200001,0xd000000,0x4000020,0xc8200005,0xd000000,0x6800020,0xc9329805,0xd000000,0x7c00120,0xc8220405,0xd000000,0x7c00120, -0xc8250405,0xd000009,0x7c00100,0x80220400,0xd000009,0x7c00100,0x80250400,0xd00000d,0x7c00100,0x80230400,0xd00000e,0x7c00120,0xc8220402,0xd00000e,0x7c00120,0xc8250402, -0xd00001e,0x4000000,0x84200000,0xd00001e,0x7c00100,0x80230400,0xd000067,0x1000,0,0xd005011,0x7c00300,0xc8e30001,0xd005011,0x7c40300,0x20e30000,0xd005011, -0x7c40300,0xfce30000,0xd010000,0x82000,0xc4962460,0xd010000,0x2802000,0x10962460,0xd010000,0x2802400,0x10962460,0xd010001,0x2802400,0x10962460,0xe000000,0x80000, -0xc5e18820,0xe000000,0x80020,0xc4218820,0xe000000,0x4000000,0x4200000,0xe000000,0x4000000,0x5600000,0xe000000,0x4000001,0xc8445802,0xe000000,0x4000020,0x4200000, -0xe000000,0x4000020,0xc8200005,0xe000000,0x7c00120,0xc8220405,0xe000000,0x7c00120,0xc8250405,0xe000000,0x24000000,0x4100000,0xe000000,0x24000000,0x4200000,0xe000000, -0x24000000,0x4810000,0xe000000,0x24000000,0x5410000,0xe000000,0x24000000,0xc9500002,0xe000000,0x24000020,0x4200000,0xe000000,0x24000020,0x4810000,0xe000000,0x24000020, -0x5410000,0xe000000,0x24000020,0xc8200001,0xe000000,0x24000020,0xc8200002,0xe000000,0x2c000010,0xc9248002,0xe000002,0x4000000,0xc9500008,0xe000002,0x7c00100,0x8230400, -0xe000002,0x7c00100,0x10230400,0xe000008,0x7c00100,0x8220400,0xe000008,0x7c00100,0x8250400,0xe000008,0x7c00100,0x20220400,0xe000008,0x7c00100,0x20250400,0xe00000c, -0x7c00100,0x20230400,0xe00000e,0x4000020,0x4200000,0xe00000e,0x7c00100,0x8220400,0xe00000e,0x7c00100,0x8250400,0xe000019,0x7c00100,0x20250400,0xe000019,0x7c00100, -0xc822040f,0xe000025,0x7c00100,0xfc230400,0xe00002a,0x7c00100,0x80230400,0xe00002b,0x7c00100,0x80230400,0xe00002c,0x7c00100,0x80230400,0xe00002d,0x7c00100,0x80230400, -0xe00053a,0xc000010,0x84448000,0xe000585,0x24000000,0x4200000,0xe001000,0x4000000,0x14100000,0xe003000,0x4000000,0xc8810011,0xe003000,0x4000000,0xc9410011,0xe004000, -0x24000020,0x4810000,0xe004000,0x24000020,0x5410000,0xe005000,0x4000000,0xc8e00003,0xe005000,0x24000020,0x4200000,0xe005011,0x7c00100,0x11230400,0xe005011,0x7c00300, -0xc8e30001,0xe005014,0x7c00100,0xc8e30010,0xe005014,0x7c00100,0xfe530000,0xe005016,0x7c00100,0xa530c00,0xe005016,0x7c00100,0xc8e30c10,0xe005029,0x4000000,0x44e00000, -0xe0055b9,0x24000000,0x14e00000,0xe0055bc,0x4000002,0xf9200c00,0xe0055d2,0x4000000,0x4e00000,0xe0055d2,0x7c00100,0x11230400,0xe010001,0x2000,0x14962460,0xe010001, -0x2802000,0x10962460,0xe010001,0x2802020,0x10962460,0xe01002a,0x2802100,0x80962460,0xe01002a,0x2806400,0x80962460,0xe01002b,0x2802100,0x80962460,0xe01002b,0x2806400, -0x80962460,0xe01002c,0x2802100,0x80962460,0xe01002d,0x2802100,0x80962460,0xe011001,0x2882000,0xc4962460,0xe011001,0x12882000,0xc4962460,0xe011818,0x2802100,0x8962460, -0x10000000,0x4000000,0xc8200002,0x10000000,0x4000400,0x4200400,0x10000000,0x6800000,0x20201c00,0x10000000,0x7c00120,0xc8220405,0x10000000,0x24000000,0x4200000,0x10000000, -0x24000002,0x4200000,0x10000000,0x24000020,0x4200000,0x10000002,0x4000000,0x4200000,0x10000002,0x4000000,0x5071400,0x10000002,0x7c00100,0xfc230400,0x10000002,0x80000000, -0x5329960,0x10000004,0x7c00100,0x8230400,0x10000008,0x7c00100,0x10220400,0x10000009,0x7c00100,0x80220400,0x10000009,0x7c00100,0x80250400,0x1000000a,0x7c00100,0x20230400, -0x1000000e,0x7c00100,0x8220400,0x1000000e,0x7c00100,0x8250400,0x1000000e,0x7c00100,0x10220400,0x1000000e,0x7c00100,0xc8250402,0x1000000e,0x7c00500,0xc822040e,0x1000000e, -0x7c00500,0xc822040f,0x1000000f,0x4000000,0x5600000,0x1000000f,0x7c00100,0x8230400,0x1000000f,0x7c00100,0xfc230400,0x10000010,0x6800100,0x20962540,0x10000015,0x7c00100, -0x8230400,0x10000017,0x4000000,0x4200000,0x10000019,0x7c00100,0x10220400,0x10000019,0x7c00100,0x20220400,0x10000019,0x7c00500,0x10220400,0x10000019,0x7c00500,0xc822040e, -0x10000019,0x7c00500,0xc822040f,0x10000022,0x7c00100,0x40230400,0x10000023,0x4000000,0x4200000,0x10000023,0x4000000,0x5600000,0x1000002f,0x7c00100,0x80230400,0x10000030, -0x4000000,0x44200000,0x10000030,0x6800000,0x41329800,0x10000030,0x6800100,0x40962540,0x10000030,0x7c00100,0x40230400,0x10000030,0xc000010,0x44b48000,0x10000031,0x7c00100, -0x80230400,0x10000032,0x6800000,0x81329800,0x10000032,0x7c00100,0x80230400,0x10000033,0x7c00100,0x80230400,0x10000034,0x7c00100,0x41830000,0x10000035,0x4000010,0x84400000, -0x10000035,0x7c00100,0x80230400,0x10000621,0x4000000,0x84200000,0x10000624,0x4000000,0x84400000,0x10000627,0x4000000,0x84200000,0x10000627,0x4000000,0x84400000,0x10000d2a, -0x4000000,0x4200000,0x10000e1f,0x4000000,0x14200000,0x10001000,0x4000000,0x14200000,0x10005000,0x4000000,0x14200000,0x10005000,0x4000000,0xc8810010,0x10005000,0x4000000, -0xc8e0000d,0x10005000,0x4000000,0xc9410010,0x10005000,0x24000000,0x4200000,0x10005000,0x24000000,0x4e00000,0x10005012,0x4000000,0xc8e00002,0x10005012,0x4000000,0xc8e00003, -0x1000801f,0x7c00100,0x20230400,0x1000801f,0x7c00100,0xfc230400,0x10010002,0x2802100,0x20962460,0x10010002,0x2802400,0x20962460,0x10010002,0x2802500,0x20962460,0x1001000f, -0x2802100,0x8962460,0x10010010,0x2802100,0x20962460,0x10010015,0x2802400,0x20962460,0x10010017,0x2802400,0x19862460,0x10010030,0x2802100,0x40962460,0x10010030,0x2802400, -0x40962460,0x10011001,0x2802400,0x10962460,0x10011001,0x2802400,0x10c62460,0x10011001,0x12882000,0xc4962460,0x1001188f,0x2802400,0x10c62460,0x11000000,0x4000000,0x4200000, -0x11000000,0x4000000,0x5600000,0x11000000,0x4000400,0x14200400,0x11000000,0x7c00120,0xc8220405,0x11000000,0x24000000,0x4200000,0x11000000,0x24000000,0x4e00000,0x11000000, -0x24000000,0x5710000,0x11000000,0x24000000,0xc200000,0x11000000,0x24000000,0xc400000,0x11000000,0x24000000,0x1d710000,0x11000000,0x24000020,0x4200000,0x11000000,0x24000020, -0x4810000,0x11000000,0x24000020,0x5410000,0x11000002,0x4000000,0x5500000,0x11000002,0x7c00100,0x20230400,0x11000002,0x7c00100,0xfc230400,0x11000002,0xc000010,0x4b48000, -0x11000004,0x7c00100,0xfc230400,0x11000007,0x4000000,0x84200000,0x11000007,0x4000000,0x84400000,0x11000007,0x4000000,0x84b00000,0x11000007,0x7c00100,0x80220400,0x11000007, -0x7c00100,0x80250400,0x11000007,0xc000010,0x84448000,0x11000007,0xc000010,0x84b48000,0x11000008,0x7c00100,0x20220400,0x11000008,0x7c00100,0x20250400,0x11000008,0x7c00100, -0xc822040f,0x1100000b,0x4000000,0x4200000,0x1100000b,0x7c00100,0x20230400,0x1100000b,0x7c00100,0xfc230400,0x1100000c,0x7c00100,0x8220400,0x1100000c,0x7c00100,0x30230400, -0x1100000c,0x7c00100,0xc822040f,0x1100000e,0x4000000,0x4200000,0x1100000e,0x4000000,0xc200000,0x1100000e,0x7c00100,0x8230400,0x1100000e,0x7c00100,0x8250400,0x1100000e, -0x7c00100,0x18220400,0x1100000e,0x7c00100,0xc822040f,0x11000013,0x4000000,0xcb00000,0x11000019,0x7c00100,0x10220400,0x11000019,0x7c00100,0x20220400,0x11000019,0x7c00100, -0x20250400,0x11000019,0x7c00100,0xc822040e,0x11000019,0x7c00500,0xc822040f,0x11000023,0x7c00100,0xfc230400,0x11000027,0x4000000,0x4500000,0x11000037,0x4000000,0x84200000, -0x11000037,0x6800100,0x80962540,0x11000037,0x7c00100,0x80230400,0x11000038,0x7c00100,0x80220400,0x11000038,0x7c00100,0x80250400,0x11000039,0x4000000,0x84200000,0x11000039, -0x4000000,0x84400000,0x11000039,0xc000010,0x84448000,0x1100003a,0x4000000,0x44200000,0x1100003a,0x6800100,0x40962540,0x1100003a,0x7c00100,0x40230400,0x1100003b,0x4000000, -0x45800000,0x1100003b,0x6800000,0x41329800,0x1100003b,0x7c00100,0x41830000,0x1100003b,0x7e00100,0x41830000,0x1100003c,0x7c00100,0x40230400,0x1100003c,0x7c00100,0xc823040f, -0x1100003d,0x4000010,0x84400000,0x1100003d,0x7c00100,0x80230400,0x11000587,0x24000000,0xc400000,0x1100058d,0x24000000,0xc400000,0x11000594,0x24000006,0x7000000,0x110005d5, -0x4000400,0xc200000,0x11000d2a,0x6800000,0x21329800,0x11005000,0x4000000,0xc8810010,0x11005000,0x4000000,0xc8870010,0x11005000,0x4000000,0xc8f00010,0x11005000,0x4000000, -0xc9270010,0x11005000,0x4000000,0xc9271010,0x11005000,0x4000000,0xc9410010,0x11005000,0xc000010,0xc8848010,0x11005000,0xc000010,0xc8b48010,0x11005000,0x24000000,0x4200000, -0x11005000,0x24000000,0x4e00000,0x11005011,0x7c00300,0xc8e30001,0x11005011,0x7c40300,0x20e30000,0x11005012,0x4000000,0xc8e00003,0x110055be,0x4000000,0x4e00000,0x1100800a, -0x7c00100,0x10230400,0x11008039,0x7c00100,0x80230400,0x11010001,0x2802000,0x18962460,0x11010001,0x2802020,0x10962460,0x11010002,0x2802100,0x20962460,0x1101000b,0x2802400, -0x20962460,0x1101000e,0x2802000,0x18962460,0x11010013,0x2802400,0x28962460,0x11010013,0x2802500,0x28962460,0x11010013,0x2802500,0x30962460,0x11010037,0x2802100,0x80962460, -0x11010039,0x2802100,0x80962460,0x11010039,0x2802400,0x80962460,0x1101003a,0x2802100,0x40962460,0x1101003a,0x2806400,0x40962460,0x1101088e,0x2802000,0x18962460,0x11011001, -0x2802000,0x10962460,0x11011001,0x2802000,0x10c62460,0x11011865,0x2802000,0x20962460,0x11018039,0x2806400,0x80962460,0x14000000,0x4000000,0x4200000,0x14000000,0x4000400, -0x4200400,0x14000000,0x7c00120,0xc8220405,0x14000000,0x7c00120,0xc8250405,0x14000000,0x7c00500,0x10230400,0x14000000,0x24000000,0x4200000,0x14000000,0x24000020,0x4200000, -0x14000008,0x7c00100,0x20220400,0x14000008,0x7c00100,0x20250400,0x14000008,0x7c00100,0xfc220400,0x1400000e,0x7c00100,0x8220400,0x14000015,0x7c00100,0x8230400,0x14000019, -0x7c00100,0x8220400,0x14000019,0x7c00100,0x8250400,0x14000019,0x7c00100,0x10220400,0x14000019,0x7c00100,0x10250400,0x14000019,0x7c00100,0x20220400,0x14000019,0x7c00100, -0x20250400,0x14000019,0x7c00100,0xfc220400,0x14000019,0x7c00100,0xfc250400,0x1400003e,0x4000000,0x44400000,0x1400003e,0x4000000,0x44e00000,0x1400003e,0x4000010,0x44400000, -0x1400003e,0x6800000,0x42d29800,0x1400003e,0x6800100,0x40962540,0x1400003e,0x6800100,0x40962541,0x1400003e,0x7c00100,0x42b30400,0x1400003e,0x7c00100,0x42b30401,0x1400003e, -0xc000010,0x44448000,0x14000057,0x4000000,0x44200000,0x14000057,0x4000010,0x45071400,0x14000057,0x6800000,0x41329800,0x14000057,0x7c00100,0x40230400,0x14000057,0x7c00100, -0x48230400,0x14000057,0x7c00500,0x40230400,0x14000057,0x7c00900,0x48230400,0x14000057,0xc000010,0x44b48000,0x1400005a,0x4000000,0x84500000,0x1400005a,0x7c00100,0x80230400, -0x1400005a,0xc000010,0x84b48000,0x1400005b,0x4000000,0x84200000,0x1400005b,0x4000010,0x84400000,0x1400005b,0x7c00100,0x80230400,0x14000065,0x4000010,0x84400000,0x14000065, -0x7c00100,0x80230400,0x140055be,0x4000000,0x4200000,0x1400800a,0x7c00100,0xfc230400,0x1400803e,0x7c00100,0x42b30400,0x1400803e,0x7c00100,0x42b30401,0x14010001,0x2802020, -0x10962460,0x14010001,0x2802400,0x10962460,0x14010013,0x2802500,0x20962460,0x14010015,0x2802100,0x8962460,0x1401003e,0x2802100,0x40962460,0x1401003e,0x2802100,0x40962461, -0x1401003e,0x2802400,0x40962460,0x1401003e,0x2802400,0x50962460,0x14010057,0x2802400,0x40962460,0x1401803e,0x2806400,0x42f62460,0x15000000,0x80020,0xc4218820,0x15000000, -0x4000000,0x4200000,0x15000000,0x4000000,0x4e00000,0x15000000,0x4000000,0xc200000,0x15000000,0x4000000,0x14200000,0x15000000,0x4000400,0x4200400,0x15000000,0x7c00500, -0x10230400,0x15000000,0x24000000,0x4200000,0x15000000,0x24000000,0x4400000,0x15000000,0x24000000,0x4810000,0x15000000,0x24000000,0x4e00000,0x15000000,0x24000000,0x5400000, -0x15000000,0x24000000,0x5410000,0x15000000,0x24000000,0x5710000,0x15000000,0x24000000,0xc400000,0x15000000,0x24000002,0x4200000,0x15000000,0x24000020,0x4200000,0x15000000, -0x24000020,0x4810000,0x15000000,0x24000020,0x5410000,0x15000000,0x24000500,0xc230400,0x15000000,0x2c000010,0xcb48000,0x15000002,0x4000000,0x5500000,0x15000002,0x4000020, -0x4200000,0x15000002,0x7c00100,0x8230400,0x15000002,0x7c00100,0x20230400,0x15000002,0x7c00100,0xfc230400,0x15000008,0x4000000,0x4200000,0x15000008,0x4000000,0xc200000, -0x15000008,0x7c00100,0x8220400,0x15000008,0x7c00100,0x8230400,0x15000008,0x7c00100,0x8250400,0x15000008,0x7c00500,0x8230400,0x1500000a,0x7c00100,0xfc230400,0x1500000a, -0x7c00500,0x8230400,0x1500000e,0x7c00100,0x8220400,0x1500000e,0x7c00100,0x8250400,0x1500000e,0x7c00100,0x10250400,0x15000019,0x7c00100,0x8220400,0x15000019,0x7c00100, -0x8230400,0x15000019,0x7c00100,0x8250400,0x15000019,0x7c00100,0x10220400,0x15000019,0x7c00100,0x10250400,0x15000019,0x7c00100,0x18220400,0x15000019,0x7c00100,0x18250400, -0x15000019,0x7c00100,0x20220400,0x15000019,0x7c00100,0x20250400,0x15000019,0x7c00100,0xc822040e,0x15000019,0x7c00100,0xc822040f,0x15000019,0x7c00100,0xfc250400,0x1500001a, -0x4000000,0x4200000,0x1500001a,0x4000000,0x5500000,0x1500001a,0x7c00100,0x8230400,0x1500001a,0x7c00100,0xfc230400,0x1500001b,0x7c00100,0x80230400,0x1500001c,0x4000000, -0x5800000,0x1500001c,0x6800000,0x21329800,0x1500001c,0x6800100,0x21862400,0x1500001c,0x6800100,0xfd862400,0x1500001c,0x6800100,0xfd862540,0x1500001c,0x6800500,0x21862400, -0x1500001c,0x6800500,0xfd862400,0x15000023,0x7c00100,0x10230400,0x15000024,0x4000000,0x4200000,0x15000024,0x7c00100,0x8230400,0x15000027,0x4000000,0x4200000,0x15000027, -0x4000000,0x4400000,0x15000027,0x4000000,0x4500000,0x15000027,0x7c00100,0x20230400,0x15000042,0x4000000,0x44e00000,0x15000042,0x6800000,0x42d29800,0x15000042,0x6800100, -0x40962540,0x15000042,0x7c00100,0x40430400,0x15000042,0x7c00100,0x42d30400,0x15000042,0xc000010,0x44448000,0x1500004f,0x6800000,0x41329800,0x1500004f,0x7c00100,0x40230400, -0x1500004f,0xc000010,0x44448000,0x15000052,0x4000010,0x44400000,0x15000052,0x6800000,0x41329800,0x15000052,0x6800100,0x40962540,0x15000052,0x7c00100,0x40230400,0x15000052, -0xc000010,0x44448000,0x15000063,0x4000010,0x44400000,0x15000063,0x6800000,0x41329800,0x15000063,0x7c00100,0x40230400,0x15000063,0x7c00100,0x48230400,0x15000063,0x7c00900, -0x40230400,0x15000063,0xc000010,0x44448000,0x15000063,0xc000010,0x44b48000,0x15000068,0x7c00100,0x80230400,0x1500006b,0x7c00100,0x80230400,0x1500006c,0x4000000,0x84200000, -0x1500006c,0x7c00100,0x80230400,0x1500006d,0x6800000,0x41329800,0x1500006d,0x7c00100,0x40230400,0x1500006d,0x7c00500,0x40230400,0x1500006d,0x7c00d00,0x40230400,0x1500006d, -0xc000010,0x44448000,0x1500006e,0x4000000,0x84200000,0x1500006e,0x6800100,0x80962540,0x1500006e,0x7c00100,0x80230400,0x1500006f,0x6800000,0x41329800,0x1500006f,0x6800100, -0x40962540,0x1500006f,0x7c00100,0x40230400,0x1500006f,0xc000010,0x44448000,0x15000071,0x6800000,0x41329800,0x15000071,0x6800100,0x40962540,0x15000596,0x24000000,0x84400000, -0x15000616,0x4000400,0x4400000,0x15004000,0x24000020,0x4810000,0x15004000,0x24000020,0x5410000,0x15005000,0x4000000,0x4e00000,0x15005000,0x24000000,0x4200000,0x15005005, -0x7c00100,0x40e30400,0x15005011,0x7c40300,0x20e30000,0x150055be,0x4000000,0x4e00000,0x1500801c,0x7c00100,0x21830000,0x1500801c,0x7c00100,0xfd830000,0x15008024,0x7c00100, -0x8230400,0x15008071,0x7c00100,0x40230400,0x15010001,0x2802000,0x8962460,0x15010001,0x2802000,0x10962460,0x15010001,0x2802000,0x18962460,0x15010001,0x2802100,0x18962460, -0x15010001,0x2802400,0x10962460,0x15010001,0x2802400,0x10c62460,0x15010001,0x2802400,0x18962460,0x15010002,0x2802100,0x20962460,0x15010008,0x2000,0xc962460,0x15010008, -0x2802100,0x8962460,0x15010008,0x2802400,0x20962460,0x15010010,0x2802100,0x20962460,0x1501001a,0x2802100,0x20962460,0x1501001c,0x2802100,0x21862460,0x1501001c,0x2802100, -0xfd862460,0x1501001c,0x2802500,0x21862460,0x1501001c,0x2806400,0xfd862460,0x1501001f,0x2802100,0x20962460,0x15010024,0x2802100,0x20962460,0x15010042,0x2802100,0x40962460, -0x1501004f,0x2802100,0x40962460,0x1501004f,0x2802400,0x40962460,0x15010052,0x2802100,0x40962460,0x15010052,0x2802400,0x40962460,0x15010052,0x2802d00,0x40962460,0x1501006e, -0x2802100,0x80962460,0x1501006e,0x2806400,0x80962460,0x1501006f,0x2806400,0x40962460,0x15010071,0x2802100,0x40962460,0x15010071,0x2806400,0x40962460,0x15010991,0x2802000, -0x10962460,0x15010c9c,0x2802400,0x18962460,0x15010c9c,0x2802400,0x20962460,0x16000000,0x4000000,0x4200000,0x16000000,0x4000000,0x5500000,0x16000000,0x4000000,0x5600000, -0x16000000,0x4000000,0xc8100006,0x16000000,0x4000000,0xc8200003,0x16000000,0x24000000,0x4200000,0x16000002,0x4000000,0x4200000,0x16000004,0x4000000,0x5600000,0x16000007, -0x7c00100,0x80220400,0x16000007,0x7c00100,0x80250400,0x16000008,0x7c00100,0xfc220400,0x16000008,0x7c00100,0xfc250400,0x1600000a,0x4000000,0xc200000,0x1600000a,0x6800100, -0x8962540,0x1600000a,0x7c00100,0x8230400,0x16000012,0x7c00100,0xa230500,0x16000012,0x7c00100,0xa330520,0x16000019,0x7c00100,0x8250400,0x1600001c,0x4000000,0x5800000, -0x1600001c,0x6800100,0x21862400,0x1600001c,0x6800500,0x21862400,0x1600001c,0x6800500,0xfd862400,0x1600001c,0x7c00100,0x21830000,0x1600001c,0x7c00900,0x21830000,0x16000028, -0x4000002,0x47000000,0x16000028,0x7c00100,0x40230400,0x1600003b,0x6800000,0x41329800,0x1600003b,0x7c00100,0x41830000,0x16000047,0x7c00100,0x80230400,0x16000047,0x7c00100, -0x80830400,0x16000047,0x7c00100,0x81430400,0x1600004e,0x4000000,0x44e00000,0x1600004e,0x4000010,0x44400000,0x1600004e,0x6800000,0x42d29800,0x1600004e,0x6800100,0x40962540, -0x1600004e,0x7c00100,0x42b30400,0x1600004e,0xc000010,0x44448000,0x16000058,0x7c00100,0x80230400,0x1600005b,0x4000000,0x84200000,0x1600006a,0x4000000,0x45800000,0x1600006a, -0x6800000,0x41329800,0x1600006a,0x6800100,0x41862400,0x1600006a,0x6800100,0x41862540,0x1600006a,0x7c00900,0x41830000,0x1600006a,0xc000010,0x45848000,0x16000073,0x6800000, -0x41329800,0x16000073,0x6800100,0x40962540,0x16000073,0x6800400,0x40962540,0x16000073,0x7c00100,0x40230400,0x16000073,0xc000010,0x44448000,0x16000074,0x4000000,0x84200000, -0x16000074,0x4000010,0x84400000,0x16000074,0x7c00100,0x80230400,0x16000075,0x4000000,0x84400000,0x16000075,0x4000010,0x84400000,0x16000075,0x7c00100,0x80230400,0x16000078, -0x4000000,0x84200000,0x16000078,0x6800100,0x80962540,0x16000078,0x7c00100,0x80230400,0x16000078,0x7c00100,0x80230401,0x16000078,0xc000010,0x84448000,0x16000078,0x80000000, -0x85329960,0x1600007a,0x4000000,0x84200000,0x1600007a,0x7c00100,0x80230400,0x1600007d,0x4000000,0x84200000,0x1600007d,0x7c00100,0x80230400,0x1600007e,0x4000000,0x84200000, -0x1600007e,0x4000010,0x84200000,0x1600007e,0x7c00100,0x80230400,0x1600007e,0xc000010,0x84248000,0x1600007f,0x4000000,0x45800000,0x1600007f,0x4000010,0x45800000,0x1600007f, -0x7c00100,0x41830000,0x1600007f,0x7c00500,0x41830000,0x1600007f,0x7c00900,0x41830000,0x1600007f,0x7e00100,0x41830000,0x16000082,0x4000000,0x44200000,0x16000082,0x4000010, -0x44400000,0x16000082,0x7c00100,0x40230400,0x16000082,0xc000010,0x44448000,0x16000083,0x4000010,0x44400000,0x16000083,0x7c00100,0x40230400,0x16000083,0xc000010,0x44448000, -0x16000085,0x4000000,0x84200000,0x16000085,0x7c00100,0x80230400,0x16000540,0x7c00100,0x8230400,0x16000542,0x4000400,0xc200000,0x1600055c,0x6800400,0x8962540,0x16000561, -0x7c00100,0x8230400,0x16000564,0x7c00100,0x8230400,0x16000567,0x7c00100,0x8230400,0x1600056d,0x7c00100,0x8230400,0x16000598,0x24000000,0xc400000,0x160005d7,0x4000000, -0x4200000,0x160005e7,0x4000000,0x4200000,0x160005f6,0x4000000,0x4200000,0x16000601,0x4000000,0x5500000,0x16000619,0x7c00900,0x60430400,0x16000e14,0x7c00100,0x8230400, -0x16001000,0x4000000,0x4100000,0x16001000,0x4000000,0xc8100002,0x16001000,0x4000000,0xc8100003,0x16001000,0x4000000,0xc8100006,0x16001000,0x4000000,0xc810000d,0x16001000, -0x4000100,0x4150400,0x16001000,0x4000100,0xc815040d,0x16001000,0x24000000,0x4100000,0x16001000,0x24000000,0x4e00000,0x16001000,0x24000000,0x6800000,0x16005000,0x4000000, -0xc8e00002,0x16005000,0x4000000,0xc8e0000d,0x16005000,0x24000000,0x4100000,0x16005000,0x24000000,0x4e00000,0x16005011,0x7c00300,0xc8e30001,0x16005011,0x7c40300,0x20e30000, -0x16005012,0x7c00100,0xa130480,0x16005014,0x4000000,0xc8e0000d,0x160055be,0x4000000,0xc8e00003,0x1600800a,0x7c00100,0x20230400,0x1600801c,0x7c00100,0x21830000,0x1600804e, -0x7c00100,0x42b30400,0x1600806a,0x7c00100,0x41830000,0x16008073,0x7c00100,0x40230400,0x16010001,0x2802400,0x10962460,0x16010007,0x2802400,0x80962460,0x16010007,0x2802400, -0x90962460,0x1601000a,0x2802100,0x20962460,0x1601000a,0x2802400,0x8962460,0x1601001c,0x2802100,0x21862460,0x1601004e,0x2802100,0x40962460,0x1601004e,0x2802400,0x40962460, -0x1601006a,0x2802100,0x41862460,0x1601006a,0x2802400,0x40962460,0x1601006a,0x2802400,0x41862460,0x16010073,0x2802100,0x40962460,0x16010073,0x2806400,0x40962460,0x16010078, -0x2802100,0x80962460,0x16010078,0x2802400,0x80962460,0x16010078,0x2806400,0x80962460,0x1601007e,0x2802000,0x80962460,0x1601007e,0x2802100,0x80962460,0x1601007e,0x2802400, -0x80962460,0x1601007f,0x2802100,0x41862460,0x1601007f,0x2802400,0x41862460,0x16010082,0x2802400,0x40962460,0x16010940,0x2802400,0x8962460,0x16010941,0x2802400,0x8962460, -0x16010945,0x2802400,0x8962460,0x1601094a,0x2802400,0x8962460,0x1601094d,0x2802400,0x8962460,0x16010950,0x2802400,0x8962460,0x16010954,0x2802400,0x8962460,0x16010956, -0x2802400,0x8962460,0x1601095e,0x2802400,0x8962460,0x16010969,0x2802400,0x8962460,0x16010e10,0x2802400,0x8962460,0x1601804e,0x2806400,0x42f62460,0x1601806a,0x2806400, -0x41862460,0x18000000,0x4000000,0x4200000,0x18000000,0x4000000,0x4e00000,0x18000000,0x4000000,0x5600000,0x18000000,0x4000000,0x6703580,0x18000000,0x24000000,0x4200000, -0x18000000,0x24000000,0x4e00000,0x18000000,0x24000000,0x5710000,0x18000000,0x24000020,0x4200000,0x18000002,0x4000000,0x14200000,0x18000002,0x7c00100,0xfc230400,0x18000008, -0x7c00100,0x8220400,0x18000008,0x7c00100,0x8250400,0x1800000a,0x6800100,0xfc962540,0x1800000a,0x7c00100,0xfc230400,0x1800000b,0x7c00100,0x20230400,0x18000019,0x7c00100, -0x8220400,0x18000019,0x7c00100,0x8250400,0x18000019,0x7c00100,0x10220400,0x18000019,0x7c00100,0xc822040e,0x18000019,0x7c00100,0xfc250400,0x1800001a,0x7c00100,0x8230560, -0x1800001f,0x4000000,0x4200000,0x18000027,0x4000000,0x4c00000,0x18000027,0x7c00100,0x8230400,0x1800003c,0x4000000,0x44400000,0x1800003f,0x4000000,0x44200000,0x1800003f, -0x6800100,0x40962540,0x1800003f,0x7c00100,0x42d30400,0x18000041,0x4000000,0x84e00000,0x18000041,0x4000010,0x84e00000,0x18000041,0x6800000,0x82d29800,0x18000041,0x6800100, -0x80962540,0x18000041,0x7c00100,0x82b30400,0x18000041,0x7c00100,0x82c30400,0x18000041,0xc000010,0x84448000,0x18000054,0x4000010,0x44200000,0x18000054,0x7c00100,0x40230400, -0x18000082,0x7c00100,0x40230400,0x18001000,0x4000000,0x4100000,0x18001000,0x4000000,0xc810000d,0x18001000,0x4000100,0x4150400,0x18001000,0x4000100,0xc815040d,0x18005000, -0x4000000,0x4100000,0x18005000,0x4000000,0x4200000,0x18005000,0x4000000,0x4e00000,0x18005000,0x4000000,0x6800000,0x18005000,0x4000000,0xc8e0000d,0x18005000,0x24000000, -0x4200000,0x18005000,0x24000000,0x4e00000,0x18005000,0x24000000,0x6800000,0x18005005,0x7c00100,0x40e30400,0x18005011,0x7c40300,0x20e30000,0x18005014,0x7c00100,0x8e30000, -0x18005016,0x7c00100,0x8e30c00,0x180055be,0x4000000,0xc8e00003,0x1800801a,0x7c00100,0x8230400,0x1800801a,0x7c00100,0x20230400,0x18010001,0x2802400,0x10c62460,0x18010002, -0x2802100,0x20962460,0x1801000a,0x2802100,0xfc962460,0x1801000b,0x2802400,0x20962460,0x18010027,0x2802100,0x8962460,0x1801003c,0x2806000,0x40962460,0x1801003f,0x2802100, -0x40962460,0x1801003f,0x2802400,0x40962460,0x1801003f,0x2806400,0x42e62460,0x18010041,0x2802100,0x80962460,0x18010041,0x2806400,0x82f62460,0x18010054,0x2802000,0x40962460, -0x19000000,0x4000000,0x4200000,0x19000000,0x4000000,0xc820000f,0x19000000,0x24000000,0x4200000,0x19000000,0x24000000,0x4400000,0x19000000,0x24000000,0xc200000,0x19000000, -0x24000002,0x4300000,0x19000000,0x24000020,0x4200000,0x19000002,0x4000020,0x4200000,0x19000002,0x7c00100,0x20230400,0x19000002,0x7c00100,0xfc230400,0x19000002,0x7c00120, -0xc8230405,0x19000002,0x80000000,0x5329960,0x19000003,0x4000000,0x5600000,0x19000007,0x7c00100,0x80220400,0x19000007,0x7c00100,0x80250400,0x1900000c,0x7c00100,0x10220400, -0x1900000c,0x7c00100,0x20230400,0x1900000c,0x7c00100,0xfc250400,0x1900000f,0x4000000,0x4200000,0x19000018,0x7c00100,0x21830000,0x19000019,0x7c00100,0x20220400,0x19000019, -0x7c00100,0x20250400,0x19000019,0x7c00100,0xfc250400,0x19000019,0x7c00500,0xc822040f,0x1900003c,0x7c00100,0x40230400,0x19000056,0x7c00100,0x80230400,0x1900005c,0x6800100, -0x40962540,0x1900005c,0x7c00100,0x40230400,0x1900005c,0x7c00500,0x40230400,0x19000071,0x4000000,0x44200000,0x19000071,0x7c00100,0x40230400,0x19000073,0x6800100,0x40962540, -0x19000073,0x7c00100,0x40230400,0x19000073,0x7c00900,0x40230400,0x19000073,0xc000010,0x44448000,0x19000076,0x4000000,0x44400000,0x19000076,0x6800000,0x41329800,0x19000076, -0x6800100,0x40962540,0x19000076,0xc000010,0x44448000,0x1900008d,0x7c00100,0x80230400,0x19000097,0x4000000,0x84200000,0x19000097,0x4000000,0x84400000,0x19000097,0x6800000, -0x81329800,0x19000097,0x6800100,0x80962540,0x19000097,0x7c00100,0x80230400,0x19000097,0x7c00100,0x80230560,0x19000097,0xc000010,0x84448000,0x19000098,0x6800000,0x81329800, -0x19000098,0x7c00100,0x80230400,0x19000099,0x6800000,0x81329800,0x19000099,0x6800100,0x80962540,0x19000099,0x7c00100,0x80230400,0x1900055c,0x7c00100,0x8230400,0x19000578, -0x7c00100,0x8230400,0x19005000,0x4000000,0x4e00000,0x19005011,0x7c00300,0xc8e30001,0x19005011,0x7c40300,0x20e30000,0x19008071,0x7c00100,0x40230400,0x19008073,0x7c00100, -0x40230400,0x19008076,0x7c00100,0x40230400,0x19010002,0x2802400,0x20962460,0x19010002,0x2802500,0x20962460,0x19010008,0x2802100,0x8962460,0x1901005c,0x2802500,0x40962460, -0x19010071,0x2802100,0x40962460,0x19010073,0x2802100,0x40962460,0x19010076,0x2802100,0x40962460,0x19010076,0x2802100,0x40962461,0x19010076,0x2806400,0x40962460,0x19010097, -0x2802100,0x80962460,0x19010097,0x2806400,0x80962460,0x19010099,0x2802100,0x80962460,0x19010099,0x2802400,0x80962460,0x19010099,0x2806400,0x80962460,0x1901097a,0x2802400, -0x8962460,0x19018071,0x2806400,0x40962460,0x19018073,0x2806400,0x40962460,0x19018076,0x2806400,0x40962460,0x1a000000,0x4000000,0x5600000,0x1b000000,0x80000,0xc4918820, -0x1b000caf,0x80000,0xc4918820,0x1c000000,0x4000000,0x4100000,0x1c000000,0x4000000,0x4200000,0x1c000000,0x4000000,0x4e00000,0x1c000000,0x4000000,0x5200000,0x1c000000, -0x4000000,0x5500000,0x1c000000,0x4000000,0x5600000,0x1c000000,0x4000000,0x5710000,0x1c000000,0x4000000,0x6800000,0x1c000000,0x4000400,0x4200400,0x1c000000,0x24000000, -0x4200000,0x1c000000,0x24000000,0x4400000,0x1c000000,0x24000000,0x4e00000,0x1c000000,0x24000002,0x7000000,0x1c000000,0x24000008,0x5410000,0x1c000000,0x80000000,0x5329960, -0x1c000002,0x7c00100,0x8230400,0x1c000002,0x7c00100,0x20230400,0x1c000003,0x4000000,0x4200000,0x1c000004,0x7c00100,0x8230400,0x1c000008,0x7c00100,0x8220400,0x1c000008, -0x7c00100,0x8250400,0x1c000008,0x7c00500,0xc822040f,0x1c00000e,0x4000000,0x4200000,0x1c00000e,0x7c00100,0x8220400,0x1c00000e,0x7c00100,0x8250400,0x1c000019,0x7c00100, -0x8220400,0x1c000019,0x7c00100,0x8230400,0x1c000019,0x7c00100,0x8250400,0x1c000019,0x7c00500,0xc822040f,0x1c00001c,0x6800000,0x21329800,0x1c00001c,0x6800500,0x21862400, -0x1c00001c,0x7c00900,0x9830000,0x1c00001e,0x7c00100,0x80230400,0x1c000020,0x7c00100,0x80230400,0x1c000021,0x4000000,0x4200000,0x1c000021,0x6800000,0x21329800,0x1c000030, -0x7c00100,0x40230400,0x1c00004b,0x4000000,0x84200000,0x1c00004b,0x4000010,0x84400000,0x1c00004b,0x6800000,0x81329800,0x1c00004b,0x7c00100,0x80230400,0x1c00004b,0x7c00900, -0x80230400,0x1c00004b,0xc000010,0x84448000,0x1c000053,0x7c00100,0x80230400,0x1c000059,0x7c00100,0x80230400,0x1c000065,0x4000010,0x84400000,0x1c000065,0x7c00100,0x80230400, -0x1c000079,0x4000000,0x84200000,0x1c000079,0x4000000,0x84f00000,0x1c000079,0x4000010,0x84400000,0x1c000079,0x7c00100,0x80230400,0x1c00007b,0x4000000,0x84200000,0x1c00007b, -0x4000010,0x84200000,0x1c00007b,0x7c00100,0x80230400,0x1c000086,0x7c00100,0x80230400,0x1c000086,0xc000010,0x84448000,0x1c000087,0x4000000,0x84200000,0x1c000087,0x7c00100, -0x80230400,0x1c000087,0xc000010,0x84448000,0x1c000088,0x7c00100,0x80230400,0x1c000089,0x6800100,0x80962540,0x1c000089,0x6800100,0x80962541,0x1c000089,0x7c00100,0x80430400, -0x1c000089,0x7c00100,0x82b30400,0x1c000089,0x7c00100,0x82d30400,0x1c000089,0x7c00900,0x80430400,0x1c00008c,0x4000000,0x84200000,0x1c00008c,0x7c00100,0x80230400,0x1c00008e, -0x4000000,0x84200000,0x1c00008e,0x7c00100,0x80230400,0x1c00008f,0x4000000,0x84200000,0x1c00008f,0x7c00100,0x80230400,0x1c000090,0x4000000,0x84200000,0x1c000090,0x7c00100, -0x80230400,0x1c000091,0x6800000,0x81329800,0x1c000091,0x6800100,0x80962540,0x1c000091,0x7c00100,0x80230400,0x1c000092,0x4000000,0x84200000,0x1c000092,0x6800000,0x81329800, -0x1c000092,0x7c00100,0x80220400,0x1c000092,0x7c00100,0x80230400,0x1c000092,0x7c00100,0x80250400,0x1c000095,0x6800000,0xa1329800,0x1c000095,0x7c00100,0xa0230400,0x1c000095, -0xc000010,0x84448000,0x1c000097,0x7c00100,0x80230400,0x1c000097,0xc000010,0x84248000,0x1c00009d,0x4000000,0x84200000,0x1c00009d,0x4000010,0x84200000,0x1c00009d,0x6800100, -0x80962540,0x1c00009d,0x7c00100,0x80230400,0x1c00009d,0xc000010,0x84448000,0x1c00009e,0x4000000,0x84200000,0x1c00009e,0x6800000,0x81329800,0x1c00009e,0x6800100,0x80962540, -0x1c00009e,0x6800100,0x80962541,0x1c00009e,0x7c00100,0x80230400,0x1c00009f,0x4000000,0x84200000,0x1c00009f,0x7c00100,0x80230400,0x1c0000a0,0x4000000,0x84200000,0x1c0000a0, -0x4000000,0x84500000,0x1c0000a0,0x7c00100,0x80230400,0x1c0000a3,0x4000000,0x84200000,0x1c0000a3,0x6800000,0x81329800,0x1c0000a3,0x6800100,0x80962540,0x1c0000a3,0x7c00100, -0x80230400,0x1c0000a3,0xc000010,0x84448000,0x1c0000a5,0x7c00100,0x80230400,0x1c0000a6,0x4000000,0x84500000,0x1c0000a6,0x4000010,0x84b00000,0x1c0000a6,0x4000800,0x84200000, -0x1c0000a6,0x6800100,0x80962540,0x1c0000a6,0x6800100,0x80962541,0x1c0000a6,0x7c00100,0x80230400,0x1c0000a6,0xc000010,0x84448000,0x1c00045f,0x80000,0xc4918820,0x1c00045f, -0x2c000010,0x84448000,0x1c00059f,0x24000010,0x4400000,0x1c000629,0x4000000,0xc200000,0x1c000e2d,0x4000010,0x84400000,0x1c000e2f,0x6800100,0xfc962540,0x1c005000,0x4000000, -0x4e00000,0x1c005000,0x4000000,0x6800000,0x1c00800a,0x7c00100,0x8230400,0x1c00801c,0x7c00100,0x9830000,0x1c00801c,0x7c00100,0x21830000,0x1c008024,0x7c00100,0x8230400, -0x1c010001,0x2400,0x4962460,0x1c010001,0x2802100,0x10962460,0x1c010001,0x2802400,0x8962460,0x1c010001,0x2802400,0x10962460,0x1c010001,0x2802400,0x10c62460,0x1c010002, -0x2802100,0x20962460,0x1c010015,0x2802100,0x8962460,0x1c01001a,0x2802100,0x8962460,0x1c01001c,0x2802500,0x9862460,0x1c01001c,0x2802500,0x21862460,0x1c010024,0x2802100, -0x8962460,0x1c010041,0x2806000,0x80c62460,0x1c01004b,0x2802400,0x80962460,0x1c010059,0x2802100,0x80962460,0x1c010079,0x2802400,0x80962460,0x1c010086,0x2802400,0x80962460, -0x1c010087,0x2802000,0x80962460,0x1c010087,0x2802100,0x80962460,0x1c010089,0x2802100,0x80962460,0x1c010089,0x2802400,0x80962460,0x1c010089,0x2806400,0x82f62460,0x1c01008c, -0x2802400,0x80962460,0x1c010091,0x2802100,0x80962460,0x1c010091,0x2802400,0x80962460,0x1c010091,0x2806400,0x80962460,0x1c01009d,0x2802100,0x80962460,0x1c01009d,0x2802400, -0x80962460,0x1c01009d,0x2802900,0x80962460,0x1c01009d,0x2806400,0x80962460,0x1c01009e,0x2802100,0x80962460,0x1c01009e,0x2802400,0x80962460,0x1c01009e,0x2806400,0x80962460, -0x1c0100a0,0x2802400,0x80962460,0x1c0100a3,0x2802100,0x80962460,0x1c0100a3,0x2806400,0x80962460,0x1c0100a6,0x2802100,0x80962460,0x1c0100a6,0x2802400,0x80962460,0x1c0100a6, -0x2806400,0x80962460,0x1c010978,0x2802400,0x8962460,0x1c010a29,0x2802400,0x8962460,0x1c010e2f,0x2802100,0xfc962460,0x1c010e2f,0x2802400,0xfc962460,0x20000000,0x4000000, -0x5500000,0x20000000,0x4000000,0x24200000,0x20000000,0x4000000,0x24e00000,0x20000000,0x4000000,0x34200000,0x20000000,0x24000000,0x24200000,0x20000002,0x7c00100,0x20230400, -0x20000006,0x7c00100,0x40220400,0x20000006,0x7c00100,0x40250400,0x2000000a,0x4000000,0x2c500000,0x2000000a,0x7c00100,0x28230400,0x20000019,0x7c00100,0x20220400,0x20000019, -0x7c00100,0x20230400,0x20000019,0x7c00100,0x20250400,0x2000001a,0x7c00100,0x8230400,0x2000004c,0x4000000,0x84200000,0x2000004c,0x7c00100,0x80220400,0x2000004c,0x7c00100, -0x80250400,0x20000065,0x7c00100,0x80230400,0x20000070,0x4000000,0x84200000,0x20000070,0x4000010,0x84400000,0x20000070,0xc000010,0x84448000,0x20000089,0x7c00100,0x82d30400, -0x2000008d,0x4000000,0x84200000,0x20000097,0x4000000,0x84400000,0x20000097,0x4000000,0x84500000,0x20000097,0x7c00100,0x80230400,0x20000097,0xc000010,0x84448000,0x2000009c, -0x7c00100,0x80230400,0x2000009c,0x7c00100,0x80830400,0x2000009c,0x7c00100,0x81430400,0x200000a1,0x4000000,0x85800000,0x200000a1,0x6800000,0x81329800,0x200000a1,0x6800100, -0x81862400,0x200000a1,0x6800100,0x81862540,0x200000a1,0x7c00100,0x81830000,0x200000a1,0xc000010,0x84448000,0x200000a2,0x4000000,0x84200000,0x200000a2,0x7c00100,0x80230400, -0x200000a4,0x7c00100,0x80230400,0x200000a4,0xc000010,0x84448000,0x200000a6,0x7c00100,0x80230400,0x200000a6,0xc000010,0x84448000,0x20005000,0x4000000,0x4e00000,0x20005000, -0x4000000,0x6800000,0x20005011,0x7c40300,0x20e30000,0x2000800f,0x7c00100,0x20230400,0x20008024,0x7c00100,0x20230400,0x20010002,0x2802500,0x20962460,0x20010008,0x2802100, -0x28962460,0x20010008,0x2802400,0x30962460,0x20010008,0x2802400,0x30c62460,0x20010070,0x2802000,0x80962460,0x20010089,0x2802100,0x80962460,0x20010097,0x2802000,0x80962460, -0x20010097,0x2802400,0x80962460,0x200100a1,0x2802100,0x81862460,0x200100a1,0x2806400,0x81862460,0x200100a6,0x2802100,0x80962460,0x20015000,0x4000000,0x6902460,0x24000000, -0x4000000,0x4e00000,0x24000000,0x24000000,0x4200000,0x24000000,0x24000000,0x4400000,0x24000000,0x80000000,0x5329960,0x24000002,0x7c00100,0x20230400,0x24000002,0x7c00100, -0xfc230400,0x24000008,0x7c00100,0x8220400,0x2400000e,0x4000000,0x4200000,0x24000015,0x7c00100,0x20230400,0x24000019,0x7c00100,0x10250400,0x2400001a,0x4000000,0x4200000, -0x2400001a,0x7c00100,0x20230400,0x2400001b,0x4000000,0x84500000,0x240000a7,0x4000000,0x45400000,0x240000a7,0x6800000,0x41329800,0x240000a7,0x7c00100,0x40220400,0x240000a7, -0x7c00100,0x40250400,0x240000a8,0x4000000,0x84200000,0x240000a8,0x4000000,0x84400000,0x240000a8,0x4000010,0x84400000,0x240000a8,0x6800000,0x81329800,0x240000a8,0x6800100, -0x80962540,0x240000a8,0x7c00100,0x80230400,0x240000a8,0xc000010,0x84448000,0x240000a9,0x4000000,0x84500000,0x240000a9,0x4000010,0x84b00000,0x240000a9,0x6800100,0x80962540, -0x240000a9,0x7c00100,0x80230400,0x240000aa,0x4000000,0x44200000,0x240000aa,0x4000000,0x44400000,0x240000aa,0x4000010,0x44400000,0x240000aa,0x6800000,0x41329800,0x240000aa, -0x6800100,0x40962540,0x240000aa,0x7c00100,0x40230400,0x240000aa,0xc000010,0x44448000,0x240000ab,0x7c00100,0x40220400,0x240000ab,0x7c00100,0x40250400,0x2400049a,0x24000000, -0x4400000,0x24001000,0x4000000,0x4100000,0x24005000,0x4000000,0x4e00000,0x24005000,0x4000000,0x6800000,0x24005000,0x4000000,0xc8e0000d,0x2400509a,0x7c00300,0x80e30000, -0x2400509a,0x7c00900,0x81230400,0x24010001,0x2802400,0x10962460,0x24010002,0x2802000,0x20962460,0x24010002,0x2802100,0x20962460,0x24010038,0x2802100,0x80962460,0x2401006f, -0x2802100,0x40962460,0x2401009d,0x2802100,0x80962460,0x240100a7,0x2802100,0x40962460,0x240100a7,0x2802400,0x40962460,0x240100a7,0x2802c00,0x40962460,0x240100a8,0x2802100, -0x80962460,0x240100a8,0x2806400,0x80962460,0x240100a9,0x2802100,0x80962460,0x240100aa,0x2802100,0x40962460,0x240100aa,0x2802400,0x40962460,0x240100aa,0x2806400,0x40962460, -0x28000000,0x4000000,0x4200000,0x28000000,0x4000000,0x4e00000,0x28000000,0x4000000,0x5600000,0x28000000,0x24000000,0x4200000,0x28000000,0x24000000,0x4400000,0x28000004, -0x4000000,0x4200000,0x28000004,0x7c00100,0x8230400,0x2800001e,0x7c00100,0x80230400,0x28000022,0x7c00100,0x40230400,0x280000af,0x6800000,0x81329800,0x280000af,0x7c00100, -0x80230400,0x280000af,0x7c00100,0x80230560,0x280000b0,0x4000000,0x84400000,0x280000b0,0x4000000,0x84500000,0x280000b0,0x4000010,0x84400000,0x280000b0,0x6800100,0x80962540, -0x280000b0,0x7c00100,0x80230560,0x280000b0,0xc000010,0x84448000,0x280000b1,0x4000000,0x84200000,0x280000b1,0x4000000,0x84400000,0x280000b1,0x4000000,0x84500000,0x280000b1, -0x6800100,0x80962540,0x280000b1,0x7c00100,0x80230400,0x280000b1,0xc000010,0x84448000,0x2800057e,0x6800400,0x8962540,0x28005000,0x4000000,0x4e00000,0x28005000,0x4000000, -0x6800000,0x28005005,0x7c00100,0x48e30400,0x28005011,0x7c40300,0x20e30000,0x28005014,0x7c00100,0x8e30000,0x28005096,0x7c00300,0x80e30000,0x28005096,0x7c00900,0x81230400, -0x280080b0,0x7c00100,0x80230400,0x280080b1,0x7c00100,0x80230400,0x28010001,0x2802400,0x10962460,0x2801000f,0x2802100,0x20962460,0x2801000f,0x2802400,0x20962460,0x2801000f, -0x2802900,0x20962460,0x2801001a,0x2802100,0x20962460,0x2801001a,0x2806400,0x8962460,0x280100af,0x2802100,0x80962460,0x280100af,0x2802400,0x80962460,0x280100af,0x2806400, -0x80962460,0x280100b0,0x2802100,0x80962460,0x280100b0,0x2802800,0x80962460,0x280100b1,0x2802000,0x80962460,0x280100b1,0x2802100,0x80962460,0x280100b1,0x2806400,0x80962460, -0x2801097f,0x2802400,0x10962460,0x280180b0,0x2806400,0x80962460,0x280180b1,0x2806400,0x80962460,0x2c000000,0x4000000,0x4200000,0x2c000000,0x4000000,0x4e00000,0x2c000000, -0x4000000,0x5500000,0x2c000000,0x24000000,0x4200000,0x2c000000,0x24000000,0x4400000,0x2c000000,0x24000010,0x4400000,0x2c000003,0x7c00100,0x10220400,0x2c00000a,0x7c00100, -0x8230400,0x2c00000c,0x7c00100,0xfc230400,0x2c000010,0x4000000,0x4200000,0x2c000013,0x7c00100,0x22633800,0x2c000015,0x4000000,0x4500000,0x2c000019,0x7c00100,0x10220400, -0x2c000019,0x7c00100,0x20220400,0x2c000019,0x7c00100,0x20250400,0x2c00001b,0x7c00100,0x80230400,0x2c000039,0x4000000,0x84200000,0x2c000057,0x4000000,0x45600000,0x2c000076, -0x6800100,0x40962540,0x2c000078,0x80000000,0x85329960,0x2c0000a1,0x7c00100,0x81830000,0x2c0000b0,0x7c00100,0x80230400,0x2c0000b2,0x4000000,0x84200000,0x2c0000b2,0x6800100, -0x80962540,0x2c0000b2,0x7c00100,0x80230400,0x2c0000b3,0x6800000,0x81329800,0x2c0000b3,0x6800100,0x80962540,0x2c0000b3,0x7c00100,0x80230400,0x2c0000b4,0x6800100,0x80962540, -0x2c0000b4,0x7c00100,0x80430400,0x2c0000b4,0x7c00100,0x82d30400,0x2c0000b4,0xc000010,0x84448000,0x2c0000b5,0x4000000,0x84200000,0x2c0000b5,0x4000010,0x84400000,0x2c0000b5, -0x7c00100,0x80220400,0x2c0000b5,0x7c00100,0x80250400,0x2c0000b5,0xc000010,0x84448000,0x2c0000b6,0x6800000,0x41329800,0x2c0000b6,0x7c00100,0x40230400,0x2c0000b6,0x7c00500, -0x40230400,0x2c0000b7,0x4000000,0x84200000,0x2c0000b7,0x7c00100,0x80230400,0x2c0000b7,0xc000010,0x84248000,0x2c0000b8,0x4000000,0x84200000,0x2c0000b8,0x7c00100,0x80230400, -0x2c005000,0x4000000,0x4200000,0x2c005000,0x4000000,0x4e00000,0x2c005000,0x4000000,0x6800000,0x2c005005,0x7c00100,0x40e30400,0x2c005011,0x7c40300,0x20e30000,0x2c00509a, -0x7c00300,0x80e30000,0x2c008039,0x7c00100,0x80230400,0x2c008076,0x7c00100,0x40230400,0x2c010002,0x2802000,0x20962460,0x2c010004,0x2802000,0x20962460,0x2c01000a,0x2802100, -0x8962460,0x2c010024,0x2802100,0x20962460,0x2c010057,0x2802000,0x40962460,0x2c0100aa,0x2802000,0x40962460,0x2c0100b2,0x2802100,0x80962460,0x2c0100b2,0x2802400,0x80962460, -0x2c0100b2,0x2806400,0x80962460,0x2c0100b3,0x2802100,0x80962460,0x2c0100b3,0x2806400,0x80962460,0x2c0100b4,0x2802100,0x80962460,0x2c0100b6,0x2802500,0x40962460,0x2c0100b7, -0x2802400,0x80962460,0x2c010928,0x2802400,0x20962460,0x30000000,0x4000000,0x4200000,0x30000000,0x4000000,0xc820000f,0x30000000,0x24000000,0x4200000,0x30000000,0x24000010, -0x4400000,0x30000018,0x7c00100,0x21830000,0x30000019,0x7c00100,0x8250400,0x30000019,0x7c00100,0x10220400,0x30000019,0x7c00100,0x10250400,0x30000019,0x7c00100,0x20220400, -0x30000019,0x7c00100,0x20250400,0x30000023,0x4000000,0x4200000,0x30000023,0x4000000,0x4400000,0x30000023,0x4000000,0x5500000,0x30000024,0x4000000,0x4500000,0x30000047, -0,0x84818820,0x30000047,0,0x84c18820,0x30000047,0,0x85418820,0x3000005c,0x6800100,0x40962540,0x3000005c,0x7c00100,0x40230400,0x30000099,0x7c00100, -0x80230400,0x300000a7,0x7c00100,0x40230400,0x300000aa,0x7c00100,0x40230400,0x300000b0,0x7c00100,0x80230560,0x300000b9,0x7c00100,0x80230400,0x300000ba,0x4000000,0x44200000, -0x300000ba,0x6800000,0x41329800,0x300000ba,0x7c00100,0x40230400,0x300000ba,0x7c00900,0x40230400,0x300000bb,0x4000000,0x84500000,0x300000bb,0x6800100,0x80962540,0x300000bb, -0x7c00100,0x80230400,0x300000bc,0x4000000,0x45600000,0x300000bc,0x6800000,0x41329800,0x300000bc,0x7c00100,0x40230400,0x300004db,0x7c00100,0x80230400,0x30000d2a,0x4000000, -0x4200000,0x30005000,0x4000000,0x4e00000,0x30005000,0x4000000,0x6800000,0x30005011,0x4000000,0x5200000,0x30005011,0x7c00900,0x9230400,0x30005014,0x7c00100,0xa530000, -0x30005016,0x7c00100,0xa530c00,0x3000509a,0x7c00300,0x80e30000,0x30010018,0x2806400,0x21862460,0x3001005c,0x2802100,0x40962460,0x300100ba,0x2802400,0x40962460,0x300100bb, -0x2802100,0x80962460,0x300100bb,0x2806400,0x80962460,0x300100bc,0x2802400,0x40962460,0x310055be,0x4000000,0xc8e0000d,0x34000000,0x4000000,0x4200000,0x34000000,0x4000400, -0x4200000,0x34000000,0x6800000,0xc9329805,0x34000000,0x24000000,0x4200000,0x34000002,0x7c00100,0x20230400,0x34000002,0x7c00100,0xfc230400,0x34000019,0x7c00100,0x8220400, -0x34000019,0x7c00100,0x8250400,0x34000019,0x7c00100,0x10220400,0x34000019,0x7c00500,0xc822040f,0x3400001a,0x7c00100,0x18230400,0x34000083,0x7c00100,0x40230400,0x34000097, -0x6800100,0x80962540,0x340000aa,0x4000010,0x44400000,0x340000aa,0x7c00100,0x40230400,0x340000bd,0x4000000,0x84200000,0x340000bd,0x7c00100,0x80230400,0x340000be,0x4000000, -0x84400000,0x340000be,0x6800000,0x82d29800,0x340000be,0x6800100,0x80962540,0x340000be,0x6800100,0x80962541,0x340000be,0x7c00100,0x82c30560,0x340000be,0xc000010,0x84448000, -0x340000c0,0x4000002,0x87000000,0x340000c0,0x7c00100,0x80230400,0x34005000,0x4000000,0x4e00000,0x34005000,0x4000000,0x6800000,0x34005005,0x7c00100,0x40e30400,0x34005011, -0x7c40300,0x20e30000,0x3400509a,0x7c00300,0x80e30000,0x340050bf,0x7c00300,0x80230000,0x34008076,0x7c00100,0x40230400,0x340080be,0x7c00100,0x82b30400,0x34010001,0x2802100, -0x10962460,0x3401001f,0x2802c00,0x20962460,0x34010021,0x2802100,0x10962460,0x3401003a,0x2806400,0x40962460,0x34010097,0x2802100,0x80962460,0x340100be,0x2802100,0x80962460, -0x340100be,0x2802400,0x80962460,0x340100be,0x2806400,0x80962460,0x340100c0,0x2802100,0x80962460,0x34015011,0x2802500,0x8962460,0x340150bf,0x2802200,0x80c62460,0x340180be, -0x2806400,0x82f62460,0x38000000,0x4000000,0x5500000,0x38000000,0x4000000,0x14200000,0x38000000,0x24000000,0x5410000,0x38000000,0x24000000,0x6410000,0x38000000,0x24000002, -0x7000000,0x38000000,0x2c000010,0x4b48000,0x38000002,0x4000000,0x14200000,0x38000002,0x7c00100,0x8230400,0x38000002,0x7c00100,0x10230400,0x38000002,0x7c00100,0x20230400, -0x38000002,0x7c00500,0x10230400,0x38000002,0xc000010,0x4b48000,0x38000002,0x80000000,0x5329960,0x3800000b,0x7c00100,0xfc230400,0x38000015,0x7c00100,0x20230400,0x38000019, -0x7c00100,0x8220400,0x38000019,0x7c00100,0x8250400,0x38000019,0x7c00100,0x10220400,0x38000019,0x7c00100,0x10230400,0x38000019,0x7c00100,0xc822040f,0x38000019,0x7c00500, -0x20220400,0x38000019,0x7c00500,0xc822040f,0x38000019,0x7c00d00,0xc823040f,0x38000024,0x7c00100,0x20230400,0x38000028,0x7c00100,0x40230400,0x3800002a,0x7c00100,0x80230400, -0x38000038,0x7c00100,0x80220400,0x38000038,0x7c00100,0x80250400,0x3800003e,0xc000010,0x44448000,0x38000041,0x7c00100,0x82b30400,0x38000099,0x4000000,0x84200000,0x380000a1, -0x7c00100,0x81830000,0x380000c1,0x4000000,0x84200000,0x380000c1,0x7c00100,0x80230400,0x380000c2,0x7c00100,0x80230400,0x380000c2,0xc000010,0x84248000,0x380000c3,0x6800000, -0x81329800,0x380000c3,0x7c00100,0x80230400,0x380000c4,0x7c00100,0x80230400,0x380000c5,0x7c00100,0x80220400,0x380000c5,0x7c00100,0x80250400,0x38005000,0x4000000,0x4e00000, -0x38005000,0x4000000,0x6800000,0x38005011,0x7c40300,0x20e30000,0x38005014,0x7c00100,0x8e30000,0x38005016,0x7c00100,0x8e30c00,0x38005016,0x7c00500,0x20230c00,0x3800803e, -0x7c00100,0x42b30400,0x38010001,0x2802100,0x20962460,0x38010001,0x2802400,0x10962460,0x38010001,0x2802400,0x20962460,0x38010002,0x2802400,0x20962460,0x3801001b,0x12882000, -0xc4962460,0x38010024,0x2802400,0x20962460,0x3801002a,0x2806400,0x80962460,0x38010041,0x2802100,0x80962460,0x38010041,0x2806400,0x80962460,0x38010078,0x2802100,0x80962460, -0x380100c2,0x2802400,0x80962460,0x380100c4,0x2802400,0x80962460,0x38010880,0x2802400,0x50962460,0x3c000000,0x4000000,0x4200000,0x3c000000,0x4000000,0x4e00000,0x3c000008, -0x7c00500,0xc822040e,0x3c000008,0x7c00500,0xc822040f,0x3c00000a,0x4000000,0x4500000,0x3c000015,0x6800100,0x20962540,0x3c000019,0x7c00100,0x10220400,0x3c000047,0, -0x84818820,0x3c000047,0,0x84c18820,0x3c000047,0,0x85418820,0x3c000047,0x7c00100,0x80230400,0x3c000047,0x7c00100,0x81430400,0x3c00009d,0x7c00100,0x80230400, -0x3c0000c6,0x4000000,0x84e00000,0x3c0000c6,0x6800000,0x82d29800,0x3c0000c6,0x6800100,0x80962540,0x3c0000c6,0x7c00100,0x82c30560,0x3c0000c6,0xc000010,0x84448000,0x3c0000c7, -0x6800000,0x81329800,0x3c0000c7,0x7c00100,0x80230400,0x3c005000,0x4000000,0x4e00000,0x3c005000,0x4000000,0x6800000,0x3c005011,0x7c40300,0x20e30000,0x3c005014,0x7c00100, -0xa530000,0x3c005016,0x7c00100,0xa530c00,0x3c0080c6,0x7c00100,0x82b30400,0x3c010002,0x2802400,0x20962460,0x3c010008,0x2802100,0x8962460,0x3c010018,0x2802000,0x21862460, -0x3c010047,0x2802000,0x80962460,0x3c010047,0x2802400,0x80962460,0x3c01009d,0x2802100,0x80962460,0x3c0100c6,0x2802100,0x80962460,0x3c0100c6,0x2806400,0x80962460,0x3c0100c7, -0x2802000,0x80962460,0x3c0180c6,0x2806400,0x82f62460,0x3d005011,0x7c40300,0x20e30000,0x3d0055a2,0x4000000,0x4e00000,0x3d0055a2,0x4008000,0x4e00000,0x40000000,0x4000000, -0x4200000,0x40000000,0x4000000,0xc8200005,0x40000000,0x6800000,0xc9329805,0x40000000,0x24000000,0x4200000,0x40000002,0x7c00100,0x20230400,0x40000008,0x7c00100,0x20220400, -0x40000008,0x7c00100,0x20250400,0x40000019,0x7c00100,0x20220400,0x40000019,0x7c00100,0x20250400,0x4000001c,0x6800000,0x21329800,0x4000003e,0xc000010,0x44448000,0x40000047, -0x7c00100,0x80230400,0x400000c9,0x4000002,0x87000000,0x400000c9,0x4000020,0x84200000,0x400000c9,0x6800000,0x81329800,0x400000c9,0x7c00100,0x80220400,0x400000c9,0x7c00100, -0x80230400,0x400000c9,0x7c00100,0x80250400,0x400000c9,0x7c00900,0x80230400,0x400000c9,0x7c00d00,0x80230400,0x400000ca,0x6800000,0x82d29800,0x400000ca,0x6800100,0x80962540, -0x400000ca,0x7c00100,0x82d30400,0x400000cb,0x4000000,0x84200000,0x400000cb,0x6800000,0x81329800,0x400000cb,0x7c00100,0x80230400,0x400000cb,0x7c00100,0x80230520,0x400000cb, -0x7c00100,0x80230521,0x400000cb,0x7c00500,0x80230400,0x400000cb,0xc000010,0x84448000,0x400000cc,0x4000000,0x84200000,0x400000cc,0x6800000,0x81329800,0x400000cc,0x7c00100, -0x80230400,0x400000cd,0x4000000,0x84200000,0x400000cd,0x6800000,0x81329800,0x400000cd,0x7c00100,0x80230400,0x400000ce,0x7c00100,0x80230400,0x400000ce,0x7c00100,0x80230401, -0x400000cf,0x4000000,0x84e00000,0x400000cf,0x6800100,0x80962540,0x400000cf,0x7c00100,0x80e30400,0x400000cf,0x7c00100,0x82c30560,0x400000cf,0x7c00d00,0x80e30400,0x400000cf, -0xc000010,0x84e48000,0x40005000,0x4000000,0x4e00000,0x400050bf,0x7c00300,0x80230000,0x400055be,0x4000000,0x4e00000,0x400080cf,0x7c00100,0x82b30400,0x400080cf,0x7c00100, -0x82d30400,0x400080cf,0x7c00100,0x82d30401,0x40010002,0x2802100,0x20962460,0x400100c6,0x2802400,0x80962460,0x400100c9,0x2802400,0x80962460,0x400100c9,0x2802500,0x80962460, -0x400100c9,0x2802c00,0x80962460,0x400100ca,0x2802100,0x80962460,0x400100ca,0x2802100,0x80962461,0x400100ca,0x2806400,0x80962460,0x400100cc,0x2802400,0x80962460,0x400100cc, -0x2802c00,0x80962460,0x400100cf,0x2802100,0x80962460,0x400100cf,0x2802100,0x80962461,0x400100cf,0x2802400,0x80962460,0x400100cf,0x2802c00,0x80962460,0x400100cf,0x2806400, -0x80962460,0x400180cf,0x2806400,0x82f62460,0x44000000,0x4000000,0x4200000,0x44000000,0x4000000,0x5600000,0x44000000,0x4000020,0x4200000,0x44000000,0x24000000,0x4200000, -0x44000002,0x4000000,0x4200000,0x44000002,0x4000000,0x4400000,0x44000002,0x4000000,0x14200000,0x44000002,0x7c00100,0x10230400,0x44000002,0x7c00100,0x20230400,0x44000002, -0x7c00100,0xfc230400,0x44000015,0x7c00100,0x8230400,0x44000019,0x7c00100,0x8250400,0x44000019,0x7c00100,0x20220400,0x44000019,0x7c00100,0x20250400,0x44000019,0x7c00500, -0xc822040f,0x44000024,0x7c00100,0x8230400,0x44000097,0x6800100,0x80962540,0x440000d0,0x7c00100,0x80220400,0x440000d0,0x7c00100,0x80250400,0x440000d1,0x7c00100,0x80230400, -0x440000d2,0x7c00100,0x80230400,0x440000d3,0x6800000,0x81329800,0x440000d3,0x7c00100,0x80230400,0x440000d3,0x7c00d00,0x80230400,0x44005000,0x4000000,0x4e00000,0x44005011, -0x7c00300,0x10e30000,0x44005011,0x7c00b00,0x11230000,0x44005011,0x7c40300,0x20e30000,0x4400509a,0x7c00300,0x80e30000,0x44010001,0x2802400,0x10962460,0x44010001,0x2802400, -0x10c62460,0x44010002,0x2802100,0x10962460,0x44010002,0x2802500,0x20962460,0x44010097,0x2802100,0x80962460,0x440100d2,0x2802100,0x80962460}; +0x5000019,0x7c00100,0x30220400,0x5000019,0x7c00100,0xc8220402,0x5000019,0x7c00100,0xc8250401,0x5000019,0x7c00100,0xc8250402,0x5000019,0x7c00100,0xfc220400,0x5000019, +0x7c00100,0xfc220401,0x5000019,0x7c00100,0xfc250400,0x5000019,0x7c00100,0xfc250401,0x5000019,0x7c00500,0xc822040f,0x500001a,0x6800000,0x21329800,0x500001a,0x6800100, +0x8962541,0x500001a,0x6800100,0xfc962540,0x500001a,0x6800100,0xfc962541,0x500001a,0x7c00100,0x8230400,0x500001a,0x7c00100,0x20230400,0x500001a,0x7c00100,0xfc230400, +0x500001f,0x4000000,0x4200000,0x500001f,0x6800000,0x21329800,0x500001f,0x6800100,0xfc962540,0x500001f,0x6800100,0xfc962541,0x500001f,0x7c00100,0x8230400,0x500001f, +0x7c00100,0x20230400,0x500001f,0x7c00100,0xfc230400,0x5000023,0x6800100,0xfc962540,0x5000023,0x6800100,0xfc962541,0x5000023,0x7c00100,0xfc230400,0x5000023,0x7c00100, +0xfc230401,0x5000024,0x6800000,0x21329800,0x5000024,0x6800100,0x20962540,0x5000024,0x6800100,0xfc962540,0x5000024,0x7c00100,0x8230400,0x5000024,0x7c00100,0x20230400, +0x5000024,0x7c00100,0xfc230400,0x5000026,0x4000000,0x4200000,0x5000026,0x4000010,0x4400000,0x5000026,0x6800000,0xfd329800,0x5000026,0x7800100,0xc9830142,0x5000026, +0x7c00100,0xfd830000,0x5000026,0x7c00900,0xfd830000,0x5000026,0x7e00100,0xfd830000,0x5000067,0x1000,0,0x5000410,0x7c00500,0xf8230400,0x500041b,0x4000400, +0x4200400,0x5000492,0x7c00500,0xc8230401,0x50004a5,0x4000010,0x4b00000,0x50004a5,0x4000010,0x5071400,0x50004b1,0xc000010,0x4b48000,0x50004b9,0x7c00900,0x8230400, +0x50004e9,0xc000010,0x4448000,0x50004fe,0xc000010,0x4448000,0x500053c,0x4000000,0x4200000,0x50005c4,0x4000000,0x4e00000,0x5000621,0x24000000,0x14810000,0x5000621, +0x24000000,0x15410000,0x5000c94,0x4000400,0x14200000,0x5000ca3,0xc000010,0x5049400,0x5000cc7,0x6800000,0xfd329800,0x5000ccb,0xc000010,0x4b48000,0x5000d19,0x6800000, +0xfd329800,0x5000d1e,0x6800000,0xfd329800,0x5000d22,0x6800000,0x21329800,0x5000d26,0x6800000,0xfd329800,0x5000d2c,0x7c00100,0xfc230400,0x5000d30,0x4000000,0x4200000, +0x5000d30,0x6800000,0x21329800,0x5000d35,0x6800000,0xfd329800,0x5000e25,0x7c00100,0xc8230408,0x5001000,0x80004,0xc7018820,0x5001000,0x4000000,0x4100000,0x5001000, +0x4000000,0xc8100002,0x5001000,0x4000000,0xc8100003,0x5001000,0x4000000,0xc8100006,0x5001000,0x4000000,0xc810000e,0x5001000,0x4000000,0xc810000f,0x5001000,0x4000000, +0xc9500002,0x5001000,0x4000000,0xc9600002,0x5001000,0x4000100,0xc8120403,0x5001000,0x4000100,0xc8150403,0x5001000,0x4000400,0x4200400,0x5001000,0x4000400,0xc8100002, +0x5001000,0x4000400,0xc8100402,0x5001000,0x4000400,0xc8500002,0x5001000,0x7c00120,0xc8120405,0x5001000,0x7c00d00,0x10130400,0x5001000,0x24000000,0x4100000,0x5001000, +0x24000000,0x4200000,0x5001000,0x24000000,0x4e00000,0x5001000,0x24000000,0x5400000,0x5001000,0x24000000,0x5500000,0x5001000,0x24000000,0x5600000,0x5001000,0x24000000, +0xc8200002,0x5001000,0x24000000,0xc8f00002,0x5001000,0x24000000,0xf8401000,0x5001000,0x24000002,0x4100000,0x5001000,0x24000002,0x4370000,0x5001000,0x24000002,0x4470000, +0x5001000,0x24000006,0xfb000000,0x5001000,0x24000008,0x5710000,0x5001000,0x24000008,0x5712c00,0x5001000,0x24000008,0xf9712c00,0x5001000,0x24000020,0x4100000,0x5001000, +0x24000020,0x4100001,0x5001000,0x24000020,0x5500000,0x5001000,0x24000020,0x5600000,0x5001000,0x24000020,0xc8100002,0x5001000,0x24000020,0xc9500002,0x5001000,0x2c000010, +0xc8f0ac02,0x5001008,0x7c00100,0xfc220400,0x5001008,0x7c00100,0xfc220401,0x5001008,0x7c00100,0xfc250400,0x5001008,0x7c00100,0xfc250401,0x500100e,0x7c00100,0xc8250401, +0x500100e,0x7c00100,0xfc220400,0x500100e,0x7c00100,0xfc250400,0x5001019,0x7c00100,0x8220400,0x5001019,0x7c00100,0x10220400,0x5001019,0x7c00100,0x20220401,0x5001019, +0x7c00100,0xc8120402,0x5001019,0x7c00100,0xc812040f,0x5001019,0x7c00100,0xc8150401,0x5001019,0x7c00100,0xc8150402,0x5001019,0x7c00100,0xc8220402,0x5001019,0x7c00100, +0xc8250402,0x5001019,0x7c00100,0xfc220400,0x5001019,0x7c00100,0xfc220401,0x5001019,0x7c00100,0xfc250400,0x5001019,0x7d00100,0xc0220402,0x5001067,0,0, +0x5001400,0x6800c00,0xf9001000,0x5001417,0x4000400,0xc8100002,0x5001417,0x7c00500,0x10130400,0x5001419,0x7c00500,0x10130400,0x5002000,0x4000000,0x5600000,0x5002000, +0x4000000,0xc820000a,0x5002000,0x4000020,0xc820000a,0x5002012,0x7c00100,0xc8e3040a,0x5002012,0x7c80100,0xc4e3040a,0x5002016,0x7c00100,0xc8e30c0a,0x5002016,0x7c00100, +0xca530c0a,0x50025aa,0x4000008,0xc881000a,0x50025aa,0x4000008,0xc941000a,0x50025aa,0x4000010,0xc887000a,0x50025aa,0x6800004,0xc920000a,0x50025aa,0xc000010,0xc884800a, +0x50025c2,0x7c00d00,0xca530c0a,0x5003000,0x4000000,0xc8810011,0x5003000,0x4000000,0xc8e00011,0x5003000,0x4000000,0xc9410011,0x5003000,0x4000000,0xc9500011,0x5003000, +0x4000000,0xc9600011,0x5003000,0x4000001,0xc8445811,0x5003000,0x4000006,0xc8e70011,0x5003000,0x4000008,0xc8e00011,0x5003000,0x4000008,0xc8e02c11,0x5003000,0x4000010, +0xc8871411,0x5003000,0x4000010,0xc9271011,0x5003000,0x4000010,0xc9271411,0x5003000,0x4000020,0xc8e00011,0x5003000,0x4000400,0xc8e00011,0x5003000,0x4000420,0xc8e00011, +0x5003000,0x6800000,0xc8e01c11,0x5003000,0x6800040,0xc8e29811,0x5003000,0xc000010,0xc880ac11,0x5003000,0xc000010,0xc8b48011,0x5003019,0x7c00100,0xc8e20411,0x5003019, +0x7c00100,0xc8e50411,0x5003019,0x7c00140,0xc8e20411,0x5003019,0x7c00140,0xc8e50411,0x5004000,0x4000400,0xc8200002,0x5004000,0x6800000,0xfc201c00,0x5004000,0x68000c0, +0xfd329800,0x5004000,0x24000000,0x4200000,0x5004000,0x24000000,0x4810000,0x5004000,0x24000000,0x5410000,0x5004000,0x24000000,0x5500000,0x5004000,0x24000000,0x5600000, +0x5004000,0x24000000,0x5b00000,0x5004000,0x24000000,0x6410000,0x5004000,0x24000006,0xf8d70000,0x5004000,0x24000008,0x5714000,0x5004000,0x24000008,0xf9713c00,0x5004000, +0x24000010,0x5071400,0x5004000,0x24000010,0xf9071000,0x5004000,0x24000020,0x4200000,0x5004000,0x24000020,0x4400000,0x5004000,0x24000020,0x5600000,0x5004000,0x24000400, +0x4200000,0x5004000,0x24000420,0x4200000,0x5004000,0x2c000010,0x4b48000,0x5004000,0x2c000010,0xf900ac00,0x5004000,0x44000001,0x5a45800,0x5004019,0x7c00100,0xfc220400, +0x5004019,0x7c00100,0xfc250400,0x5004019,0x7c001c0,0xfc220400,0x5004019,0x7c001c0,0xfc250400,0x5005000,0x4000000,0x4e00000,0x5005000,0x4000000,0x14e00000,0x5005000, +0x4000000,0xc881000c,0x5005000,0x4000000,0xc8810010,0x5005000,0x4000000,0xc8e00002,0x5005000,0x4000000,0xc8e0000c,0x5005000,0x4000000,0xc8e0000d,0x5005000,0x4000000, +0xc8e00010,0x5005000,0x4000000,0xc941000c,0x5005000,0x4000000,0xc9410010,0x5005000,0x4000000,0xc950000c,0x5005000,0x4000000,0xc960000c,0x5005000,0x4000002,0xc8e7000c, +0x5005000,0x4000002,0xc8e70010,0x5005000,0x4000008,0xc8810010,0x5005000,0x4000008,0xc9410010,0x5005000,0x4000010,0xc887000c,0x5005000,0x4000010,0xc887140c,0x5005000, +0x4000010,0xc927100c,0x5005000,0x4000010,0xc927140c,0x5005000,0x4000020,0xc8e0000c,0x5005000,0x4000026,0xc8e7000c,0x5005000,0x6800000,0xc8e01c02,0x5005000,0x6800000, +0xc8e01c10,0x5005000,0xc000010,0xc880ac0c,0x5005000,0xc000010,0xc8b4800c,0x5005000,0x24000000,0x4200000,0x5005000,0x24000000,0x4e00000,0x5005000,0x24100000,0xc0810001, +0x5005000,0x24100000,0xc1410001,0x5005005,0x7c00100,0x40e30400,0x5005011,0x7c00300,0x10e30000,0x5005011,0x7c00300,0xc8e30001,0x5005011,0x7c00300,0xfce30000,0x5005011, +0x7c00900,0xfd230400,0x5005011,0x7c40300,0x20e30000,0x5005011,0x7c40300,0xfce30000,0x5005012,0x4000000,0xc8e00002,0x5005012,0x4000000,0xc8e00003,0x5005012,0x7c00100, +0xa130480,0x5005012,0x7c00100,0xc8e30402,0x5005012,0x7c80100,0xc4e30402,0x5005012,0x7c80100,0xc6130480,0x5005014,0x7c00100,0xfce30000,0x5005014,0x7c00100,0xfce30001, +0x5005014,0x7c00100,0xfe530000,0x5005014,0x7c00900,0xfd230000,0x5005014,0x7c00900,0xfd230001,0x5005016,0x4000000,0xc8e00c03,0x5005016,0x4000000,0xc8e00c0d,0x5005016, +0x7c00100,0xfce30c00,0x5005016,0x7c00100,0xfce30c01,0x5005016,0x7c00100,0xfe530c00,0x5005016,0x7c00900,0xfd230c00,0x5005016,0x7c00900,0xfd230c01,0x50055aa,0x6800004, +0xf9200000,0x50055aa,0x24000000,0x4810000,0x50055aa,0x24000000,0x5410000,0x50055aa,0x24000008,0x4810000,0x50055aa,0x24000008,0x5410000,0x50055b0,0x24000010,0x4870000, +0x50055b7,0x2c000010,0x4848000,0x50055bf,0x4000000,0x4e00000,0x50055bf,0x24000000,0x4e00000,0x50055bf,0x24000002,0x4e00000,0x50055bf,0x24000002,0x5200000,0x50055bf, +0x24000008,0x4810000,0x50055bf,0x24000008,0x5410000,0x50055bf,0x24000008,0xc810000,0x50055c2,0x7000400,0xc9200c02,0x50055c2,0x7c00900,0x10930c00,0x50055c2,0x7c00900, +0x10e30c00,0x50055c2,0x7c00d00,0xfe530c00,0x50055c4,0x4000000,0x4e00000,0x50055c4,0x4000000,0xc8e00002,0x50055c4,0x4000000,0xc8e00003,0x50055c4,0x4000000,0xc8e0000d, +0x50055c4,0x4000000,0xc8e0000f,0x50055c4,0x7c00300,0xfce30000,0x50055c5,0x24000000,0x4810000,0x50055c5,0x24000000,0x5410000,0x50055cd,0x24000000,0x4810000,0x50055cd, +0x24000000,0x5410000,0x5008004,0x7c00100,0xc8230401,0x5008004,0x7c00100,0xfc230400,0x500800a,0x7c00100,0x20230401,0x500800a,0x7c00100,0xc8230401,0x500800a,0x7c00100, +0xfc230400,0x500800a,0x7c00100,0xfc230401,0x500800f,0x7c00100,0xfc230400,0x500801a,0x7c00100,0xfc230400,0x500801f,0x7c00100,0xc8230401,0x500801f,0x7c00100,0xfc230400, +0x5008024,0x7c00100,0x20230400,0x5008024,0x7c00100,0xfc230400,0x5010001,0x2000,0x14962460,0x5010001,0x2802020,0x10962460,0x5010001,0x2802400,0x10962460,0x5010001, +0x2802400,0x10c62460,0x5010001,0x2880000,0xc6a65620,0x5010002,0x2802100,0x10962460,0x5010002,0x2802400,0x10962460,0x5010002,0x2802500,0x10962460,0x5010004,0x2802100, +0x8962460,0x5010004,0x2802100,0x20962460,0x5010004,0x2802100,0xfc962460,0x5010004,0x2802400,0xfc962460,0x501000a,0x2802100,0x8962460,0x501000a,0x2802100,0x20962460, +0x501000a,0x2802100,0xfc962460,0x501000a,0x2802400,0xfc962460,0x501000f,0x2802100,0x20962460,0x501000f,0x2802100,0xfc962460,0x501000f,0x2802400,0xfc962460,0x5010010, +0x2802100,0xfc962460,0x5010010,0x2802400,0xfc962460,0x5010010,0x2802900,0xfc962460,0x5010010,0x2806400,0xfc962460,0x5010013,0x2802500,0x20962460,0x5010013,0x2802500, +0x30962460,0x5010015,0x2802100,0x20962460,0x5010015,0x2802100,0xfc962460,0x5010015,0x2802100,0xfc962461,0x5010015,0x2806400,0xfc962460,0x5010018,0x2802100,0xfd862460, +0x5010018,0x2802400,0xfd862460,0x501001a,0x2802100,0xfc962460,0x501001f,0x2802100,0x20962460,0x501001f,0x2802100,0xfc962460,0x501001f,0x2802400,0xfc962460,0x5010023, +0x2802100,0x10962460,0x5010023,0x2802100,0x20962460,0x5010023,0x2802100,0xfc962460,0x5010023,0x2806400,0xfc962460,0x5010024,0x2802100,0x20962460,0x5010024,0x2802100, +0xfc962460,0x5010024,0x2802100,0xfc962461,0x5010026,0x2802100,0xfd862460,0x5010026,0x2802400,0x21862460,0x5010026,0x2802400,0xfd862460,0x5010026,0x2806500,0xfd862460, +0x501089e,0x2802400,0x18962460,0x50108c2,0x2802100,0xfc962460,0x50108c2,0x2802500,0xfc962460,0x50108cd,0x2802400,0x8962460,0x50108dc,0x2802400,0x8962460,0x5010c98, +0x2802400,0x8962460,0x5010c9c,0x2802400,0x18962460,0x5011001,0x2802400,0x10962460,0x5011001,0x2802400,0x10c62460,0x5011001,0x2802400,0x20962460,0x5011001,0x2802400, +0xc8962461,0x5011001,0x2802400,0xfc962460,0x501181d,0x2802400,0xfc962460,0x5011825,0x2802400,0xfc962460,0x501182d,0x2802400,0xfc962460,0x501182f,0x2802400,0xfc962460, +0x5011831,0x2802400,0xfc962460,0x5011836,0x2802400,0xfc962460,0x5011841,0x2802400,0x20962460,0x5011847,0x2802400,0xfc962460,0x501184c,0x2802400,0xfc962460,0x5011855, +0x2802400,0xfc962460,0x5011860,0x2802400,0xfc962460,0x5011863,0x2802400,0xfc962460,0x5011867,0x2802400,0xfc962460,0x501186a,0x2802400,0x10962460,0x501186a,0x2802400, +0x20962460,0x501186c,0x2802400,0x10962460,0x501186e,0x2802400,0x10962460,0x5011871,0x2802400,0x10962460,0x5011875,0x2802400,0xfc962460,0x501187b,0x2802400,0x10962460, +0x501187f,0x2802400,0x10962460,0x5011881,0x2802400,0x10962460,0x5011884,0x2802400,0x10962460,0x5011887,0x2802400,0xfc962460,0x501188e,0x2802400,0x10962460,0x501188e, +0x2802500,0x8962460,0x50125c2,0x3802500,0xc926246a,0x5015012,0x2802400,0x18962460,0x50159c2,0x2802400,0x20962460,0x50159d6,0x2802400,0x10962460,0x5018004,0x2806400, +0xfc962460,0x501800a,0x2806400,0xfc962460,0x501800f,0x2806400,0xfc962460,0x501801a,0x2806400,0xfc962460,0x501801f,0x2806400,0xfc962460,0x5018024,0x2806400,0xfc962460, +0x8000000,0x4000000,0x5600000,0x8000019,0x7c00100,0xc8220401,0x8000027,0x4000000,0x4200000,0x8000027,0x4000000,0x4400000,0x8000027,0x4000000,0x4500000,0x8000027, +0x4000000,0x4810000,0x8000027,0x4000000,0x4b00000,0x8000027,0x4000000,0x5410000,0x8000027,0x4000000,0xc8c0000b,0x8000027,0x4000000,0xf8400000,0x8000027,0x4000010, +0x4b00000,0x8000027,0x4000010,0x4c00000,0x8000027,0x6800000,0xfd329800,0x8000027,0x6800100,0xfc462540,0x8000027,0x6800400,0x10962540,0x8000027,0x7c00100,0x8230400, +0x8000027,0x7c00100,0x10230400,0x8000027,0x7c00100,0xc8230401,0x8000027,0x7c00100,0xfc230400,0x8000067,0,0x1900000,0x8000067,0x1000,0,0x8001067, +0,0,0x8005012,0x7c00100,0xfdf304c1,0x8005012,0x7c00100,0xfe0304e1,0x8010013,0x2802400,0x10962460,0x8010013,0x2802500,0x10962460,0x8010027,0x2802100, +0xc8962461,0x8010027,0x2802100,0xfc962460,0x8010027,0x2802400,0x8962460,0x8010027,0x2802400,0x10962460,0x8010027,0x2802400,0x20962460,0x8010027,0x2802500,0x28962460, +0x8010027,0x2806400,0xfc962460,0x8010027,0x2902100,0xc0962462,0x9000000,0x4000000,0x4700000,0x9001000,0x4000000,0x5600000,0xc000000,0,0x4918820,0xc000000, +0x4000000,0x4200000,0xc000000,0x4000000,0x5600000,0xc000000,0x4000400,0x4200400,0xc000000,0x7c00100,0xc8220405,0xc000000,0x7c00500,0x10230400,0xc000000,0x24000000, +0x4200000,0xc000000,0x2c000010,0xc9248002,0xc000002,0x4000000,0xf8200000,0xc000002,0x7c00100,0x20230400,0xc000002,0x7c00100,0xfc230400,0xc000003,0x4000006,0xfb000400, +0xc000005,0x4000400,0x44200400,0xc000006,0x7c00100,0x40250400,0xc000008,0x7c00100,0x20220400,0xc000008,0x7c00100,0x20220401,0xc000008,0x7c00100,0x20250400,0xc000008, +0x7c00100,0x20250401,0xc00000b,0x4000000,0x4200000,0xc00000b,0x4000010,0x4200000,0xc00000b,0x4000010,0x4400000,0xc00000b,0x6800000,0x8200000,0xc00000b,0x7c00100, +0x20230400,0xc00000b,0x7c00100,0xfc230400,0xc00000b,0xc000010,0x4248000,0xc00000e,0x7c00100,0x8220400,0xc00000e,0x7c00100,0x10220400,0xc000013,0x7c00100,0xca633801, +0xc000017,0x4000000,0x4200000,0xc000017,0x4000000,0x5600000,0xc000017,0x4000000,0xc400000,0xc000017,0x4000010,0x4400000,0xc000017,0x4000010,0x5200000,0xc000017, +0x6800000,0xfd329800,0xc000017,0x6800100,0xfd862540,0xc000017,0x7c00100,0x9830000,0xc000017,0x7c00100,0x21830000,0xc000017,0xc000010,0x4448000,0xc000019,0x7c00100, +0x8220400,0xc000019,0x7c00100,0x8250400,0xc000019,0x7c00100,0x10220400,0xc000019,0x7c00100,0x18250400,0xc000019,0x7c00100,0x20220400,0xc000019,0x7c00100,0x20220401, +0xc000019,0x7c00100,0x20250400,0xc000019,0x7c00100,0x20250401,0xc000019,0x7c00100,0xfc220401,0xc000019,0x7c00100,0xfc250401,0xc00001b,0x80000,0xc4c18820,0xc00001b, +0x4000000,0x84200000,0xc00001b,0x4000006,0x84500000,0xc00001b,0x4000010,0x84400000,0xc00001b,0x4000010,0x84b70000,0xc00001b,0x4000800,0x84200000,0xc00001b,0x6800000, +0x81329800,0xc00001b,0x7c00100,0x80230400,0xc00001b,0x7c00900,0x80230400,0xc00001b,0xc000010,0x84b48000,0xc00001c,0x4000000,0x4200000,0xc00001c,0x6800100,0x29862540, +0xc00001c,0x6800100,0xfd862400,0xc00001c,0x6800100,0xfd862540,0xc00001c,0xc000010,0x4448000,0xc00001d,0x4000000,0x84810000,0xc00001d,0x4000000,0x85410000,0xc00001d, +0x4000001,0x84445800,0xc00001d,0x7c00100,0x80230400,0xc000020,0x7c00100,0x80230400,0xc000021,0x4000000,0x4200000,0xc000021,0x6800100,0x30962540,0xc000021,0x6800100, +0xfc962540,0xc000021,0x6800100,0xfc962541,0xc000021,0x7c00100,0x8230400,0xc000021,0x7c00100,0x20230400,0xc000021,0x7c00100,0x30230400,0xc000021,0x7c00100,0xfc230400, +0xc000022,0x4000000,0x44200000,0xc000022,0x4000010,0x44200000,0xc000022,0x7c00100,0x40230400,0xc000022,0xc000010,0x44248000,0xc000022,0x80000000,0x44218560,0xc000025, +0x7c00100,0xfc230400,0xc000027,0x4000000,0x4200000,0xc000027,0x4000000,0x4400000,0xc000027,0x7c00100,0x28230400,0xc000028,0x4000000,0x44200000,0xc000028,0x7c00100, +0x40230400,0xc000028,0xc000010,0x44248000,0xc00002e,0x24000000,0x14200000,0xc00002e,0x24000000,0x14400000,0xc00053f,0x4000010,0x84400000,0xc000544,0x4000010,0x84400000, +0xc000544,0x4000010,0x84b70000,0xc000544,0xc000010,0x84b48000,0xc000588,0x4000001,0xc8c41c0b,0xc000d3a,0x6800000,0xfd329800,0xc001000,0x4000400,0x4500400,0xc005005, +0x7c00100,0x40e30400,0xc005011,0x4020000,0x4e00000,0xc005011,0x4020000,0xc8e00002,0xc005011,0x7c00300,0xc8e30002,0xc005011,0x7c40300,0x20e30000,0xc005011,0x7c40300, +0xfce30000,0xc005029,0x4000000,0x44e00000,0xc005029,0x7c00100,0x40e30400,0xc005029,0x7c00900,0x41230400,0xc0055a8,0x4008000,0x4e00000,0xc0055a8,0x4010000,0x4e00000, +0xc0055c4,0x4000000,0x4e00000,0xc008017,0x7c00100,0x9830000,0xc008017,0x7c00100,0x21830000,0xc008017,0x7c00100,0xfd830000,0xc008017,0x7d00100,0xc1830000,0xc00801c, +0x7c00100,0x29830000,0xc00801c,0x7c00100,0xfd830000,0xc00801c,0x7c00100,0xfd830001,0xc010001,0x2000,0x14962460,0xc010008,0x2000,0xc962460,0xc010017,0x2802100, +0xfd862460,0xc010017,0x2802400,0x9862460,0xc010017,0x2802400,0x11862460,0xc010017,0x2802400,0x19862460,0xc010017,0x2802400,0xfd862460,0xc010017,0x2882000,0xc5862460, +0xc01001b,0x2802100,0xa0962460,0xc01001b,0x3c02100,0x80962460,0xc01001b,0x12882000,0xc4962460,0xc01001c,0x2802100,0x29862460,0xc01001c,0x2802100,0xfd862460,0xc01001c, +0x2802400,0xfd862460,0xc010021,0x2802100,0x30962460,0xc010021,0x2802100,0xfc962460,0xc010021,0x2806400,0xfc962460,0xc010022,0x2802100,0x40962460,0xc010022,0x2802400, +0x50962460,0xc010022,0x2802500,0x40962460,0xc010025,0x2802500,0xfc962460,0xc010027,0x2802100,0x20962460,0xc010027,0x2802100,0xfc962460,0xc010027,0x2802400,0x30962460, +0xc0108c2,0x2802100,0x30962460,0xc0108c2,0x2802100,0xfc962460,0xc011001,0x2802400,0x10962460,0xc011001,0x2802400,0x10c62460,0xc018017,0x2806400,0xfd862460,0xc01801c, +0x2806400,0xfd862460,0xd000000,0x80000,0xc4918820,0xd000000,0x180000,0xc0918820,0xd000000,0x4000000,0x14200000,0xd000000,0x4000000,0xc8200001,0xd000000,0x4000020, +0xc8200005,0xd000000,0x6800020,0xc9329805,0xd000000,0x7c00120,0xc8220405,0xd000000,0x7c00120,0xc8250405,0xd000009,0x7c00100,0x80220400,0xd000009,0x7c00100,0x80250400, +0xd00000d,0x7c00100,0x80230400,0xd00000e,0x7c00120,0xc8220402,0xd00000e,0x7c00120,0xc8250402,0xd00001e,0x4000000,0x84200000,0xd00001e,0x7c00100,0x80230400,0xd000067, +0x1000,0,0xd005011,0x7c00300,0xc8e30001,0xd005011,0x7c40300,0x20e30000,0xd005011,0x7c40300,0xfce30000,0xd010000,0x82000,0xc4962460,0xd010000,0x2802000, +0x10962460,0xd010000,0x2802400,0x10962460,0xd010001,0x2802400,0x10962460,0xe000000,0x80000,0xc5e18820,0xe000000,0x80020,0xc4218820,0xe000000,0x4000000,0x4200000, +0xe000000,0x4000000,0x5600000,0xe000000,0x4000001,0xc8445802,0xe000000,0x4000020,0x4200000,0xe000000,0x4000020,0xc8200005,0xe000000,0x7c00120,0xc8220405,0xe000000, +0x7c00120,0xc8250405,0xe000000,0x24000000,0x4100000,0xe000000,0x24000000,0x4200000,0xe000000,0x24000000,0x4810000,0xe000000,0x24000000,0x5410000,0xe000000,0x24000000, +0xc9500002,0xe000000,0x24000020,0x4200000,0xe000000,0x24000020,0x4810000,0xe000000,0x24000020,0x5410000,0xe000000,0x24000020,0xc8200001,0xe000000,0x24000020,0xc8200002, +0xe000000,0x2c000010,0xc9248002,0xe000002,0x4000000,0xc9500008,0xe000002,0x7c00100,0x8230400,0xe000002,0x7c00100,0x10230400,0xe000008,0x7c00100,0x8220400,0xe000008, +0x7c00100,0x8250400,0xe000008,0x7c00100,0x20220400,0xe000008,0x7c00100,0x20250400,0xe00000c,0x7c00100,0x20230400,0xe00000e,0x4000020,0x4200000,0xe00000e,0x7c00100, +0x8220400,0xe00000e,0x7c00100,0x8250400,0xe000019,0x7c00100,0x20250400,0xe000019,0x7c00100,0xc822040f,0xe000025,0x7c00100,0xfc230400,0xe00002a,0x7c00100,0x80230400, +0xe00002b,0x7c00100,0x80230400,0xe00002c,0x7c00100,0x80230400,0xe00002d,0x7c00100,0x80230400,0xe000540,0xc000010,0x84448000,0xe00058b,0x24000000,0x4200000,0xe001000, +0x4000000,0x14100000,0xe003000,0x4000000,0xc8810011,0xe003000,0x4000000,0xc9410011,0xe004000,0x24000020,0x4810000,0xe004000,0x24000020,0x5410000,0xe005000,0x4000000, +0xc8e00003,0xe005000,0x24000020,0x4200000,0xe005011,0x7c00100,0x11230400,0xe005011,0x7c00300,0xc8e30001,0xe005014,0x7c00100,0xc8e30010,0xe005014,0x7c00100,0xfe530000, +0xe005016,0x7c00100,0xa530c00,0xe005016,0x7c00100,0xc8e30c10,0xe005029,0x4000000,0x44e00000,0xe0055bf,0x24000000,0x14e00000,0xe0055c2,0x4000002,0xf9200c00,0xe0055d8, +0x4000000,0x4e00000,0xe0055d8,0x7c00100,0x11230400,0xe010001,0x2000,0x14962460,0xe010001,0x2802000,0x10962460,0xe010001,0x2802020,0x10962460,0xe01002a,0x2802100, +0x80962460,0xe01002a,0x2806400,0x80962460,0xe01002b,0x2802100,0x80962460,0xe01002b,0x2806400,0x80962460,0xe01002c,0x2802100,0x80962460,0xe01002d,0x2802100,0x80962460, +0xe011001,0x2882000,0xc4962460,0xe011001,0x12882000,0xc4962460,0xe011818,0x2802100,0x8962460,0x10000000,0x4000000,0xc8200002,0x10000000,0x4000400,0x4200400,0x10000000, +0x6800000,0x20201c00,0x10000000,0x7c00120,0xc8220405,0x10000000,0x24000000,0x4200000,0x10000000,0x24000002,0x4200000,0x10000000,0x24000020,0x4200000,0x10000002,0x4000000, +0x4200000,0x10000002,0x4000000,0x5071400,0x10000002,0x7c00100,0xfc230400,0x10000002,0x80000000,0x5329960,0x10000004,0x7c00100,0x8230400,0x10000008,0x7c00100,0x10220400, +0x10000009,0x7c00100,0x80220400,0x10000009,0x7c00100,0x80250400,0x1000000a,0x7c00100,0x20230400,0x1000000e,0x7c00100,0x8220400,0x1000000e,0x7c00100,0x8250400,0x1000000e, +0x7c00100,0x10220400,0x1000000e,0x7c00100,0xc8250402,0x1000000e,0x7c00500,0xc822040e,0x1000000e,0x7c00500,0xc822040f,0x1000000f,0x4000000,0x5600000,0x1000000f,0x7c00100, +0x8230400,0x1000000f,0x7c00100,0xfc230400,0x10000010,0x6800100,0x20962540,0x10000015,0x7c00100,0x8230400,0x10000017,0x4000000,0x4200000,0x10000019,0x7c00100,0x10220400, +0x10000019,0x7c00100,0x20220400,0x10000019,0x7c00500,0x10220400,0x10000019,0x7c00500,0xc822040e,0x10000019,0x7c00500,0xc822040f,0x10000022,0x7c00100,0x40230400,0x10000023, +0x4000000,0x4200000,0x10000023,0x4000000,0x5600000,0x1000002f,0x7c00100,0x80230400,0x10000030,0x4000000,0x44200000,0x10000030,0x6800000,0x41329800,0x10000030,0x6800100, +0x40962540,0x10000030,0x7c00100,0x40230400,0x10000030,0xc000010,0x44b48000,0x10000031,0x7c00100,0x80230400,0x10000032,0x6800000,0x81329800,0x10000032,0x7c00100,0x80230400, +0x10000033,0x7c00100,0x80230400,0x10000034,0x7c00100,0x41830000,0x10000035,0x4000010,0x84400000,0x10000035,0x7c00100,0x80230400,0x10000627,0x4000000,0x84200000,0x1000062a, +0x4000000,0x84400000,0x1000062d,0x4000000,0x84200000,0x1000062d,0x4000000,0x84400000,0x10000d30,0x4000000,0x4200000,0x10000e25,0x4000000,0x14200000,0x10001000,0x4000000, +0x14200000,0x10005000,0x4000000,0x14200000,0x10005000,0x4000000,0xc8810010,0x10005000,0x4000000,0xc8e0000d,0x10005000,0x4000000,0xc9410010,0x10005000,0x24000000,0x4200000, +0x10005000,0x24000000,0x4e00000,0x10005012,0x4000000,0xc8e00002,0x10005012,0x4000000,0xc8e00003,0x1000801f,0x7c00100,0x20230400,0x1000801f,0x7c00100,0xfc230400,0x10010002, +0x2802100,0x10962460,0x10010002,0x2802100,0x20962460,0x10010002,0x2802400,0x20962460,0x10010002,0x2802500,0x20962460,0x1001000f,0x2802100,0x8962460,0x10010010,0x2802100, +0x20962460,0x10010015,0x2802400,0x20962460,0x10010017,0x2802400,0x19862460,0x10010030,0x2802100,0x40962460,0x10010030,0x2802400,0x40962460,0x10011001,0x2802400,0x10962460, +0x10011001,0x2802400,0x10c62460,0x10011001,0x12882000,0xc4962460,0x1001188f,0x2802400,0x10c62460,0x11000000,0x4000000,0x4200000,0x11000000,0x4000000,0x5600000,0x11000000, +0x4000400,0x14200400,0x11000000,0x7c00120,0xc8220405,0x11000000,0x24000000,0x4200000,0x11000000,0x24000000,0x4e00000,0x11000000,0x24000000,0x5710000,0x11000000,0x24000000, +0xc200000,0x11000000,0x24000000,0xc400000,0x11000000,0x24000000,0x1d710000,0x11000000,0x24000020,0x4200000,0x11000000,0x24000020,0x4810000,0x11000000,0x24000020,0x5410000, +0x11000002,0x4000000,0x5500000,0x11000002,0x7c00100,0x20230400,0x11000002,0x7c00100,0xfc230400,0x11000002,0xc000010,0x4b48000,0x11000004,0x7c00100,0xfc230400,0x11000007, +0x4000000,0x84200000,0x11000007,0x4000000,0x84400000,0x11000007,0x4000000,0x84b00000,0x11000007,0x7c00100,0x80220400,0x11000007,0x7c00100,0x80250400,0x11000007,0xc000010, +0x84448000,0x11000007,0xc000010,0x84b48000,0x11000008,0x7c00100,0x20220400,0x11000008,0x7c00100,0x20250400,0x11000008,0x7c00100,0xc822040f,0x1100000b,0x4000000,0x4200000, +0x1100000b,0x7c00100,0x20230400,0x1100000b,0x7c00100,0xfc230400,0x1100000c,0x7c00100,0x8220400,0x1100000c,0x7c00100,0x30230400,0x1100000c,0x7c00100,0xc822040f,0x1100000e, +0x4000000,0x4200000,0x1100000e,0x4000000,0xc200000,0x1100000e,0x7c00100,0x8230400,0x1100000e,0x7c00100,0x8250400,0x1100000e,0x7c00100,0x18220400,0x1100000e,0x7c00100, +0xc822040f,0x11000013,0x4000000,0xcb00000,0x11000019,0x7c00100,0x10220400,0x11000019,0x7c00100,0x20220400,0x11000019,0x7c00100,0x20250400,0x11000019,0x7c00100,0xc822040e, +0x11000019,0x7c00500,0xc822040f,0x11000023,0x7c00100,0xfc230400,0x11000027,0x4000000,0x4500000,0x11000037,0x4000000,0x84200000,0x11000037,0x6800100,0x80962540,0x11000037, +0x7c00100,0x80230400,0x11000038,0x7c00100,0x80220400,0x11000038,0x7c00100,0x80250400,0x11000039,0x4000000,0x84200000,0x11000039,0x4000000,0x84400000,0x11000039,0xc000010, +0x84448000,0x1100003a,0x4000000,0x44200000,0x1100003a,0x6800100,0x40962540,0x1100003a,0x7c00100,0x40230400,0x1100003b,0x4000000,0x45800000,0x1100003b,0x6800000,0x41329800, +0x1100003b,0x7c00100,0x41830000,0x1100003b,0x7e00100,0x41830000,0x1100003c,0x7c00100,0x40230400,0x1100003c,0x7c00100,0xc823040f,0x1100003d,0x4000010,0x84400000,0x1100003d, +0x7c00100,0x80230400,0x1100058d,0x24000000,0xc400000,0x11000593,0x24000000,0xc400000,0x1100059a,0x24000006,0x7000000,0x110005db,0x4000400,0xc200000,0x11000d30,0x6800000, +0x21329800,0x11005000,0x4000000,0xc8810010,0x11005000,0x4000000,0xc8870010,0x11005000,0x4000000,0xc8f00010,0x11005000,0x4000000,0xc9270010,0x11005000,0x4000000,0xc9271010, +0x11005000,0x4000000,0xc9410010,0x11005000,0xc000010,0xc8848010,0x11005000,0xc000010,0xc8b48010,0x11005000,0x24000000,0x4200000,0x11005000,0x24000000,0x4e00000,0x11005011, +0x7c00300,0xc8e30001,0x11005011,0x7c40300,0x20e30000,0x11005012,0x4000000,0xc8e00003,0x110055c4,0x4000000,0x4e00000,0x1100800a,0x7c00100,0x10230400,0x11008039,0x7c00100, +0x80230400,0x11010001,0x2802000,0x18962460,0x11010001,0x2802020,0x10962460,0x11010002,0x2802100,0x20962460,0x11010002,0x2802100,0x30962460,0x1101000b,0x2802400,0x20962460, +0x1101000e,0x2802000,0x18962460,0x11010013,0x2802400,0x10962460,0x11010013,0x2802500,0x10962460,0x11010037,0x2802100,0x80962460,0x11010039,0x2802100,0x80962460,0x11010039, +0x2802400,0x80962460,0x1101003a,0x2802100,0x40962460,0x1101003a,0x2806400,0x40962460,0x1101088e,0x2802000,0x18962460,0x11011001,0x2802000,0x10962460,0x11011001,0x2802000, +0x10c62460,0x11011865,0x2802000,0x20962460,0x11018039,0x2806400,0x80962460,0x14000000,0x4000000,0x4200000,0x14000000,0x4000400,0x4200400,0x14000000,0x7c00120,0xc8220405, +0x14000000,0x7c00120,0xc8250405,0x14000000,0x7c00500,0x10230400,0x14000000,0x24000000,0x4200000,0x14000000,0x24000020,0x4200000,0x14000008,0x7c00100,0x20220400,0x14000008, +0x7c00100,0x20250400,0x14000008,0x7c00100,0xfc220400,0x1400000e,0x7c00100,0x8220400,0x14000015,0x7c00100,0x8230400,0x14000019,0x7c00100,0x8220400,0x14000019,0x7c00100, +0x8250400,0x14000019,0x7c00100,0x10220400,0x14000019,0x7c00100,0x10250400,0x14000019,0x7c00100,0x20220400,0x14000019,0x7c00100,0x20250400,0x14000019,0x7c00100,0xfc220400, +0x14000019,0x7c00100,0xfc250400,0x1400003e,0x4000000,0x44400000,0x1400003e,0x4000000,0x44e00000,0x1400003e,0x4000010,0x44400000,0x1400003e,0x6800000,0x42d29800,0x1400003e, +0x6800100,0x40962540,0x1400003e,0x6800100,0x40962541,0x1400003e,0x7c00100,0x42b30400,0x1400003e,0x7c00100,0x42b30401,0x1400003e,0xc000010,0x44448000,0x14000057,0x4000000, +0x44200000,0x14000057,0x4000010,0x45071400,0x14000057,0x6800000,0x41329800,0x14000057,0x7c00100,0x40230400,0x14000057,0x7c00100,0x48230400,0x14000057,0x7c00500,0x40230400, +0x14000057,0x7c00900,0x48230400,0x14000057,0xc000010,0x44b48000,0x1400005a,0x4000000,0x84500000,0x1400005a,0x7c00100,0x80230400,0x1400005a,0xc000010,0x84b48000,0x1400005b, +0x4000000,0x84200000,0x1400005b,0x4000010,0x84400000,0x1400005b,0x7c00100,0x80230400,0x14000065,0x4000010,0x84400000,0x14000065,0x7c00100,0x80230400,0x140055c4,0x4000000, +0x4200000,0x1400800a,0x7c00100,0xfc230400,0x1400803e,0x7c00100,0x42b30400,0x1400803e,0x7c00100,0x42b30401,0x14010001,0x2802020,0x10962460,0x14010001,0x2802400,0x10962460, +0x14010013,0x2802500,0x20962460,0x14010015,0x2802100,0x8962460,0x1401003e,0x2802100,0x40962460,0x1401003e,0x2802100,0x40962461,0x1401003e,0x2802400,0x40962460,0x1401003e, +0x2802400,0x50962460,0x14010057,0x2802400,0x40962460,0x1401803e,0x2806400,0x42f62460,0x15000000,0x80020,0xc4218820,0x15000000,0x4000000,0x4200000,0x15000000,0x4000000, +0x4e00000,0x15000000,0x4000000,0xc200000,0x15000000,0x4000000,0x14200000,0x15000000,0x4000400,0x4200400,0x15000000,0x7c00500,0x10230400,0x15000000,0x24000000,0x4200000, +0x15000000,0x24000000,0x4400000,0x15000000,0x24000000,0x4810000,0x15000000,0x24000000,0x4e00000,0x15000000,0x24000000,0x5400000,0x15000000,0x24000000,0x5410000,0x15000000, +0x24000000,0x5710000,0x15000000,0x24000000,0xc400000,0x15000000,0x24000002,0x4200000,0x15000000,0x24000020,0x4200000,0x15000000,0x24000020,0x4810000,0x15000000,0x24000020, +0x5410000,0x15000000,0x24000500,0xc230400,0x15000000,0x2c000010,0xcb48000,0x15000002,0x4000000,0x5500000,0x15000002,0x4000020,0x4200000,0x15000002,0x7c00100,0x8230400, +0x15000002,0x7c00100,0x20230400,0x15000002,0x7c00100,0xfc230400,0x15000008,0x4000000,0x4200000,0x15000008,0x4000000,0xc200000,0x15000008,0x7c00100,0x8220400,0x15000008, +0x7c00100,0x8230400,0x15000008,0x7c00100,0x8250400,0x15000008,0x7c00500,0x8230400,0x1500000a,0x7c00100,0xfc230400,0x1500000a,0x7c00500,0x8230400,0x1500000e,0x7c00100, +0x8220400,0x1500000e,0x7c00100,0x8250400,0x1500000e,0x7c00100,0x10250400,0x15000019,0x7c00100,0x8220400,0x15000019,0x7c00100,0x8230400,0x15000019,0x7c00100,0x8250400, +0x15000019,0x7c00100,0x10220400,0x15000019,0x7c00100,0x10250400,0x15000019,0x7c00100,0x18220400,0x15000019,0x7c00100,0x18250400,0x15000019,0x7c00100,0x20220400,0x15000019, +0x7c00100,0x20250400,0x15000019,0x7c00100,0xc822040e,0x15000019,0x7c00100,0xc822040f,0x15000019,0x7c00100,0xfc250400,0x1500001a,0x4000000,0x4200000,0x1500001a,0x4000000, +0x5500000,0x1500001a,0x7c00100,0x8230400,0x1500001a,0x7c00100,0xfc230400,0x1500001b,0x7c00100,0x80230400,0x1500001c,0x4000000,0x5800000,0x1500001c,0x6800000,0x21329800, +0x1500001c,0x6800100,0x21862400,0x1500001c,0x6800100,0xfd862400,0x1500001c,0x6800100,0xfd862540,0x1500001c,0x6800500,0x21862400,0x1500001c,0x6800500,0xfd862400,0x15000023, +0x7c00100,0x10230400,0x15000024,0x4000000,0x4200000,0x15000024,0x7c00100,0x8230400,0x15000027,0x4000000,0x4200000,0x15000027,0x4000000,0x4400000,0x15000027,0x4000000, +0x4500000,0x15000027,0x7c00100,0x20230400,0x15000042,0x4000000,0x44e00000,0x15000042,0x6800000,0x42d29800,0x15000042,0x6800100,0x40962540,0x15000042,0x7c00100,0x40430400, +0x15000042,0x7c00100,0x42d30400,0x15000042,0xc000010,0x44448000,0x1500004f,0x6800000,0x41329800,0x1500004f,0x7c00100,0x40230400,0x1500004f,0xc000010,0x44448000,0x15000052, +0x4000010,0x44400000,0x15000052,0x6800000,0x41329800,0x15000052,0x6800100,0x40962540,0x15000052,0x7c00100,0x40230400,0x15000052,0xc000010,0x44448000,0x15000063,0x4000010, +0x44400000,0x15000063,0x6800000,0x41329800,0x15000063,0x7c00100,0x40230400,0x15000063,0x7c00100,0x48230400,0x15000063,0x7c00900,0x40230400,0x15000063,0xc000010,0x44448000, +0x15000063,0xc000010,0x44b48000,0x15000068,0x7c00100,0x80230400,0x1500006b,0x7c00100,0x80230400,0x1500006c,0x4000000,0x84200000,0x1500006c,0x7c00100,0x80230400,0x1500006d, +0x6800000,0x41329800,0x1500006d,0x7c00100,0x40230400,0x1500006d,0x7c00500,0x40230400,0x1500006d,0x7c00d00,0x40230400,0x1500006d,0xc000010,0x44448000,0x1500006e,0x4000000, +0x84200000,0x1500006e,0x6800100,0x80962540,0x1500006e,0x7c00100,0x80230400,0x1500006f,0x6800000,0x41329800,0x1500006f,0x6800100,0x40962540,0x1500006f,0x7c00100,0x40230400, +0x1500006f,0xc000010,0x44448000,0x15000071,0x6800000,0x41329800,0x15000071,0x6800100,0x40962540,0x1500059c,0x24000000,0x84400000,0x1500061c,0x4000400,0x4400000,0x15004000, +0x24000020,0x4810000,0x15004000,0x24000020,0x5410000,0x15005000,0x4000000,0x4e00000,0x15005000,0x24000000,0x4200000,0x15005005,0x7c00100,0x40e30400,0x15005011,0x7c40300, +0x20e30000,0x150055c4,0x4000000,0x4e00000,0x1500801c,0x7c00100,0x21830000,0x1500801c,0x7c00100,0xfd830000,0x15008024,0x7c00100,0x8230400,0x15008071,0x7c00100,0x40230400, +0x15008071,0x7c00100,0x48230400,0x15010001,0x2802000,0x8962460,0x15010001,0x2802000,0x10962460,0x15010001,0x2802000,0x18962460,0x15010001,0x2802100,0x18962460,0x15010001, +0x2802400,0x10962460,0x15010001,0x2802400,0x10c62460,0x15010001,0x2802400,0x18962460,0x15010002,0x2802100,0x8962460,0x15010002,0x2802100,0x10962460,0x15010008,0x2000, +0xc962460,0x15010008,0x2802100,0x8962460,0x15010008,0x2802400,0x20962460,0x15010010,0x2802100,0x20962460,0x1501001a,0x2802100,0x20962460,0x1501001c,0x2802100,0x21862460, +0x1501001c,0x2802100,0xfd862460,0x1501001c,0x2802500,0x21862460,0x1501001c,0x2806400,0xfd862460,0x1501001f,0x2802100,0x20962460,0x15010024,0x2802100,0x20962460,0x15010042, +0x2802100,0x40962460,0x1501004f,0x2802100,0x40962460,0x1501004f,0x2802400,0x40962460,0x15010052,0x2802100,0x40962460,0x15010052,0x2802400,0x40962460,0x15010052,0x2802d00, +0x40962460,0x1501006e,0x2802100,0x80962460,0x1501006e,0x2806400,0x80962460,0x1501006f,0x2806400,0x40962460,0x15010071,0x2802100,0x40962460,0x15010071,0x2806400,0x40962460, +0x15010997,0x2802000,0x10962460,0x15010c9c,0x2802400,0x18962460,0x15010c9c,0x2802400,0x20962460,0x16000000,0x4000000,0x4200000,0x16000000,0x4000000,0x5500000,0x16000000, +0x4000000,0x5600000,0x16000000,0x4000000,0xc8100006,0x16000000,0x4000000,0xc8200003,0x16000000,0x24000000,0x4200000,0x16000002,0x4000000,0x4200000,0x16000004,0x4000000, +0x5600000,0x16000007,0x7c00100,0x80220400,0x16000007,0x7c00100,0x80250400,0x16000008,0x7c00100,0xfc220400,0x16000008,0x7c00100,0xfc250400,0x1600000a,0x4000000,0xc200000, +0x1600000a,0x6800100,0x8962540,0x1600000a,0x7c00100,0x8230400,0x16000012,0x7c00100,0xa230500,0x16000012,0x7c00100,0xa330520,0x16000019,0x7c00100,0x8250400,0x1600001c, +0x4000000,0x5800000,0x1600001c,0x6800100,0x21862400,0x1600001c,0x6800500,0x21862400,0x1600001c,0x6800500,0xfd862400,0x1600001c,0x7c00100,0x21830000,0x1600001c,0x7c00900, +0x21830000,0x16000028,0x4000002,0x47000000,0x16000028,0x7c00100,0x40230400,0x1600003b,0x6800000,0x41329800,0x1600003b,0x7c00100,0x41830000,0x16000047,0x7c00100,0x80230400, +0x16000047,0x7c00100,0x80830400,0x16000047,0x7c00100,0x81430400,0x1600004e,0x4000000,0x44e00000,0x1600004e,0x4000010,0x44400000,0x1600004e,0x6800000,0x42d29800,0x1600004e, +0x6800100,0x40962540,0x1600004e,0x7c00100,0x42b30400,0x1600004e,0xc000010,0x44448000,0x16000058,0x7c00100,0x80230400,0x1600005b,0x4000000,0x84200000,0x1600006a,0x4000000, +0x45800000,0x1600006a,0x6800000,0x41329800,0x1600006a,0x6800100,0x41862400,0x1600006a,0x6800100,0x41862540,0x1600006a,0x7c00900,0x41830000,0x1600006a,0xc000010,0x45848000, +0x16000073,0x6800000,0x41329800,0x16000073,0x6800100,0x40962540,0x16000073,0x6800400,0x40962540,0x16000073,0x7c00100,0x40230400,0x16000073,0xc000010,0x44448000,0x16000074, +0x4000000,0x84200000,0x16000074,0x4000010,0x84400000,0x16000074,0x7c00100,0x80230400,0x16000075,0x4000000,0x84400000,0x16000075,0x4000010,0x84400000,0x16000075,0x7c00100, +0x80230400,0x16000078,0x4000000,0x84200000,0x16000078,0x6800100,0x80962540,0x16000078,0x7c00100,0x80230400,0x16000078,0x7c00100,0x80230401,0x16000078,0xc000010,0x84448000, +0x16000078,0x80000000,0x85329960,0x1600007a,0x4000000,0x84200000,0x1600007a,0x7c00100,0x80230400,0x1600007d,0x4000000,0x84200000,0x1600007d,0x7c00100,0x80230400,0x1600007e, +0x4000000,0x84200000,0x1600007e,0x4000010,0x84200000,0x1600007e,0x7c00100,0x80230400,0x1600007e,0xc000010,0x84248000,0x1600007f,0x4000000,0x45800000,0x1600007f,0x4000010, +0x45800000,0x1600007f,0x7c00100,0x41830000,0x1600007f,0x7c00500,0x41830000,0x1600007f,0x7c00900,0x41830000,0x1600007f,0x7e00100,0x41830000,0x16000082,0x4000000,0x44200000, +0x16000082,0x4000010,0x44400000,0x16000082,0x7c00100,0x40230400,0x16000082,0xc000010,0x44448000,0x16000083,0x4000010,0x44400000,0x16000083,0x7c00100,0x40230400,0x16000083, +0xc000010,0x44448000,0x16000085,0x4000000,0x84200000,0x16000085,0x7c00100,0x80230400,0x16000546,0x7c00100,0x8230400,0x16000548,0x4000400,0xc200000,0x16000562,0x6800400, +0x8962540,0x16000567,0x7c00100,0x8230400,0x1600056a,0x7c00100,0x8230400,0x1600056d,0x7c00100,0x8230400,0x16000573,0x7c00100,0x8230400,0x1600059e,0x24000000,0xc400000, +0x160005dd,0x4000000,0x4200000,0x160005ed,0x4000000,0x4200000,0x160005fc,0x4000000,0x4200000,0x16000607,0x4000000,0x5500000,0x1600061f,0x7c00900,0x60430400,0x16000e1a, +0x7c00100,0x8230400,0x16001000,0x4000000,0x4100000,0x16001000,0x4000000,0xc8100002,0x16001000,0x4000000,0xc8100003,0x16001000,0x4000000,0xc8100006,0x16001000,0x4000000, +0xc810000d,0x16001000,0x4000100,0x4150400,0x16001000,0x4000100,0xc815040d,0x16001000,0x24000000,0x4100000,0x16001000,0x24000000,0x4e00000,0x16001000,0x24000000,0x6800000, +0x16005000,0x4000000,0xc8e00002,0x16005000,0x4000000,0xc8e0000d,0x16005000,0x24000000,0x4100000,0x16005000,0x24000000,0x4e00000,0x16005011,0x7c00300,0xc8e30001,0x16005011, +0x7c40300,0x20e30000,0x16005012,0x7c00100,0xa130480,0x16005014,0x4000000,0xc8e0000d,0x160055c4,0x4000000,0xc8e00003,0x1600800a,0x7c00100,0x20230400,0x1600801c,0x7c00100, +0x21830000,0x1600804e,0x7c00100,0x42b30400,0x1600806a,0x7c00100,0x41830000,0x16008073,0x7c00100,0x40230400,0x16010001,0x2802400,0x10962460,0x16010007,0x2802400,0x80962460, +0x16010007,0x2802400,0x90962460,0x1601000a,0x2802100,0x20962460,0x1601000a,0x2802400,0x8962460,0x1601001c,0x2802100,0x21862460,0x1601004e,0x2802100,0x40962460,0x1601004e, +0x2802400,0x40962460,0x1601006a,0x2802100,0x41862460,0x1601006a,0x2802400,0x40962460,0x1601006a,0x2802400,0x41862460,0x16010073,0x2802100,0x40962460,0x16010073,0x2806400, +0x40962460,0x16010078,0x2802100,0x80962460,0x16010078,0x2802400,0x80962460,0x16010078,0x2806400,0x80962460,0x1601007e,0x2802000,0x80962460,0x1601007e,0x2802100,0x80962460, +0x1601007e,0x2802400,0x80962460,0x1601007f,0x2802100,0x41862460,0x1601007f,0x2802400,0x41862460,0x16010082,0x2802400,0x40962460,0x16010946,0x2802400,0x8962460,0x16010947, +0x2802400,0x8962460,0x1601094b,0x2802400,0x8962460,0x16010950,0x2802400,0x8962460,0x16010953,0x2802400,0x8962460,0x16010956,0x2802400,0x8962460,0x1601095a,0x2802400, +0x8962460,0x1601095c,0x2802400,0x8962460,0x16010964,0x2802400,0x8962460,0x1601096f,0x2802400,0x8962460,0x16010e16,0x2802400,0x8962460,0x1601804e,0x2806400,0x42f62460, +0x1601806a,0x2806400,0x41862460,0x18000000,0x4000000,0x4200000,0x18000000,0x4000000,0x4e00000,0x18000000,0x4000000,0x5600000,0x18000000,0x4000000,0x6703580,0x18000000, +0x24000000,0x4200000,0x18000000,0x24000000,0x4e00000,0x18000000,0x24000000,0x5710000,0x18000000,0x24000020,0x4200000,0x18000002,0x4000000,0x14200000,0x18000002,0x7c00100, +0xfc230400,0x18000008,0x7c00100,0x8220400,0x18000008,0x7c00100,0x8250400,0x1800000a,0x6800100,0xfc962540,0x1800000a,0x7c00100,0xfc230400,0x1800000b,0x7c00100,0x20230400, +0x18000019,0x7c00100,0x8220400,0x18000019,0x7c00100,0x8250400,0x18000019,0x7c00100,0x10220400,0x18000019,0x7c00100,0xc822040e,0x18000019,0x7c00100,0xfc250400,0x1800001a, +0x7c00100,0x8230560,0x1800001f,0x4000000,0x4200000,0x18000027,0x4000000,0x4c00000,0x18000027,0x7c00100,0x8230400,0x1800003c,0x4000000,0x44400000,0x1800003f,0x4000000, +0x44200000,0x1800003f,0x6800100,0x40962540,0x1800003f,0x7c00100,0x42d30400,0x18000041,0x4000000,0x84e00000,0x18000041,0x4000010,0x84e00000,0x18000041,0x6800000,0x82d29800, +0x18000041,0x6800100,0x80962540,0x18000041,0x7c00100,0x82b30400,0x18000041,0x7c00100,0x82c30400,0x18000041,0xc000010,0x84448000,0x18000054,0x4000010,0x44200000,0x18000054, +0x7c00100,0x40230400,0x18000082,0x7c00100,0x40230400,0x18001000,0x4000000,0x4100000,0x18001000,0x4000000,0xc810000d,0x18001000,0x4000100,0x4150400,0x18001000,0x4000100, +0xc815040d,0x18005000,0x4000000,0x4100000,0x18005000,0x4000000,0x4200000,0x18005000,0x4000000,0x4e00000,0x18005000,0x4000000,0x6800000,0x18005000,0x4000000,0xc8e0000d, +0x18005000,0x24000000,0x4200000,0x18005000,0x24000000,0x4e00000,0x18005000,0x24000000,0x6800000,0x18005005,0x7c00100,0x40e30400,0x18005011,0x7c40300,0x20e30000,0x18005014, +0x7c00100,0x8e30000,0x18005016,0x7c00100,0x8e30c00,0x180055c4,0x4000000,0xc8e00003,0x1800801a,0x7c00100,0x8230400,0x1800801a,0x7c00100,0x20230400,0x18010001,0x2802400, +0x10c62460,0x18010002,0x2802100,0x20962460,0x1801000a,0x2802100,0xfc962460,0x1801000b,0x2802400,0x20962460,0x18010027,0x2802100,0x8962460,0x1801003c,0x2806000,0x40962460, +0x1801003f,0x2802100,0x40962460,0x1801003f,0x2802400,0x40962460,0x1801003f,0x2806400,0x42e62460,0x18010041,0x2802100,0x80962460,0x18010041,0x2806400,0x82f62460,0x18010054, +0x2802000,0x40962460,0x19000000,0x4000000,0x4200000,0x19000000,0x4000000,0xc820000f,0x19000000,0x24000000,0x4200000,0x19000000,0x24000000,0x4400000,0x19000000,0x24000000, +0xc200000,0x19000000,0x24000002,0x4300000,0x19000000,0x24000020,0x4200000,0x19000002,0x4000020,0x4200000,0x19000002,0x7c00100,0x20230400,0x19000002,0x7c00100,0xfc230400, +0x19000002,0x7c00120,0xc8230405,0x19000002,0x80000000,0x5329960,0x19000003,0x4000000,0x5600000,0x19000007,0x7c00100,0x80220400,0x19000007,0x7c00100,0x80250400,0x1900000c, +0x7c00100,0x10220400,0x1900000c,0x7c00100,0x20230400,0x1900000c,0x7c00100,0xfc250400,0x1900000f,0x4000000,0x4200000,0x19000018,0x7c00100,0x21830000,0x19000019,0x7c00100, +0x20220400,0x19000019,0x7c00100,0x20250400,0x19000019,0x7c00100,0xfc250400,0x19000019,0x7c00500,0xc822040f,0x1900003c,0x7c00100,0x40230400,0x19000056,0x7c00100,0x80230400, +0x1900005c,0x6800100,0x40962540,0x1900005c,0x7c00100,0x40230400,0x1900005c,0x7c00500,0x40230400,0x19000071,0x4000000,0x44200000,0x19000071,0x7c00100,0x48230400,0x19000073, +0x6800100,0x40962540,0x19000073,0x7c00100,0x40230400,0x19000073,0x7c00900,0x40230400,0x19000073,0xc000010,0x44448000,0x19000076,0x4000000,0x44400000,0x19000076,0x6800000, +0x41329800,0x19000076,0x6800100,0x40962540,0x19000076,0xc000010,0x44448000,0x1900008d,0x7c00100,0x80230400,0x19000097,0x4000000,0x84200000,0x19000097,0x4000000,0x84400000, +0x19000097,0x6800000,0x81329800,0x19000097,0x6800100,0x80962540,0x19000097,0x7c00100,0x80230400,0x19000097,0x7c00100,0x80230560,0x19000097,0xc000010,0x84448000,0x19000098, +0x6800000,0x81329800,0x19000098,0x7c00100,0x80230400,0x19000099,0x6800000,0x81329800,0x19000099,0x6800100,0x80962540,0x19000099,0x7c00100,0x80230400,0x1900057e,0x7c00100, +0x8230400,0x19005000,0x4000000,0x4e00000,0x19005011,0x7c00300,0xc8e30001,0x19005011,0x7c40300,0x20e30000,0x19008071,0x7c00100,0x48230400,0x19008073,0x7c00100,0x40230400, +0x19008076,0x7c00100,0x40230400,0x19010002,0x2802400,0x20962460,0x19010002,0x2802500,0x10962460,0x19010002,0x2802500,0x20962460,0x19010002,0x2802500,0x30962460,0x19010008, +0x2802100,0x8962460,0x1901005c,0x2802500,0x40962460,0x19010071,0x2802100,0x48962460,0x19010073,0x2802100,0x40962460,0x19010076,0x2802100,0x40962460,0x19010076,0x2802100, +0x40962461,0x19010076,0x2806400,0x40962460,0x19010097,0x2802100,0x80962460,0x19010097,0x2806400,0x80962460,0x19010099,0x2802100,0x80962460,0x19010099,0x2802400,0x80962460, +0x19010099,0x2806400,0x80962460,0x19010980,0x2802400,0x8962460,0x19018071,0x2806400,0x48962460,0x19018073,0x2806400,0x40962460,0x19018076,0x2806400,0x40962460,0x19018584, +0x7c00100,0x8230400,0x1a000000,0x4000000,0x5600000,0x1b000000,0x80000,0xc4918820,0x1b000caf,0x80000,0xc4918820,0x1c000000,0x4000000,0x4100000,0x1c000000,0x4000000, +0x4200000,0x1c000000,0x4000000,0x4e00000,0x1c000000,0x4000000,0x5200000,0x1c000000,0x4000000,0x5500000,0x1c000000,0x4000000,0x5600000,0x1c000000,0x4000000,0x5710000, +0x1c000000,0x4000000,0x6800000,0x1c000000,0x4000400,0x4200400,0x1c000000,0x24000000,0x4200000,0x1c000000,0x24000000,0x4400000,0x1c000000,0x24000000,0x4e00000,0x1c000000, +0x24000002,0x7000000,0x1c000000,0x24000008,0x5410000,0x1c000000,0x80000000,0x5329960,0x1c000002,0x7c00100,0x8230400,0x1c000002,0x7c00100,0x20230400,0x1c000003,0x4000000, +0x4200000,0x1c000004,0x7c00100,0x8230400,0x1c000008,0x7c00100,0x8220400,0x1c000008,0x7c00100,0x8250400,0x1c000008,0x7c00500,0xc822040f,0x1c00000e,0x4000000,0x4200000, +0x1c00000e,0x7c00100,0x8220400,0x1c00000e,0x7c00100,0x8250400,0x1c000019,0x7c00100,0x8220400,0x1c000019,0x7c00100,0x8230400,0x1c000019,0x7c00100,0x8250400,0x1c000019, +0x7c00500,0xc822040f,0x1c00001c,0x6800000,0x21329800,0x1c00001c,0x6800500,0x21862400,0x1c00001c,0x7c00900,0x9830000,0x1c00001e,0x7c00100,0x80230400,0x1c000020,0x7c00100, +0x80230400,0x1c000021,0x4000000,0x4200000,0x1c000021,0x6800000,0x21329800,0x1c000030,0x7c00100,0x40230400,0x1c00004b,0x4000000,0x84200000,0x1c00004b,0x4000010,0x84400000, +0x1c00004b,0x6800000,0x81329800,0x1c00004b,0x7c00100,0x80230400,0x1c00004b,0x7c00900,0x80230400,0x1c00004b,0xc000010,0x84448000,0x1c000053,0x7c00100,0x80230400,0x1c000059, +0x7c00100,0x80230400,0x1c000065,0x4000010,0x84400000,0x1c000065,0x7c00100,0x80230400,0x1c000079,0x4000000,0x84200000,0x1c000079,0x4000000,0x84f00000,0x1c000079,0x4000010, +0x84400000,0x1c000079,0x7c00100,0x80230400,0x1c00007b,0x4000000,0x84200000,0x1c00007b,0x4000010,0x84200000,0x1c00007b,0x7c00100,0x80230400,0x1c000086,0x7c00100,0x80230400, +0x1c000086,0xc000010,0x84448000,0x1c000087,0x4000000,0x84200000,0x1c000087,0x7c00100,0x80230400,0x1c000087,0xc000010,0x84448000,0x1c000088,0x7c00100,0x80230400,0x1c000089, +0x6800100,0x80962540,0x1c000089,0x6800100,0x80962541,0x1c000089,0x7c00100,0x80430400,0x1c000089,0x7c00100,0x82b30400,0x1c000089,0x7c00100,0x82d30400,0x1c000089,0x7c00900, +0x80430400,0x1c00008c,0x4000000,0x84200000,0x1c00008c,0x7c00100,0x80230400,0x1c00008e,0x4000000,0x84200000,0x1c00008e,0x7c00100,0x80230400,0x1c00008f,0x4000000,0x84200000, +0x1c00008f,0x7c00100,0x80230400,0x1c000090,0x4000000,0x84200000,0x1c000090,0x7c00100,0x80230400,0x1c000091,0x6800000,0x81329800,0x1c000091,0x6800100,0x80962540,0x1c000091, +0x7c00100,0x80230400,0x1c000092,0x4000000,0x84200000,0x1c000092,0x6800000,0x81329800,0x1c000092,0x7c00100,0x80220400,0x1c000092,0x7c00100,0x80230400,0x1c000092,0x7c00100, +0x80250400,0x1c000095,0x6800000,0xa1329800,0x1c000095,0x7c00100,0xa0230400,0x1c000095,0xc000010,0x84448000,0x1c000097,0x7c00100,0x80230400,0x1c000097,0xc000010,0x84248000, +0x1c00009d,0x4000000,0x84200000,0x1c00009d,0x4000010,0x84200000,0x1c00009d,0x6800100,0x80962540,0x1c00009d,0x7c00100,0x80230400,0x1c00009d,0xc000010,0x84448000,0x1c00009e, +0x4000000,0x84200000,0x1c00009e,0x6800000,0x81329800,0x1c00009e,0x6800100,0x80962540,0x1c00009e,0x6800100,0x80962541,0x1c00009e,0x7c00100,0x80230400,0x1c00009f,0x4000000, +0x84200000,0x1c00009f,0x7c00100,0x80230400,0x1c0000a0,0x4000000,0x84200000,0x1c0000a0,0x4000000,0x84500000,0x1c0000a0,0x7c00100,0x80230400,0x1c0000a3,0x4000000,0x84200000, +0x1c0000a3,0x6800000,0x81329800,0x1c0000a3,0x6800100,0x80962540,0x1c0000a3,0x7c00100,0x80230400,0x1c0000a3,0xc000010,0x84448000,0x1c0000a5,0x7c00100,0x80230400,0x1c0000a6, +0x4000000,0x84500000,0x1c0000a6,0x4000010,0x84b00000,0x1c0000a6,0x4000800,0x84200000,0x1c0000a6,0x6800100,0x80962540,0x1c0000a6,0x6800100,0x80962541,0x1c0000a6,0x7c00100, +0x80230400,0x1c0000a6,0xc000010,0x84448000,0x1c00045f,0x80000,0xc4918820,0x1c00045f,0x2c000010,0x84448000,0x1c0005a5,0x24000010,0x4400000,0x1c00062f,0x4000000,0xc200000, +0x1c000e33,0x4000010,0x84400000,0x1c000e35,0x6800100,0xfc962540,0x1c005000,0x4000000,0x4e00000,0x1c005000,0x4000000,0x6800000,0x1c00800a,0x7c00100,0x8230400,0x1c00801c, +0x7c00100,0x9830000,0x1c00801c,0x7c00100,0x21830000,0x1c008024,0x7c00100,0x8230400,0x1c010001,0x2400,0x4962460,0x1c010001,0x2802100,0x10962460,0x1c010001,0x2802400, +0x8962460,0x1c010001,0x2802400,0x10962460,0x1c010001,0x2802400,0x10c62460,0x1c010002,0x2802100,0x20962460,0x1c010015,0x2802100,0x8962460,0x1c01001a,0x2802100,0x8962460, +0x1c01001c,0x2802500,0x9862460,0x1c01001c,0x2802500,0x21862460,0x1c010024,0x2802100,0x8962460,0x1c010041,0x2806000,0x80c62460,0x1c01004b,0x2802400,0x80962460,0x1c010059, +0x2802100,0x80962460,0x1c010079,0x2802400,0x80962460,0x1c010086,0x2802400,0x80962460,0x1c010087,0x2802000,0x80962460,0x1c010087,0x2802100,0x80962460,0x1c010089,0x2802100, +0x80962460,0x1c010089,0x2802400,0x80962460,0x1c010089,0x2806400,0x82f62460,0x1c01008c,0x2802400,0x80962460,0x1c010091,0x2802100,0x80962460,0x1c010091,0x2802400,0x80962460, +0x1c010091,0x2806400,0x80962460,0x1c01009d,0x2802100,0x80962460,0x1c01009d,0x2802400,0x80962460,0x1c01009d,0x2802900,0x80962460,0x1c01009d,0x2806400,0x80962460,0x1c01009e, +0x2802100,0x80962460,0x1c01009e,0x2802400,0x80962460,0x1c01009e,0x2806400,0x80962460,0x1c0100a0,0x2802400,0x80962460,0x1c0100a3,0x2802100,0x80962460,0x1c0100a3,0x2806400, +0x80962460,0x1c0100a6,0x2802100,0x80962460,0x1c0100a6,0x2802400,0x80962460,0x1c0100a6,0x2806400,0x80962460,0x1c01097e,0x2802400,0x8962460,0x1c010a2f,0x2802400,0x8962460, +0x1c010e35,0x2802100,0xfc962460,0x1c010e35,0x2802400,0xfc962460,0x20000000,0x4000000,0x5500000,0x20000000,0x4000000,0x24200000,0x20000000,0x4000000,0x24e00000,0x20000000, +0x4000000,0x34200000,0x20000000,0x24000000,0x24200000,0x20000002,0x7c00100,0x20230400,0x20000006,0x7c00100,0x40220400,0x20000006,0x7c00100,0x40250400,0x2000000a,0x4000000, +0x2c500000,0x2000000a,0x7c00100,0x28230400,0x20000019,0x7c00100,0x20220400,0x20000019,0x7c00100,0x20230400,0x20000019,0x7c00100,0x20250400,0x2000001a,0x7c00100,0x8230400, +0x2000004c,0x4000000,0x84200000,0x2000004c,0x7c00100,0x80220400,0x2000004c,0x7c00100,0x80250400,0x20000065,0x7c00100,0x80230400,0x20000070,0x4000000,0x84200000,0x20000070, +0x4000010,0x84400000,0x20000070,0xc000010,0x84448000,0x20000089,0x7c00100,0x82d30400,0x2000008d,0x4000000,0x84200000,0x20000097,0x4000000,0x84400000,0x20000097,0x4000000, +0x84500000,0x20000097,0x7c00100,0x80230400,0x20000097,0xc000010,0x84448000,0x2000009c,0x7c00100,0x80230400,0x2000009c,0x7c00100,0x80830400,0x2000009c,0x7c00100,0x81430400, +0x200000a1,0x4000000,0x85800000,0x200000a1,0x6800000,0x81329800,0x200000a1,0x6800100,0x81862400,0x200000a1,0x6800100,0x81862540,0x200000a1,0x7c00100,0x81830000,0x200000a1, +0xc000010,0x84448000,0x200000a2,0x4000000,0x84200000,0x200000a2,0x7c00100,0x80230400,0x200000a4,0x7c00100,0x80230400,0x200000a4,0xc000010,0x84448000,0x200000a6,0x7c00100, +0x80230400,0x200000a6,0xc000010,0x84448000,0x20005000,0x4000000,0x4e00000,0x20005000,0x4000000,0x6800000,0x20005011,0x7c40300,0x20e30000,0x2000800f,0x7c00100,0x20230400, +0x20008024,0x7c00100,0x20230400,0x20010002,0x2802500,0x20962460,0x20010008,0x2802100,0x28962460,0x20010008,0x2802400,0x30962460,0x20010008,0x2802400,0x30c62460,0x20010070, +0x2802000,0x80962460,0x20010089,0x2802100,0x80962460,0x20010097,0x2802000,0x80962460,0x20010097,0x2802400,0x80962460,0x200100a1,0x2802100,0x81862460,0x200100a1,0x2806400, +0x81862460,0x200100a6,0x2802100,0x80962460,0x20015000,0x4000000,0x6902460,0x24000000,0x4000000,0x4e00000,0x24000000,0x24000000,0x4200000,0x24000000,0x24000000,0x4400000, +0x24000000,0x80000000,0x5329960,0x24000002,0x7c00100,0x20230400,0x24000002,0x7c00100,0xfc230400,0x24000008,0x7c00100,0x8220400,0x2400000e,0x4000000,0x4200000,0x24000015, +0x7c00100,0x20230400,0x24000019,0x7c00100,0x10250400,0x2400001a,0x4000000,0x4200000,0x2400001a,0x7c00100,0x20230400,0x2400001b,0x4000000,0x84500000,0x240000a7,0x4000000, +0x45400000,0x240000a7,0x6800000,0x41329800,0x240000a7,0x7c00100,0x40220400,0x240000a7,0x7c00100,0x40250400,0x240000a8,0x4000000,0x84200000,0x240000a8,0x4000000,0x84400000, +0x240000a8,0x4000010,0x84400000,0x240000a8,0x6800000,0x81329800,0x240000a8,0x6800100,0x80962540,0x240000a8,0x7c00100,0x80230400,0x240000a8,0xc000010,0x84448000,0x240000a9, +0x4000000,0x84500000,0x240000a9,0x4000010,0x84b00000,0x240000a9,0x6800100,0x80962540,0x240000a9,0x7c00100,0x80230400,0x240000aa,0x4000000,0x44200000,0x240000aa,0x4000000, +0x44400000,0x240000aa,0x4000010,0x44400000,0x240000aa,0x6800000,0x41329800,0x240000aa,0x6800100,0x40962540,0x240000aa,0x7c00100,0x40230400,0x240000aa,0xc000010,0x44448000, +0x240000ab,0x7c00100,0x40220400,0x240000ab,0x7c00100,0x40250400,0x2400049a,0x24000000,0x4400000,0x24001000,0x4000000,0x4100000,0x24005000,0x4000000,0x4e00000,0x24005000, +0x4000000,0x6800000,0x24005000,0x4000000,0xc8e0000d,0x2400509a,0x7c00300,0x80e30000,0x2400509a,0x7c00900,0x81230400,0x24010001,0x2802400,0x10962460,0x24010002,0x2802000, +0x10962460,0x24010002,0x2802100,0x10962460,0x24010038,0x2802100,0x80962460,0x2401006f,0x2802100,0x40962460,0x2401009d,0x2802100,0x80962460,0x240100a7,0x2802100,0x40962460, +0x240100a7,0x2802400,0x40962460,0x240100a7,0x2802c00,0x40962460,0x240100a8,0x2802100,0x80962460,0x240100a8,0x2806400,0x80962460,0x240100a9,0x2802100,0x80962460,0x240100aa, +0x2802100,0x40962460,0x240100aa,0x2802400,0x40962460,0x240100aa,0x2806400,0x40962460,0x28000000,0x4000000,0x4200000,0x28000000,0x4000000,0x4e00000,0x28000000,0x4000000, +0x5600000,0x28000000,0x24000000,0x4200000,0x28000000,0x24000000,0x4400000,0x28000004,0x4000000,0x4200000,0x28000004,0x7c00100,0x8230400,0x2800001e,0x7c00100,0x80230400, +0x28000022,0x7c00100,0x40230400,0x280000af,0x6800000,0x81329800,0x280000af,0x7c00100,0x80230400,0x280000af,0x7c00100,0x80230560,0x280000b0,0x4000000,0x84400000,0x280000b0, +0x4000000,0x84500000,0x280000b0,0x4000010,0x84400000,0x280000b0,0x6800100,0x80962540,0x280000b0,0x7c00100,0x80230560,0x280000b0,0xc000010,0x84448000,0x280000b1,0x4000000, +0x84200000,0x280000b1,0x4000000,0x84400000,0x280000b1,0x4000000,0x84500000,0x280000b1,0x6800100,0x80962540,0x280000b1,0xc000010,0x84448000,0x28000584,0x6800400,0x8962540, +0x28005000,0x4000000,0x4e00000,0x28005000,0x4000000,0x6800000,0x28005005,0x7c00100,0x48e30400,0x28005011,0x7c40300,0x20e30000,0x28005014,0x7c00100,0x8e30000,0x28005096, +0x7c00300,0x80e30000,0x28005096,0x7c00900,0x81230400,0x280080b0,0x7c00100,0x80230400,0x280080b1,0x7c00100,0x80230400,0x28010001,0x2802400,0x10962460,0x2801000f,0x2802100, +0x20962460,0x2801000f,0x2802400,0x20962460,0x2801000f,0x2802900,0x20962460,0x2801001a,0x2802100,0x20962460,0x2801001a,0x2806400,0x8962460,0x280100af,0x2802100,0x80962460, +0x280100af,0x2802400,0x80962460,0x280100af,0x2806400,0x80962460,0x280100b0,0x2802100,0x80962460,0x280100b0,0x2802800,0x80962460,0x280100b1,0x2802000,0x80962460,0x280100b1, +0x2802100,0x80962460,0x280100b1,0x2806400,0x80962460,0x28010985,0x2802400,0x10962460,0x280180b0,0x2806400,0x80962460,0x280180b1,0x2806400,0x80962460,0x280180b1,0x7c00100, +0x80230400,0x2c000000,0x4000000,0x4200000,0x2c000000,0x4000000,0x4e00000,0x2c000000,0x4000000,0x5500000,0x2c000000,0x24000000,0x4200000,0x2c000000,0x24000000,0x4400000, +0x2c000000,0x24000010,0x4400000,0x2c000003,0x7c00100,0x10220400,0x2c00000a,0x7c00100,0x8230400,0x2c00000c,0x7c00100,0xfc230400,0x2c000010,0x4000000,0x4200000,0x2c000013, +0x7c00100,0x22633800,0x2c000015,0x4000000,0x4500000,0x2c000019,0x7c00100,0x10220400,0x2c000019,0x7c00100,0x20220400,0x2c000019,0x7c00100,0x20250400,0x2c00001b,0x7c00100, +0x80230400,0x2c000039,0x4000000,0x84200000,0x2c000057,0x4000000,0x45600000,0x2c000076,0x6800100,0x40962540,0x2c000078,0x80000000,0x85329960,0x2c0000a1,0x7c00100,0x81830000, +0x2c0000b0,0x7c00100,0x80230400,0x2c0000b2,0x4000000,0x84200000,0x2c0000b2,0x6800100,0x80962540,0x2c0000b2,0x7c00100,0x80230400,0x2c0000b3,0x6800000,0x81329800,0x2c0000b3, +0x6800100,0x80962540,0x2c0000b3,0x7c00100,0x80230400,0x2c0000b4,0x6800100,0x80962540,0x2c0000b4,0x7c00100,0x80430400,0x2c0000b4,0x7c00100,0x82d30400,0x2c0000b4,0xc000010, +0x84448000,0x2c0000b5,0x4000000,0x84200000,0x2c0000b5,0x4000010,0x84400000,0x2c0000b5,0x7c00100,0x80220400,0x2c0000b5,0x7c00100,0x80250400,0x2c0000b5,0xc000010,0x84448000, +0x2c0000b6,0x6800000,0x41329800,0x2c0000b6,0x7c00100,0x40230400,0x2c0000b6,0x7c00500,0x40230400,0x2c0000b7,0x4000000,0x84200000,0x2c0000b7,0x7c00100,0x80230400,0x2c0000b7, +0xc000010,0x84248000,0x2c0000b8,0x4000000,0x84200000,0x2c0000b8,0x7c00100,0x80230400,0x2c005000,0x4000000,0x4200000,0x2c005000,0x4000000,0x4e00000,0x2c005000,0x4000000, +0x6800000,0x2c005005,0x7c00100,0x40e30400,0x2c005011,0x7c40300,0x20e30000,0x2c00509a,0x7c00300,0x80e30000,0x2c008039,0x7c00100,0x80230400,0x2c008076,0x7c00100,0x40230400, +0x2c010002,0x2802400,0x10962460,0x2c010004,0x2802000,0x20962460,0x2c01000a,0x2802100,0x8962460,0x2c010024,0x2802100,0x20962460,0x2c010057,0x2802000,0x40962460,0x2c0100aa, +0x2802000,0x40962460,0x2c0100b2,0x2802100,0x80962460,0x2c0100b2,0x2802400,0x80962460,0x2c0100b2,0x2806400,0x80962460,0x2c0100b3,0x2802100,0x80962460,0x2c0100b3,0x2806400, +0x80962460,0x2c0100b4,0x2802100,0x80962460,0x2c0100b6,0x2802500,0x40962460,0x2c0100b7,0x2802400,0x80962460,0x2c01092e,0x2802400,0x20962460,0x30000000,0x4000000,0x4200000, +0x30000000,0x4000000,0xc820000f,0x30000000,0x24000000,0x4200000,0x30000000,0x24000010,0x4400000,0x30000018,0x7c00100,0x21830000,0x30000019,0x7c00100,0x8250400,0x30000019, +0x7c00100,0x10220400,0x30000019,0x7c00100,0x10250400,0x30000019,0x7c00100,0x20220400,0x30000019,0x7c00100,0x20250400,0x30000023,0x4000000,0x4200000,0x30000023,0x4000000, +0x4400000,0x30000023,0x4000000,0x5500000,0x30000024,0x4000000,0x4500000,0x30000047,0,0x84818820,0x30000047,0,0x84c18820,0x30000047,0,0x85418820, +0x3000005c,0x6800100,0x40962540,0x3000005c,0x7c00100,0x40230400,0x30000099,0x7c00100,0x80230400,0x300000a7,0x7c00100,0x40230400,0x300000aa,0x7c00100,0x40230400,0x300000b0, +0x7c00100,0x80230560,0x300000b9,0x7c00100,0x80230400,0x300000ba,0x4000000,0x44200000,0x300000ba,0x6800000,0x41329800,0x300000ba,0x7c00100,0x40230400,0x300000ba,0x7c00900, +0x40230400,0x300000bb,0x4000000,0x84500000,0x300000bb,0x6800100,0x80962540,0x300000bb,0x7c00100,0x80230400,0x300000bc,0x4000000,0x45600000,0x300000bc,0x6800000,0x41329800, +0x300000bc,0x7c00100,0x40230400,0x300004db,0x7c00100,0x80230400,0x30000d30,0x4000000,0x4200000,0x30005000,0x4000000,0x4e00000,0x30005000,0x4000000,0x6800000,0x30005011, +0x4000000,0x5200000,0x30005011,0x7c00900,0x9230400,0x30005014,0x7c00100,0xa530000,0x30005016,0x7c00100,0xa530c00,0x3000509a,0x7c00300,0x80e30000,0x30010018,0x2806400, +0x21862460,0x3001005c,0x2802100,0x40962460,0x300100ba,0x2802400,0x40962460,0x300100bb,0x2802100,0x80962460,0x300100bb,0x2806400,0x80962460,0x300100bc,0x2802400,0x40962460, +0x310055c4,0x4000000,0xc8e0000d,0x34000000,0x4000000,0x4200000,0x34000000,0x4000400,0x4200000,0x34000000,0x6800000,0xc9329805,0x34000000,0x24000000,0x4200000,0x34000002, +0x7c00100,0x20230400,0x34000002,0x7c00100,0xfc230400,0x34000019,0x7c00100,0x8220400,0x34000019,0x7c00100,0x8250400,0x34000019,0x7c00100,0x10220400,0x34000019,0x7c00500, +0xc822040f,0x3400001a,0x7c00100,0x18230400,0x34000083,0x7c00100,0x40230400,0x34000097,0x6800100,0x80962540,0x340000aa,0x4000010,0x44400000,0x340000aa,0x7c00100,0x40230400, +0x340000bd,0x4000000,0x84200000,0x340000bd,0x7c00100,0x80230400,0x340000be,0x4000000,0x84400000,0x340000be,0x6800000,0x82d29800,0x340000be,0x6800100,0x80962540,0x340000be, +0x6800100,0x80962541,0x340000be,0x7c00100,0x82c30560,0x340000be,0xc000010,0x84448000,0x340000c0,0x4000002,0x87000000,0x340000c0,0x7c00100,0x80230400,0x34005000,0x4000000, +0x4e00000,0x34005000,0x4000000,0x6800000,0x34005005,0x7c00100,0x40e30400,0x34005011,0x7c40300,0x20e30000,0x3400509a,0x7c00300,0x80e30000,0x340050bf,0x7c00300,0x80230000, +0x34008076,0x7c00100,0x40230400,0x340080be,0x7c00100,0x82b30400,0x34010001,0x2802100,0x10962460,0x3401001f,0x2802c00,0x20962460,0x34010021,0x2802100,0x10962460,0x3401003a, +0x2806400,0x40962460,0x34010097,0x2802100,0x80962460,0x340100be,0x2802100,0x80962460,0x340100be,0x2802400,0x80962460,0x340100be,0x2806400,0x80962460,0x340100c0,0x2802100, +0x80962460,0x34015011,0x2802500,0x8962460,0x340150bf,0x2802200,0x80c62460,0x340180be,0x2806400,0x82f62460,0x38000000,0x4000000,0x5500000,0x38000000,0x4000000,0x14200000, +0x38000000,0x24000000,0x5410000,0x38000000,0x24000000,0x6410000,0x38000000,0x24000002,0x7000000,0x38000000,0x2c000010,0x4b48000,0x38000002,0x4000000,0x14200000,0x38000002, +0x7c00100,0x8230400,0x38000002,0x7c00100,0x10230400,0x38000002,0x7c00100,0x20230400,0x38000002,0x7c00500,0x10230400,0x38000002,0xc000010,0x4b48000,0x38000002,0x80000000, +0x5329960,0x3800000b,0x7c00100,0xfc230400,0x38000015,0x7c00100,0x20230400,0x38000019,0x7c00100,0x8220400,0x38000019,0x7c00100,0x8250400,0x38000019,0x7c00100,0x10220400, +0x38000019,0x7c00100,0x10230400,0x38000019,0x7c00100,0xc822040f,0x38000019,0x7c00500,0x20220400,0x38000019,0x7c00500,0xc822040f,0x38000019,0x7c00d00,0xc823040f,0x38000024, +0x7c00100,0x20230400,0x38000028,0x7c00100,0x40230400,0x3800002a,0x7c00100,0x80230400,0x38000038,0x7c00100,0x80220400,0x38000038,0x7c00100,0x80250400,0x3800003e,0xc000010, +0x44448000,0x38000041,0x7c00100,0x82b30400,0x38000099,0x4000000,0x84200000,0x380000a1,0x7c00100,0x81830000,0x380000c1,0x4000000,0x84200000,0x380000c1,0x7c00100,0x80230400, +0x380000c2,0x7c00100,0x80230400,0x380000c2,0xc000010,0x84248000,0x380000c3,0x6800000,0x81329800,0x380000c3,0x7c00100,0x80230400,0x380000c4,0x7c00100,0x80230400,0x380000c5, +0x7c00100,0x80220400,0x380000c5,0x7c00100,0x80250400,0x38005000,0x4000000,0x4e00000,0x38005000,0x4000000,0x6800000,0x38005011,0x7c40300,0x20e30000,0x38005014,0x7c00100, +0x8e30000,0x38005016,0x7c00100,0x8e30c00,0x38005016,0x7c00500,0x20230c00,0x3800803e,0x7c00100,0x42b30400,0x38010001,0x2802100,0x20962460,0x38010001,0x2802400,0x10962460, +0x38010001,0x2802400,0x20962460,0x38010002,0x2802400,0x10962460,0x3801001b,0x12882000,0xc4962460,0x38010024,0x2802400,0x20962460,0x3801002a,0x2806400,0x80962460,0x38010041, +0x2802100,0x80962460,0x38010041,0x2806400,0x80962460,0x38010078,0x2802100,0x80962460,0x380100c2,0x2802400,0x80962460,0x380100c4,0x2802400,0x80962460,0x38010880,0x2802400, +0x50962460,0x3c000000,0x4000000,0x4200000,0x3c000000,0x4000000,0x4e00000,0x3c000008,0x7c00500,0xc822040e,0x3c000008,0x7c00500,0xc822040f,0x3c00000a,0x4000000,0x4500000, +0x3c000015,0x6800100,0x20962540,0x3c000019,0x7c00100,0x10220400,0x3c000047,0,0x84818820,0x3c000047,0,0x84c18820,0x3c000047,0,0x85418820,0x3c000047, +0x7c00100,0x80230400,0x3c000047,0x7c00100,0x81430400,0x3c00009d,0x7c00100,0x80230400,0x3c0000c6,0x4000000,0x84e00000,0x3c0000c6,0x6800000,0x82d29800,0x3c0000c6,0x6800100, +0x80962540,0x3c0000c6,0x7c00100,0x82c30560,0x3c0000c6,0xc000010,0x84448000,0x3c0000c7,0x6800000,0x81329800,0x3c0000c7,0x7c00100,0x80230400,0x3c005000,0x4000000,0x4e00000, +0x3c005000,0x4000000,0x6800000,0x3c005011,0x7c40300,0x20e30000,0x3c005014,0x7c00100,0xa530000,0x3c005016,0x7c00100,0xa530c00,0x3c0080c6,0x7c00100,0x82b30400,0x3c010002, +0x2802400,0x10962460,0x3c010008,0x2802100,0x8962460,0x3c010018,0x2802000,0x21862460,0x3c010047,0x2802000,0x80962460,0x3c010047,0x2802400,0x80962460,0x3c01009d,0x2802100, +0x80962460,0x3c0100c6,0x2802100,0x80962460,0x3c0100c6,0x2806400,0x80962460,0x3c0100c7,0x2802000,0x80962460,0x3c0180c6,0x2806400,0x82f62460,0x3d005011,0x7c40300,0x20e30000, +0x3d0055a8,0x4000000,0x4e00000,0x3d0055a8,0x4008000,0x4e00000,0x40000000,0x4000000,0x4200000,0x40000000,0x4000000,0xc8200005,0x40000000,0x6800000,0xc9329805,0x40000000, +0x24000000,0x4200000,0x40000002,0x7c00100,0x20230400,0x40000008,0x7c00100,0x20220400,0x40000008,0x7c00100,0x20250400,0x40000019,0x7c00100,0x20220400,0x40000019,0x7c00100, +0x20250400,0x4000001c,0x6800000,0x21329800,0x4000003e,0xc000010,0x44448000,0x40000047,0x7c00100,0x80230400,0x400000c9,0x4000002,0x87000000,0x400000c9,0x4000020,0x84200000, +0x400000c9,0x6800000,0x81329800,0x400000c9,0x7c00100,0x80220400,0x400000c9,0x7c00100,0x80230400,0x400000c9,0x7c00100,0x80250400,0x400000c9,0x7c00900,0x80230400,0x400000c9, +0x7c00d00,0x80230400,0x400000ca,0x6800000,0x82d29800,0x400000ca,0x6800100,0x80962540,0x400000ca,0x7c00100,0x82d30400,0x400000cb,0x4000000,0x84200000,0x400000cb,0x6800000, +0x81329800,0x400000cb,0x7c00100,0x80230400,0x400000cb,0x7c00100,0x80230520,0x400000cb,0x7c00100,0x80230521,0x400000cb,0x7c00500,0x80230400,0x400000cb,0xc000010,0x84448000, +0x400000cc,0x4000000,0x84200000,0x400000cc,0x6800000,0x81329800,0x400000cc,0x7c00100,0x80230400,0x400000cd,0x4000000,0x84200000,0x400000cd,0x6800000,0x81329800,0x400000cd, +0x7c00100,0x80230400,0x400000ce,0x7c00100,0x80230400,0x400000ce,0x7c00100,0x80230401,0x400000cf,0x4000000,0x84e00000,0x400000cf,0x6800100,0x80962540,0x400000cf,0x7c00100, +0x80e30400,0x400000cf,0x7c00100,0x82c30560,0x400000cf,0x7c00d00,0x80e30400,0x400000cf,0xc000010,0x84e48000,0x40005000,0x4000000,0x4e00000,0x400050bf,0x7c00300,0x80230000, +0x400055c4,0x4000000,0x4e00000,0x400080cf,0x7c00100,0x82b30400,0x400080cf,0x7c00100,0x82d30400,0x400080cf,0x7c00100,0x82d30401,0x40010002,0x2802100,0x10962460,0x40010002, +0x2802100,0x20962460,0x400100c6,0x2802400,0x80962460,0x400100c9,0x2802400,0x80962460,0x400100c9,0x2802500,0x80962460,0x400100c9,0x2802c00,0x80962460,0x400100ca,0x2802100, +0x80962460,0x400100ca,0x2802100,0x80962461,0x400100ca,0x2806400,0x80962460,0x400100cc,0x2802400,0x80962460,0x400100cc,0x2802c00,0x80962460,0x400100cf,0x2802100,0x80962460, +0x400100cf,0x2802100,0x80962461,0x400100cf,0x2802400,0x80962460,0x400100cf,0x2802c00,0x80962460,0x400100cf,0x2806400,0x80962460,0x400180cf,0x2806400,0x82f62460,0x44000000, +0x4000000,0x4200000,0x44000000,0x4000000,0x5600000,0x44000000,0x4000020,0x4200000,0x44000000,0x24000000,0x4200000,0x44000002,0x4000000,0x4200000,0x44000002,0x4000000, +0x4400000,0x44000002,0x4000000,0x14200000,0x44000002,0x7c00100,0x10230400,0x44000002,0x7c00100,0x20230400,0x44000002,0x7c00100,0xfc230400,0x44000015,0x7c00100,0x8230400, +0x44000019,0x7c00100,0x8250400,0x44000019,0x7c00100,0x20220400,0x44000019,0x7c00100,0x20250400,0x44000019,0x7c00500,0xc822040f,0x44000024,0x7c00100,0x8230400,0x44000097, +0x6800100,0x80962540,0x440000d0,0x7c00100,0x80220400,0x440000d0,0x7c00100,0x80250400,0x440000d1,0x7c00100,0x80230400,0x440000d2,0x7c00100,0x80230400,0x440000d3,0x6800000, +0x81329800,0x440000d3,0x7c00100,0x80230400,0x440000d3,0x7c00d00,0x80230400,0x44005000,0x4000000,0x4e00000,0x44005011,0x7c00300,0x10e30000,0x44005011,0x7c00b00,0x11230000, +0x44005011,0x7c40300,0x20e30000,0x4400509a,0x7c00300,0x80e30000,0x44010001,0x2802400,0x10962460,0x44010001,0x2802400,0x10c62460,0x44010002,0x2802100,0x10962460,0x44010002, +0x2802500,0x8962460,0x44010097,0x2802100,0x80962460,0x440100d2,0x2802100,0x80962460,0x48000000,0x4000000,0x4200000,0x48000000,0x4000000,0x5600000,0x48000000,0x4000000, +0x14200000,0x48000000,0x4000020,0x4200000,0x48000000,0x7c00120,0xc8220405,0x48000000,0x7c00500,0x10530400,0x48000000,0x24000000,0x4810000,0x48000000,0x24000000,0x5410000, +0x48000000,0x2c000010,0x4b48000,0x48000002,0x4000000,0x14200000,0x48000002,0x7c00100,0x8230400,0x48000003,0x7c00500,0xc822040f,0x4800000e,0x7c00500,0xc822040f,0x48000019, +0x7c00100,0x8250400,0x48000019,0x7c00100,0x10220400,0x48000019,0x7c00100,0x10250400,0x48000019,0x7c00100,0x18220400,0x48000019,0x7c00100,0x18230400,0x48000019,0x7c00100, +0x18250400,0x48000019,0x7c00100,0x20220400,0x48000019,0x7c00100,0xc8220402,0x48000019,0x7c00100,0xc822040e,0x48000019,0x7c00100,0xc822040f,0x48000019,0x7c00500,0xc822040f, +0x48000065,0x7c00100,0x80230400,0x480000d5,0x7c00100,0x80230400,0x48000e39,0x7c00100,0x80230400,0x48005000,0x4000000,0x4e00000,0x48005000,0x4000000,0x6800000,0x48005011, +0x7c40300,0x20e30000,0x48005014,0x7c00100,0xc8e30010,0x48005016,0x7c00100,0x8e30c00,0x48005016,0x7c00100,0x12530c00,0x48005016,0x7c00100,0xc8e30c10,0x48005094,0x7c00300, +0x80e30000,0x4800509a,0x7c00300,0x80e30000,0x480050bf,0x7c00300,0x80230000,0x480050d6,0x7c00300,0x80e30000,0x48008004,0x7c00100,0x10230400,0x4800800a,0x7c00100,0xfc230400, +0x48010000,0x2802000,0x10962460,0x48010000,0x2802400,0x10962460,0x48010001,0x2802000,0x10962460,0x48010001,0x2802400,0x10962460,0x48010002,0x2802100,0x10962460,0x48010002, +0x2802400,0x8962460,0x48010002,0x2802400,0x10962460,0x48010002,0x2802500,0x10962460,0x48010004,0x2802100,0x8962460,0x48010013,0x2802500,0x10962460,0x4801001f,0x2802400, +0x20962460,0x4801001f,0x2802c00,0x20962460}; -static const int32_t countPropsVectors=6813; +static const int32_t countPropsVectors=6996; static const int32_t propsVectorsColumns=3; -static const uint16_t scriptExtensions[562]={ +static const uint16_t scriptExtensions[572]={ 7,0xc,0xd,0xe,0x11,0x19,0x33,0x38,0x59,0x68,0x6c,0x75,0x87,0x88,0xa0,0x80b3, 4,8,0xa,0x19,0x26,0x83,0x80c4,5,0x8019,0x19,0x8083,0x19,0x8026,6,7,8, 0xe,0x19,0x34,0x59,0x80cd,6,8,0xe,0x19,0x34,0xab,0xcd,0x80ce,6,8,0x19, @@ -4699,31 +4797,31 @@ static const uint16_t scriptExtensions[562]={ 0x21,0x23,0x24,0x3a,0x89,0x91,0x99,0x9e,0xa0,0xaf,0xb2,0xb3,0xbb,0x80cc,4,0xa, 0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a,0x89,0x91,0x99,0x9e,0xa0,0xaf, 0xb2,0xb3,0xbb,0xca,0x80cc,0xa,0x78,0xa0,0x80b2,0xa,0x115,4,0x3a,0x8076,4,0x11b, -0x10,0x80a4,0x10,0x120,0xf,0x809d,0xf,0x124,0x23,0x8089,0x23,0x128,0x15,0xbb,0x80cf,0x15, -0x12c,0x1c,0x34,0x8076,0x1c,0x131,0xc,0x19,0x8038,0x8020,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a, -0x800a,4,0xa,0x15,0x8089,4,0xa,0x24,0x9e,0x80aa,4,0xa,0x8024,0xa,0x97,0x80aa, -4,0xa,0x24,0x80aa,0xa,0x8097,0xa,0x15,0x1a,0x1f,0x23,0x8024,4,0x800a,0xa,0x9e, -0x80aa,0xa,0xaa,0x80bb,4,0xa,0x8097,0xa,0x80aa,4,0xa,0x97,0x80aa,4,0xa,0x15, -0x1a,0x1f,0x21,0x24,0x89,0x9e,0xbb,0x80cf,0xa,0x8089,0xa,0x15,0x89,0x80cf,0x8004,8, -0x19,0x8022,0x19,0x1b,0x805a,2,0x80a7,0xc,0x38,0x4c,0x58,0x68,0x806b,0xe,0x4c,0x56, -0x8068,0xa,0x19,0x8089,7,0x8019,0x58,0x8075,0xc,0x4c,0x68,0x6c,0x75,0x78,0x807e,2, -0x4c,0x80a7,0x11,0x809a,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12,0x14,0x16,0x1b, -0x8029,5,0x11,0x12,0x14,0x16,0x1b,0x29,0x805a,5,0x11,0x12,0x14,0x8016,0x8011,5, -0x11,0x12,0x14,0x16,0x1b,0x27,0x8029,5,0x11,0x12,0x14,0x16,0x1b,0x27,0x29,0x8083, -5,0x8011,0x11,0x14,0x8016,0x11,0x8019,0xa,0xf,0x10,0x15,0x1a,0x78,0x91,0x97,0x99, -0x9d,0x9e,0xa0,0xa3,0xb2,0xbb,0x80cf,0xa,0xf,0x10,0x15,0x78,0x91,0x97,0x99,0x9d, -0x9e,0xa0,0xa3,0xb2,0xbb,0x80cf,0xa,0xf,0x10,0x78,0x91,0x99,0x9d,0x9e,0xa0,0xa3, -0x80b2,0xa,0xf,0x10,0x78,0x91,0x97,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,4,0xa,0x80cf, -0xa,0x20d,0xa,0x8023,0xa,0x212,0x19,0x1c,0x804f,0x37,0x804e,2,0x8057,2,0x8025,2, -0x21d,0x2f,0x31,0x8053,0x2f,0x31,0x80c1,0x2f,0x8031,2,0x8007,0x79,0x80c2,0x79,0x22b,0x89, -0x128,0}; +0x10,0x80a4,0x10,0x120,0xf,0x809d,0xf,0x124,0x15,0x1a,0x23,0x8024,0x23,0x128,0x23,0x8089, +0x23,0x12e,0x15,0xbb,0x80cf,0x15,0x132,0x1c,0x34,0x8076,0x1c,0x137,0xc,0x19,0x8038,0x8020, +0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,4,0xa,0x15,0x8089,4,0xa,0x24,0x9e,0x80aa, +4,0xa,0x8024,0xa,0x97,0x80aa,4,0xa,0x24,0x80aa,0xa,0x8097,0xa,0x15,0x1a,0x1f, +0x23,0x8024,4,0x800a,0xa,0x9e,0x80aa,0xa,0xaa,0x80bb,4,0xa,0x8097,0xa,0x80aa,4, +0xa,0x97,0x80aa,4,0xa,0x15,0x1a,0x1f,0x21,0x24,0x89,0x9e,0xbb,0x80cf,0xa,0x8089, +0xa,0x15,0x89,0x80cf,0x8004,8,0x19,0x8022,0x19,0x1b,0x805a,2,0x80a7,0xc,0x38,0x4c, +0x58,0x68,0x806b,0xe,0x4c,0x56,0x8068,0xa,0x19,0x8089,7,0x8019,0x58,0x8075,0xc,0x4c, +0x68,0x6c,0x75,0x78,0x807e,2,0x4c,0x80a7,0x11,0x809a,5,0x11,0x12,0x14,0x16,0x8029, +5,0x11,0x12,0x14,0x16,0x1b,0x8029,5,0x11,0x12,0x14,0x16,0x1b,0x29,0x805a,5, +0x11,0x12,0x14,0x8016,0x8011,5,0x11,0x12,0x14,0x16,0x1b,0x27,0x8029,5,0x11,0x12, +0x14,0x16,0x1b,0x27,0x29,0x8083,5,0x8011,0x11,0x14,0x8016,0x11,0x8019,0xa,0xf,0x10, +0x15,0x1a,0x78,0x91,0x97,0x99,0x9d,0x9e,0xa0,0xa3,0xb2,0xbb,0x80cf,0xa,0xf,0x10, +0x15,0x78,0x91,0x97,0x99,0x9d,0x9e,0xa0,0xa3,0xb2,0xbb,0x80cf,0xa,0xf,0x10,0x78, +0x91,0x99,0x9d,0x9e,0xa0,0xa3,0x80b2,0xa,0xf,0x10,0x78,0x91,0x97,0x99,0x9d,0x9e, +0xa0,0xa3,0x80b2,4,0xa,0x80cf,0xa,0x213,0xa,0x8023,0xa,0x218,0x19,0x1c,0x804f,0x37, +0x804e,2,0x8057,2,0x8025,2,0x223,0x2f,0x31,0x8053,0x2f,0x31,0x80c1,0x2f,0x8031,2, +0x8007,0x79,0x80c2,0x79,0x231,0x89,0x12e,0x65,0x80d5,0x65,0x237,0}; -static const uint16_t block_trieIndex[834]={ +static const uint16_t block_trieIndex[873]={ 0,0x40,0x80,0xc0,0x100,0x140,0x180,0x1c0,0x200,0x240,0x280,0x2c0,0x300,0x340,0x340,0x340, 0x340,0x340,0x340,0x364,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384, 0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x384,0x3c4,0x3fb,0x43b,0x47b,0x47b,0x47b,0x47b,0x47b, 0x47b,0x47b,0x47b,0x47b,0x47b,0x480,0x4c0,0x500,0x540,0x540,0x540,0x540,0x540,0x540,0x570,0x5a5, -0x2f0,0x30a,0x30a,0x31a,0x33a,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xa0, +0x311,0x331,0x331,0x341,0x361,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xa0, 0xb0,0xc0,0xd0,0xe0,0xf0,0x100,0x110,0x120,0x130,0x140,0x150,0x160,0x170,0x180,0x190,0x1a0, 0x1b0,0x1c0,0x1d0,0x1e0,0x1f0,0x200,0x210,0x220,0x230,0x240,0x250,0x260,0x270,0x280,0x290,0x2a0, 0x2b0,0x2c0,0x2d0,0x2e0,0x2f0,0x300,0x310,0x320,0x330,0x340,0x350,0x360,0x370,0x340,0x350,0x360, @@ -4736,45 +4834,47 @@ static const uint16_t block_trieIndex[834]={ 0x570,0x540,0x550,0x560,0x570,0x540,0x550,0x560,0x570,0x540,0x550,0x560,0x570,0x570,0x580,0x590, 0x5a0,0x5a5,0x5b5,0x5c5,0x5d5,0x5e5,0x5f5,0x605,0x615,0x625,0x635,0x645,0x64d,0x65d,0x66d,0x67d, 0x68d,0x69d,0x6ad,0x6b7,0x6c7,0x6d7,0x6e7,0x6f7,0x707,0x717,0x725,0x735,0x745,0x755,0x765,0x775, -0x785,0x795,0x7a5,0x7b4,0x7c4,0x7d4,0x7d4,0x7d4,0x7d4,0x7e4,0x7ef,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, -0x7f4,0x7f4,0x7f4,0x7f4,0x7fb,0x80b,0x80b,0x80b,0x80b,0x818,0x81e,0x81e,0x81e,0x81e,0x81e,0x81e, -0x81e,0x81e,0x81e,0x81e,0x81e,0x82e,0x82e,0x836,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, -0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, -0x7f4,0x846,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x856,0x856,0x862,0x872,0x7f4,0x87e,0x88a,0x89a, -0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa,0x8aa, -0x8ba,0x8ba,0x8ba,0x8ca,0x8ca,0x8da,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, -0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x8ea,0x8fa,0x90a,0x911,0x7f4,0x7f4,0x7f4,0x7f4, -0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x921,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, -0x7f4,0x7f4,0x931,0x931,0x935,0x945,0x955,0x965,0x975,0x985,0x995,0x995,0x995,0x995,0x9a5,0x9a5, -0x9aa,0x7f4,0x7f4,0x7f4,0x7f4,0x9ba,0x9ca,0x9da,0x9e1,0x7f4,0x9f1,0xa01,0xa11,0xa21,0xa31,0xa41, -0x7f4,0x7f4,0xa4a,0xa5a,0xa6a,0x7f4,0xa7a,0xa8a,0xa9a,0xaaa,0xaaa,0xaaa,0xaba,0xaca,0xada,0xaea, -0xafa,0xb0a,0x7f4,0x7f4,0x7f4,0x7f4,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a, -0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a, -0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1a,0xb1c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c, -0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb2c,0xb38,0xb46,0xb48,0xb48,0xb48,0xb48,0xb48,0xb48,0xb48, -0xb48,0xb48,0xb48,0xb48,0xb48,0xb48,0xb48,0xb4d,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58, -0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb58,0xb59,0xb68,0xb68,0xb72,0x7f4,0x7f4,0x7f4, -0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0xb82,0xb82,0xb90,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, -0xba0,0xbab,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb0,0xbb5,0xbc0, -0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc0,0xbc8, -0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, -0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, -0xbd8,0xbe8,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, -0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4,0x7f4, -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, -0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08, -0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08, -0x45,0x65,0x79,0x89,0x89,0xa9,0xb5,0xd5,0xf5,0x115,0x131,0x150,0x168,0x179,0x196,0x1b6, -0x1d6,0x1d6,0x1d6,0x1d6,0x1d6,0x1f0,0x209,0x21e,0x23e,0x25b,0x270,0x270,0x270,0x270,0x270,0x270, -0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, -0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x290,0x270,0x270,0x270,0x270,0x270, -0x270,0x270,0x2b0,0x2b0,0x2b0,0x2b0,0x2b0,0x2b0,0x2b0,0x2b0,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0,0x2d0, -0x2d0,0x2d0 +0x785,0x795,0x7a5,0x7b5,0x7c5,0x7d5,0x7d5,0x7d5,0x7d5,0x7e5,0x7f0,0x7f7,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x807,0x817,0x817,0x817,0x817,0x824,0x82a,0x82a,0x82a,0x82a,0x82a,0x82a, +0x82a,0x82a,0x82a,0x82a,0x82a,0x83a,0x83a,0x842,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x852,0x800,0x800,0x800,0x800,0x800,0x800,0x862,0x862,0x86e,0x87e,0x800,0x88a,0x896,0x8a6, +0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6,0x8b6, +0x8c6,0x8c6,0x8c6,0x8d6,0x8d6,0x8e6,0x8f6,0x8f6,0x8f6,0x8fc,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x90a,0x91a,0x92a,0x931,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x941,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x951,0x951,0x955,0x965,0x975,0x985,0x995,0x9a5,0x9b5,0x9b5,0x9b5,0x9b5,0x9c5, +0x9c5,0x9ca,0x9da,0x800,0x800,0x800,0x9ea,0x9fa,0xa0a,0xa11,0x800,0xa21,0xa31,0xa41,0xa51,0xa61, +0xa71,0x800,0x800,0xa7a,0xa8a,0xa9a,0x800,0xaaa,0xaba,0xaca,0xada,0xada,0xada,0xaea,0xafa,0xb0a, +0xb1a,0xb2a,0xb3a,0x800,0x800,0x800,0x800,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a, +0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a, +0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4a,0xb4c,0xb5c,0xb5c,0xb5c,0xb5c,0xb5c,0xb5c,0xb5c,0xb5c, +0xb5c,0xb5c,0xb5c,0xb5c,0xb5c,0xb5c,0xb5c,0xb5c,0xb68,0xb76,0xb78,0xb78,0xb78,0xb78,0xb78,0xb78, +0xb78,0xb78,0xb78,0xb78,0xb78,0xb78,0xb78,0xb78,0xb7d,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88, +0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb89,0xb98,0xb98,0xba2,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0xbb2,0xbb2,0xbc0,0x800,0x800,0x800,0x800,0x800,0xbd0, +0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0,0xbd0, +0xbd0,0xbd0,0xbdb,0xbe0,0xbe0,0xbe0,0xbe0,0xbe0,0xbe0,0xbe0,0xbe0,0xbe0,0xbe0,0xbe0,0xbe0,0xbe5, +0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0,0xbf0, +0xbf8,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08, +0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc08,0xc14,0x800,0x800, +0x800,0xc24,0xc34,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800,0x800, +0x800,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44, +0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44,0xc44, +0xc44,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, +0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, +0xc54,0x45,0x65,0x79,0x89,0x89,0xa9,0xb5,0xd5,0xf5,0x115,0x131,0x150,0x168,0x17a,0x197, +0x1b7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1f1,0x20a,0x21f,0x23f,0x25c,0x271,0x271,0x271,0x271,0x281, +0x291,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271, +0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x271, +0x271,0x2b1,0x271,0x271,0x271,0x271,0x271,0x271,0x271,0x2d1,0x2d1,0x2d1,0x2d1,0x2d1,0x2d1,0x2d1, +0x2d1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1,0x2f1 }; -static const uint16_t block_trieData[3098]={ +static const uint16_t block_trieData[3175]={ 1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4, 4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6, @@ -4898,26 +4998,28 @@ static const uint16_t block_trieData[3098]={ 0x13e,0xf5,0xf5,0xf5,0xf5,0x144,0x144,0x144,0x144,0x144,0x144,0x156,0x156,0,0,0, 0,0x14f,0x14f,0x14f,0x14f,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x10c,0x10c,0x10c,0x10c, 0x10c,0,0,0,0,0x114,0x114,0x114,0x114,0x114,0x114,0x11c,0x11c,0x11c,0x11c,0x11c, -0x15a,0x15a,0x15a,0x15a,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x11f,0x11f,0x146,0x146,0x146,0x146,0x146,0x146,0,0,0,0,0,0x131, -0x12b,0x12b,0x12b,0x12b,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98, -0x98,0x98,0x98,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x101,0x101,0x101,0x101, -0x101,0x101,0x101,0x101,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x136,0x136,0x136,0x136,0x136,0x136,0x136,0xc2,0xc2,0xc2,0xc2,0xc2, -0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0x124,0x124,0x124,0x149,0x149, -0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0xfe,0xfe, -0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0,0, -0,0,0,0,0,0,0x14b,0x14b,0x14b,0x14b,0,0,0,0,0,0, -0,0,0,0,0,0,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca, -0xca,0xca,0xca,0xca,0xca,0xca,0xed,0xed,0xed,0x13c,0x13c,0x13c,0x13c,0x13c,0x13c,0xdd, -0xdd,0xdd,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0,0,0,0,0, -0,0,0x14c,0x14c,0x14c,0x14c,0,0,0,0,0,0,0,0,0x121,0x121, -0x121,0x121,0x121,0x121,0x153,0x153,0x153,0x153,0,0,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, -0xd8,0xd8,0xd8,0xd8,0,0,0,0,0x10b,0x10b,0x110,0x110,0x110,0x110,0x110,0x110, -0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x111,0x111,0x111,0x111,0x111,0x111, -0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x130,0x130,0x130,0x130,0x130,0x130, -0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x133,0x133,0x133,0x133,0x133,0x133, -0x133,0x133,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0,0,0,0,0,0, +0x15a,0x15a,0x15a,0x15a,0x15c,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x11f,0x11f,0x146,0x146,0x146,0x146,0x146,0x146,0,0,0,0,0, +0x131,0x12b,0x12b,0x12b,0x12b,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x98, +0x98,0x98,0x98,0x98,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x101,0x101,0x101, +0x101,0x101,0x101,0x101,0x101,0x15b,0x15b,0x15b,0x15b,0x15b,0x15b,0x15b,0x15b,0x15b,0x15b,0x15b, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x136,0x136,0x136,0x136,0x136,0x136,0x136,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2, +0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0xc2,0x124,0x124,0x124,0x149,0x149,0x149,0x149,0x149,0x149, +0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0x149,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0,0,0,0,0,0, +0,0,0x14b,0x14b,0x14b,0x14b,0,0,0,0,0,0,0,0,0,0, +0,0,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca,0xca, +0xca,0xca,0xed,0xed,0xed,0x13c,0x13c,0x13c,0x13c,0x13c,0x13c,0xdd,0xdd,0xdd,0xf3,0xf3, +0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0,0,0,0,0,0,0,0x14c,0x14c, +0x14c,0x14c,0,0,0,0,0,0,0,0,0x121,0x121,0x121,0x121,0x121,0x121, +0x153,0x153,0x153,0x153,0,0,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, +0,0,0,0,0x10b,0x10b,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110, +0x110,0x110,0x110,0x110,0x110,0x110,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111, +0x111,0x111,0x111,0x111,0x111,0x111,0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x130,0x130, +0x130,0x130,0x130,0x130,0x130,0x130,0x133,0x133,0x133,0x133,0x133,0x133,0x133,0x133,0x159,0x159, +0x159,0x159,0x159,0x159,0x159,0x159,0x15d,0x15d,0x15d,0x15d,0x15d,0x15d,0x15d,0x15d,0x15d,0x15d, +0x15d,0x15d,0x15d,0x15d,0x15d,0x15d,0x15e,0x15e,0x15e,0x15e,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0x138,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb, 0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0x113,0x113,0x113,0x129,0x129,0x129, 0x129,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115,0x115, @@ -4926,11 +5028,12 @@ static const uint16_t block_trieData[3098]={ 0x150,0x155,0x155,0x155,0x155,0x140,0x140,0x140,0x140,0x140,0x140,0x140,0x140,0x140,0x140,0x140, 0x140,0x140,0,0,0,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b, 0x5b,0x5b,0x5b,0x5b,0x5b,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c, -0x5c,0x5c,0x5c,0x5c,0x5c,0x7e,0x7e,0x7e,0x7e,0x7e,0,0,0,0,0,0, +0x5c,0x5c,0x5c,0x5c,0x5c,0x7e,0x7e,0x7e,0x7e,0x7e,0x160,0x160,0x160,0x160,0,0, 0,0x145,0x145,0x120,0x120,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x9a,0x9a,0,0,0, 0,0,0,0,0,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, 0x5d,0x5d,0x5d,0x5d,0x5d,0x106,0x106,0x106,0x106,0x106,0x106,0x106,0x106,0x106,0x106,0x106, -0x106,0x106,0x106,0x106,0x106,0,0,0,0,0,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a, +0x106,0x106,0x106,0x106,0x106,0,0,0,0,0,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f, +0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a, 0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x13a,0x10a,0x10a,0x10a,0x143,0x143,0x143, 0x143,0x143,0x143,0,0,0,0,0,0,0,0x127,0x127,0x127,0x127,0x127,0, 0,0,0,0,0,0,0,0,0,0,0x13d,0x13d,0x13d,0x12c,0x12c,0x12c, @@ -4964,24 +5067,26 @@ static const uint16_t block_trieData[3098]={ 0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e,0x12e, 0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142,0x142, 0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154,0x154, -0,0,0,0,0,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, -0,0,0,0,0,0,0,0,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d, -0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d, -0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, -0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0,0 +0,0,0,0,0,0,0,0,0x161,0x161,0x161,0x161,0x161,0x161,0x161,0x161, +0x161,0x161,0x161,0x161,0x161,0x161,0x161,0x161,0,0,0,0,0,0,0,0, +0,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0,0,0,0, +0,0,0,0,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d, +0x7d,0x7d,0x7d,0,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d,0x6d, +0x6d,0x6d,0x6d,0x6d,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0,0,0 }; static const UCPTrie block_trie={ block_trieIndex, { block_trieData }, - 834, 3098, + 873, 3175, 0x11000, 0x11, 1, 0, 0, 0, - 0x270, 0x7f4, + 0x271, 0x800, 0x0, }; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2f2a,0x2f2a,0x2f2a,0x2f2a,0x836c,3,0x9e09,0x9f22,0xa6d4,0xa6d4,0x50d4,0x3075a31,0x15a,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x3068,0x3068,0x3068,0x3068,0x8618,3,0xa16c,0xa28a,0xaa76,0xaa76,0x1d0d6,0x3075a31,0x161,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/deps/icu-small/source/common/ucharstrie.cpp b/deps/icu-small/source/common/ucharstrie.cpp index 4c48323c9176..d0a4516319fb 100644 --- a/deps/icu-small/source/common/ucharstrie.cpp +++ b/deps/icu-small/source/common/ucharstrie.cpp @@ -282,9 +282,11 @@ UCharsTrie::next(ConstChar16Ptr ptr, int32_t sLength) { } } -const char16_t * -UCharsTrie::findUniqueValueFromBranch(const char16_t *pos, int32_t length, - UBool haveUniqueValue, int32_t &uniqueValue) { +const char16_t* +UCharsTrie::findUniqueValueFromBranch(const char16_t* pos U_LIFETIME_BOUND, + int32_t length, + UBool haveUniqueValue, + int32_t& uniqueValue) { while(length>kMaxBranchLinearSubNodeLength) { ++pos; // ignore the comparison unit if(nullptr==findUniqueValueFromBranch(jumpByDelta(pos), length>>1, haveUniqueValue, uniqueValue)) { diff --git a/deps/icu-small/source/common/ucharstriebuilder.cpp b/deps/icu-small/source/common/ucharstriebuilder.cpp index bf3216bd1bc0..dcdf9c3c99ca 100644 --- a/deps/icu-small/source/common/ucharstriebuilder.cpp +++ b/deps/icu-small/source/common/ucharstriebuilder.cpp @@ -39,7 +39,7 @@ class UCharsTrieElement : public UMemory { void setTo(const UnicodeString &s, int32_t val, UnicodeString &strings, UErrorCode &errorCode); - UnicodeString getString(const UnicodeString &strings) const { + UnicodeString getString(const UnicodeString& strings U_LIFETIME_BOUND) const { int32_t length=strings[stringOffset]; return strings.tempSubString(stringOffset+1, length); } @@ -94,8 +94,10 @@ UCharsTrieBuilder::~UCharsTrieBuilder() { uprv_free(uchars); } -UCharsTrieBuilder & -UCharsTrieBuilder::add(const UnicodeString &s, int32_t value, UErrorCode &errorCode) { +UCharsTrieBuilder& +UCharsTrieBuilder::add(const UnicodeString& s, + int32_t value, + UErrorCode& errorCode) U_LIFETIME_BOUND { if(U_FAILURE(errorCode)) { return *this; } @@ -158,9 +160,10 @@ UCharsTrieBuilder::build(UStringTrieBuildOption buildOption, UErrorCode &errorCo return newTrie; } -UnicodeString & -UCharsTrieBuilder::buildUnicodeString(UStringTrieBuildOption buildOption, UnicodeString &result, - UErrorCode &errorCode) { +UnicodeString& +UCharsTrieBuilder::buildUnicodeString(UStringTrieBuildOption buildOption, + UnicodeString& result U_LIFETIME_BOUND, + UErrorCode& errorCode) U_LIFETIME_BOUND { buildUChars(buildOption, errorCode); if(U_SUCCESS(errorCode)) { result.setTo(false, uchars+(ucharsCapacity-ucharsLength), ucharsLength); diff --git a/deps/icu-small/source/common/ucharstrieiterator.cpp b/deps/icu-small/source/common/ucharstrieiterator.cpp index 8a212b8b36da..8a400c7db8d2 100644 --- a/deps/icu-small/source/common/ucharstrieiterator.cpp +++ b/deps/icu-small/source/common/ucharstrieiterator.cpp @@ -21,7 +21,7 @@ U_NAMESPACE_BEGIN -UCharsTrie::Iterator::Iterator(ConstChar16Ptr trieUChars, int32_t maxStringLength, +UCharsTrie::Iterator::Iterator(ConstChar16Ptr trieUChars U_LIFETIME_BOUND, int32_t maxStringLength, UErrorCode &errorCode) : uchars_(trieUChars), pos_(uchars_), initialPos_(uchars_), @@ -78,8 +78,8 @@ UCharsTrie::Iterator::~Iterator() { delete stack_; } -UCharsTrie::Iterator & -UCharsTrie::Iterator::reset() { +UCharsTrie::Iterator& +UCharsTrie::Iterator::reset() U_LIFETIME_BOUND { pos_=initialPos_; remainingMatchLength_=initialRemainingMatchLength_; skipValue_=false; @@ -182,8 +182,10 @@ UCharsTrie::Iterator::next(UErrorCode &errorCode) { } // Branch node, needs to take the first outbound edge and push state for the rest. -const char16_t * -UCharsTrie::Iterator::branchNext(const char16_t *pos, int32_t length, UErrorCode &errorCode) { +const char16_t* +UCharsTrie::Iterator::branchNext(const char16_t* pos U_LIFETIME_BOUND, + int32_t length, + UErrorCode& errorCode) { while(length>kMaxBranchLinearSubNodeLength) { ++pos; // ignore the comparison unit // Push state for the greater-or-equal edge. diff --git a/deps/icu-small/source/common/uchriter.cpp b/deps/icu-small/source/common/uchriter.cpp index 903eb46c3b34..8e09b0a0cf12 100644 --- a/deps/icu-small/source/common/uchriter.cpp +++ b/deps/icu-small/source/common/uchriter.cpp @@ -25,14 +25,14 @@ UCharCharacterIterator::UCharCharacterIterator() // never default construct! } -UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, +UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr U_LIFETIME_BOUND, int32_t length) : CharacterIterator(textPtr != nullptr ? (length >= 0 ? length : u_strlen(textPtr)) : 0), text(textPtr) { } -UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, +UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr U_LIFETIME_BOUND, int32_t length, int32_t position) : CharacterIterator(textPtr != nullptr ? (length >= 0 ? length : u_strlen(textPtr)) : 0, position), @@ -40,7 +40,7 @@ UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, { } -UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, +UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr U_LIFETIME_BOUND, int32_t length, int32_t textBegin, int32_t textEnd, @@ -58,7 +58,7 @@ UCharCharacterIterator::UCharCharacterIterator(const UCharCharacterIterator& tha } UCharCharacterIterator& -UCharCharacterIterator::operator=(const UCharCharacterIterator& that) { +UCharCharacterIterator::operator=(const UCharCharacterIterator& that) U_LIFETIME_BOUND { CharacterIterator::operator=(that); text = that.text; return *this; diff --git a/deps/icu-small/source/common/ucnv.cpp b/deps/icu-small/source/common/ucnv.cpp index c7926d2ea717..d9a1edaf3305 100644 --- a/deps/icu-small/source/common/ucnv.cpp +++ b/deps/icu-small/source/common/ucnv.cpp @@ -155,7 +155,10 @@ and created from a converter that is shared across threads. */ U_CAPI UConverter* U_EXPORT2 -ucnv_safeClone(const UConverter* cnv, void *stackBuffer, int32_t *pBufferSize, UErrorCode *status) +ucnv_safeClone(const UConverter* cnv, + void* stackBuffer U_LIFETIME_BOUND, + int32_t* pBufferSize, + UErrorCode* status) { UConverter *localConverter, *allocatedConverter; int32_t stackBufferSize; @@ -660,9 +663,8 @@ ucnv_getMinCharSize (const UConverter * converter) return converter->sharedData->staticData->minBytesPerChar; } -U_CAPI const char* U_EXPORT2 -ucnv_getName (const UConverter * converter, UErrorCode * err) - +U_CAPI const char* U_EXPORT2 +ucnv_getName(const UConverter* converter U_LIFETIME_BOUND, UErrorCode* err) { if (U_FAILURE (*err)) return nullptr; @@ -877,6 +879,10 @@ _fromUnicodeWithCallback(UConverterFromUnicodeArgs *pArgs, UErrorCode *err) { * and failed to consume all of them. * We need to "replay" them from a temporary buffer and convert them first. */ + if (!pArgs->source) { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return; + } realSource=pArgs->source; realSourceLimit=pArgs->sourceLimit; realFlush=pArgs->flush; @@ -1322,6 +1328,10 @@ _toUnicodeWithCallback(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { * and failed to consume all of them. * We need to "replay" them from a temporary buffer and convert them first. */ + if (!pArgs->source) { + *err=U_ILLEGAL_ARGUMENT_ERROR; + return; + } realSource=pArgs->source; realSourceLimit=pArgs->sourceLimit; realFlush=pArgs->flush; diff --git a/deps/icu-small/source/common/ucnv_bld.cpp b/deps/icu-small/source/common/ucnv_bld.cpp index 1e768ae22411..3bbe686590d3 100644 --- a/deps/icu-small/source/common/ucnv_bld.cpp +++ b/deps/icu-small/source/common/ucnv_bld.cpp @@ -824,8 +824,10 @@ ucnv_loadSharedData(const char *converterName, return mySharedConverterData; } -U_CAPI UConverter * -ucnv_createConverter(UConverter *myUConverter, const char *converterName, UErrorCode * err) +U_CAPI UConverter* +ucnv_createConverter(UConverter* myUConverter U_LIFETIME_BOUND, + const char* converterName, + UErrorCode* err) { UConverterNamePieces stackPieces; UConverterLoadArgs stackArgs=UCNV_LOAD_ARGS_INITIALIZER; @@ -879,11 +881,12 @@ ucnv_canCreateConverter(const char *converterName, UErrorCode *err) { return U_SUCCESS(*err); } -UConverter * -ucnv_createAlgorithmicConverter(UConverter *myUConverter, +UConverter* +ucnv_createAlgorithmicConverter(UConverter* myUConverter U_LIFETIME_BOUND, UConverterType type, - const char *locale, uint32_t options, - UErrorCode *err) { + const char* locale, + uint32_t options, + UErrorCode* err) { UConverter *cnv; const UConverterSharedData *sharedData; UConverterLoadArgs stackArgs=UCNV_LOAD_ARGS_INITIALIZER; @@ -969,10 +972,10 @@ ucnv_createConverterFromPackage(const char *packageName, const char *converterNa U_CFUNC UConverter* -ucnv_createConverterFromSharedData(UConverter *myUConverter, - UConverterSharedData *mySharedConverterData, - UConverterLoadArgs *pArgs, - UErrorCode *err) +ucnv_createConverterFromSharedData(UConverter* myUConverter U_LIFETIME_BOUND, + UConverterSharedData* mySharedConverterData, + UConverterLoadArgs* pArgs, + UErrorCode* err) { UBool isCopyLocal; diff --git a/deps/icu-small/source/common/ucnv_imp.h b/deps/icu-small/source/common/ucnv_imp.h index cb939911e47e..4543c78f5201 100644 --- a/deps/icu-small/source/common/ucnv_imp.h +++ b/deps/icu-small/source/common/ucnv_imp.h @@ -58,8 +58,10 @@ ucnv_canCreateConverter(const char *converterName, UErrorCode *err); * @param err The error code * @return the newly created converter */ -U_CAPI UConverter * -ucnv_createConverter(UConverter *myUConverter, const char *converterName, UErrorCode * err); +U_CAPI UConverter* +ucnv_createConverter(UConverter* myUConverter U_LIFETIME_BOUND, + const char* converterName, + UErrorCode* err); /* * Open a purely algorithmic converter, specified by a type constant. @@ -72,11 +74,12 @@ ucnv_createConverter(UConverter *myUConverter, const char *converterName, UError * because this is an internal function * @internal */ -U_CFUNC UConverter * -ucnv_createAlgorithmicConverter(UConverter *myUConverter, +U_CFUNC UConverter* +ucnv_createAlgorithmicConverter(UConverter* myUConverter U_LIFETIME_BOUND, UConverterType type, - const char *locale, uint32_t options, - UErrorCode *err); + const char* locale, + uint32_t options, + UErrorCode* err); /* * Creates a converter from shared data. @@ -84,11 +87,11 @@ ucnv_createAlgorithmicConverter(UConverter *myUConverter, * unload mySharedConverterData, except via ucnv_close(return value) * if this function is successful. */ -U_CFUNC UConverter * -ucnv_createConverterFromSharedData(UConverter *myUConverter, - UConverterSharedData *mySharedConverterData, - UConverterLoadArgs *pArgs, - UErrorCode *err); +U_CFUNC UConverter* +ucnv_createConverterFromSharedData(UConverter* myUConverter U_LIFETIME_BOUND, + UConverterSharedData* mySharedConverterData, + UConverterLoadArgs* pArgs, + UErrorCode* err); U_CFUNC UConverter * ucnv_createConverterFromPackage(const char *packageName, const char *converterName, UErrorCode *err); diff --git a/deps/icu-small/source/common/ucnv_io.cpp b/deps/icu-small/source/common/ucnv_io.cpp index 46a26f821fd8..76046f0632ce 100644 --- a/deps/icu-small/source/common/ucnv_io.cpp +++ b/deps/icu-small/source/common/ucnv_io.cpp @@ -249,14 +249,15 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) { sectionSizes = static_cast(udata_getMemory(data)); int32_t dataLength = udata_getLength(data); // This is the length minus the UDataInfo size - if (dataLength <= int32_t(sizeof(sectionSizes[0]))) { + UBool isDataLengthKnown = dataLength >= 0; // Only false when using a pointer table of contents (not files nor a common data archive) + if (isDataLengthKnown && dataLength <= int32_t(sizeof(sectionSizes[0]))) { // We don't even have a TOC! goto invalidFormat; } table = reinterpret_cast(sectionSizes); tableStart = sectionSizes[0]; sizeOfTOC = int32_t((tableStart + 1) * sizeof(sectionSizes[0])); - if (tableStart < minTocLength || dataLength <= sizeOfTOC) { + if (tableStart < minTocLength || (isDataLengthKnown && dataLength <= sizeOfTOC)) { // We don't have a whole TOC! goto invalidFormat; } @@ -279,7 +280,7 @@ static void U_CALLCONV initAliasData(UErrorCode &errCode) { for (uint32_t section = 1; section <= tableStart; section++) { sizeOfData += sectionSizes[section] * sizeof(table[0]); } - if (dataLength < sizeOfData) { + if (isDataLengthKnown && dataLength < sizeOfData) { // Truncated file! goto invalidFormat; } @@ -406,8 +407,8 @@ static const uint8_t ebcdicTypes[128] = { /* @see ucnv_compareNames */ -U_CAPI char * U_CALLCONV -ucnv_io_stripASCIIForCompare(char *dst, const char *name) { +U_CAPI char* U_CALLCONV +ucnv_io_stripASCIIForCompare(char* dst U_LIFETIME_BOUND, const char* name) { char *dstItr = dst; uint8_t type, nextType; char c1; @@ -441,8 +442,8 @@ ucnv_io_stripASCIIForCompare(char *dst, const char *name) { return dst; } -U_CAPI char * U_CALLCONV -ucnv_io_stripEBCDICForCompare(char *dst, const char *name) { +U_CAPI char* U_CALLCONV +ucnv_io_stripEBCDICForCompare(char* dst U_LIFETIME_BOUND, const char* name) { char *dstItr = dst; uint8_t type, nextType; char c1; diff --git a/deps/icu-small/source/common/ucnv_io.h b/deps/icu-small/source/common/ucnv_io.h index 8f2d7b5a02bb..a88a30d10547 100644 --- a/deps/icu-small/source/common/ucnv_io.h +++ b/deps/icu-small/source/common/ucnv_io.h @@ -77,11 +77,11 @@ typedef struct UConverterAlias { # error U_CHARSET_FAMILY is not valid #endif -U_CAPI char * U_CALLCONV -ucnv_io_stripASCIIForCompare(char *dst, const char *name); +U_CAPI char* U_CALLCONV +ucnv_io_stripASCIIForCompare(char* dst U_LIFETIME_BOUND, const char* name); -U_CAPI char * U_CALLCONV -ucnv_io_stripEBCDICForCompare(char *dst, const char *name); +U_CAPI char* U_CALLCONV +ucnv_io_stripEBCDICForCompare(char* dst U_LIFETIME_BOUND, const char* name); /** * Map a converter alias name to a canonical converter name. diff --git a/deps/icu-small/source/common/ucnvsel.cpp b/deps/icu-small/source/common/ucnvsel.cpp index 01d9c7e0c210..124f9ab3c4b3 100644 --- a/deps/icu-small/source/common/ucnvsel.cpp +++ b/deps/icu-small/source/common/ucnvsel.cpp @@ -463,7 +463,9 @@ ucnvsel_swap(const UDataSwapper *ds, /* unserialize a selector */ U_CAPI UConverterSelector* U_EXPORT2 -ucnvsel_openFromSerialized(const void* buffer, int32_t length, UErrorCode* status) { +ucnvsel_openFromSerialized(const void* buffer U_LIFETIME_BOUND, + int32_t length, + UErrorCode* status) { // check if already failed if (U_FAILURE(*status)) { return nullptr; @@ -690,8 +692,10 @@ static int16_t countOnes(uint32_t* mask, int32_t len) { /* internal function! */ -static UEnumeration *selectForMask(const UConverterSelector* sel, - uint32_t *theMask, UErrorCode *status) { +static UEnumeration* +selectForMask(const UConverterSelector* sel U_LIFETIME_BOUND, + uint32_t* theMask, + UErrorCode* status) { LocalMemory mask(theMask); // this is the context we will use. Store a table of indices to which // encodings are legit. @@ -739,9 +743,11 @@ static UEnumeration *selectForMask(const UConverterSelector* sel, } /* check a string against the selector - UTF16 version */ -U_CAPI UEnumeration * U_EXPORT2 -ucnvsel_selectForString(const UConverterSelector* sel, - const char16_t *s, int32_t length, UErrorCode *status) { +U_CAPI UEnumeration* U_EXPORT2 +ucnvsel_selectForString(const UConverterSelector* sel U_LIFETIME_BOUND, + const char16_t* s, + int32_t length, + UErrorCode* status) { // check if already failed if (U_FAILURE(*status)) { return nullptr; @@ -781,9 +787,11 @@ ucnvsel_selectForString(const UConverterSelector* sel, } /* check a string against the selector - UTF8 version */ -U_CAPI UEnumeration * U_EXPORT2 -ucnvsel_selectForUTF8(const UConverterSelector* sel, - const char *s, int32_t length, UErrorCode *status) { +U_CAPI UEnumeration* U_EXPORT2 +ucnvsel_selectForUTF8(const UConverterSelector* sel U_LIFETIME_BOUND, + const char* s, + int32_t length, + UErrorCode* status) { // check if already failed if (U_FAILURE(*status)) { return nullptr; diff --git a/deps/icu-small/source/common/ucptrie.cpp b/deps/icu-small/source/common/ucptrie.cpp index 3e4b6a606e5e..0ff3dd537365 100644 --- a/deps/icu-small/source/common/ucptrie.cpp +++ b/deps/icu-small/source/common/ucptrie.cpp @@ -18,10 +18,13 @@ #include "uassert.h" #include "ucptrie_impl.h" -U_CAPI UCPTrie * U_EXPORT2 -ucptrie_openFromBinary(UCPTrieType type, UCPTrieValueWidth valueWidth, - const void *data, int32_t length, int32_t *pActualLength, - UErrorCode *pErrorCode) { +U_CAPI UCPTrie* U_EXPORT2 +ucptrie_openFromBinary(UCPTrieType type, + UCPTrieValueWidth valueWidth, + const void* data U_LIFETIME_BOUND, + int32_t length, + int32_t* pActualLength, + UErrorCode* pErrorCode) { if (U_FAILURE(*pErrorCode)) { return nullptr; } diff --git a/deps/icu-small/source/common/ucurr.cpp b/deps/icu-small/source/common/ucurr.cpp index cccf1130ae8e..3ab4d22c1499 100644 --- a/deps/icu-small/source/common/ucurr.cpp +++ b/deps/icu-small/source/common/ucurr.cpp @@ -521,7 +521,7 @@ ucurr_forLocale(const char* locale, return u_terminateUChars(buff, buffCapacity, resLen, ec); } - // get country or country_variant in `id' + // get country or country_variant in `id` CharString id = idForLocale(locale, ec); if (U_FAILURE(*ec)) { return 0; @@ -637,7 +637,7 @@ static UBool fallback(CharString& loc) { U_CAPI const char16_t* U_EXPORT2 -ucurr_getName(const char16_t* currency, +ucurr_getName(const char16_t* currency U_LIFETIME_BOUND, const char* locale, UCurrNameStyle nameStyle, UBool* isChoiceFormat, // fillin @@ -754,7 +754,7 @@ ucurr_getName(const char16_t* currency, } U_CAPI const char16_t* U_EXPORT2 -ucurr_getPluralName(const char16_t* currency, +ucurr_getPluralName(const char16_t* currency U_LIFETIME_BOUND, const char* locale, UBool* isChoiceFormat, const char* pluralCount, @@ -1434,6 +1434,12 @@ getCacheEntry(const char* locale, UErrorCode& ec) { CurrencyNameStruct* currencySymbols = nullptr; CurrencyNameCacheEntry* cacheEntry = nullptr; + // The cache key is stored in a fixed-size buffer. + if (uprv_strlen(locale) >= ULOC_FULLNAME_CAPACITY) { + ec = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + umtx_lock(&gCurrencyCacheMutex); // in order to handle racing correctly, // not putting 'search' in a separate function. @@ -2291,7 +2297,7 @@ ucurr_countCurrencies(const char* locale, // local variables UErrorCode localStatus = U_ZERO_ERROR; - // get country or country_variant in `id' + // get country or country_variant in `id` CharString id = idForLocale(locale, ec); if (U_FAILURE(*ec)) @@ -2395,7 +2401,7 @@ ucurr_forLocaleAndDate(const char* locale, // local variables UErrorCode localStatus = U_ZERO_ERROR; - // get country or country_variant in `id' + // get country or country_variant in `id` CharString id = idForLocale(locale, ec); if (U_FAILURE(*ec)) { diff --git a/deps/icu-small/source/common/udata.cpp b/deps/icu-small/source/common/udata.cpp index b9b737f177ed..03f76fa3a854 100644 --- a/deps/icu-small/source/common/udata.cpp +++ b/deps/icu-small/source/common/udata.cpp @@ -1270,7 +1270,7 @@ doOpenChoice(const char *path, const char *type, const char *name, #ifdef UDATA_DEBUG fprintf(stderr, " tocEntryName = %s\n", tocEntryName.data()); - fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.data()); + fprintf(stderr, " tocEntryPath = %s\n", tocEntryPath.data()); #endif #if !defined(ICU_DATA_DIR_WINDOWS) @@ -1291,7 +1291,7 @@ doOpenChoice(const char *path, const char *type, const char *name, dataPath = u_getDataDirectory(); /**** Time zone individual files override */ - if (isICUData && isTimeZoneFile(name, type)) { + if (isICUData && type != nullptr && isTimeZoneFile(name, type)) { const char *tzFilesDir = u_getTimeZoneFilesDirectory(pErrorCode); if (tzFilesDir[0] != 0) { #ifdef UDATA_DEBUG diff --git a/deps/icu-small/source/common/udatamem.cpp b/deps/icu-small/source/common/udatamem.cpp index 02be852320d4..6ea1b043fde7 100644 --- a/deps/icu-small/source/common/udatamem.cpp +++ b/deps/icu-small/source/common/udatamem.cpp @@ -54,9 +54,8 @@ U_CFUNC UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr) { return This; } - -U_CFUNC const DataHeader * -UDataMemory_normalizeDataPointer(const void *p) { +U_CFUNC const DataHeader* +UDataMemory_normalizeDataPointer(const void* p U_LIFETIME_BOUND) { /* allow the data to be optionally prepended with an alignment-forcing double value */ const DataHeader *pdh = (const DataHeader *)p; if(pdh==nullptr || (pdh->dataHeader.magic1==0xda && pdh->dataHeader.magic2==0x27)) { @@ -100,8 +99,8 @@ udata_close(UDataMemory *pData) { } } -U_CAPI const void * U_EXPORT2 -udata_getMemory(UDataMemory *pData) { +U_CAPI const void* U_EXPORT2 +udata_getMemory(UDataMemory* pData U_LIFETIME_BOUND) { if(pData!=nullptr && pData->pHeader!=nullptr) { return (char *)(pData->pHeader)+udata_getHeaderSize(pData->pHeader); } else { @@ -147,8 +146,8 @@ udata_getLength(const UDataMemory *pData) { * Used in cintltst/udatatst.c * @internal */ -U_CAPI const void * U_EXPORT2 -udata_getRawMemory(const UDataMemory *pData) { +U_CAPI const void* U_EXPORT2 +udata_getRawMemory(const UDataMemory* pData U_LIFETIME_BOUND) { if(pData!=nullptr && pData->pHeader!=nullptr) { return pData->pHeader; } else { diff --git a/deps/icu-small/source/common/udatamem.h b/deps/icu-small/source/common/udatamem.h index 3db2af43aad2..436c1fd1bc10 100644 --- a/deps/icu-small/source/common/udatamem.h +++ b/deps/icu-small/source/common/udatamem.h @@ -50,12 +50,12 @@ U_CFUNC void UDataMemory_init (UDataMemory *This); U_CFUNC UBool UDataMemory_isLoaded(const UDataMemory *This); U_CFUNC void UDataMemory_setData (UDataMemory *This, const void *dataAddr); -U_CFUNC const DataHeader *UDataMemory_normalizeDataPointer(const void *p); +U_CFUNC const DataHeader* UDataMemory_normalizeDataPointer(const void* p U_LIFETIME_BOUND); U_CAPI int32_t U_EXPORT2 udata_getLength(const UDataMemory *pData); -U_CAPI const void * U_EXPORT2 -udata_getRawMemory(const UDataMemory *pData); +U_CAPI const void* U_EXPORT2 +udata_getRawMemory(const UDataMemory* pData U_LIFETIME_BOUND); #endif diff --git a/deps/icu-small/source/common/uenum.cpp b/deps/icu-small/source/common/uenum.cpp index b4a5071ae7bc..2dc2bc0c4d40 100644 --- a/deps/icu-small/source/common/uenum.cpp +++ b/deps/icu-small/source/common/uenum.cpp @@ -31,7 +31,7 @@ static const int32_t PAD = 8; /* Return a pointer to the baseContext buffer, possibly allocating or reallocating it if at least 'capacity' bytes are not available. */ -static void* _getBuffer(UEnumeration* en, int32_t capacity) { +static void* _getBuffer(UEnumeration* en U_LIFETIME_BOUND, int32_t capacity) { if (en->baseContext != nullptr) { if (static_cast<_UEnumBuffer*>(en->baseContext)->len < capacity) { @@ -86,9 +86,9 @@ uenum_count(UEnumeration* en, UErrorCode* status) /* Don't call this directly. Only uenum_unext should be calling this. */ U_CAPI const char16_t* U_EXPORT2 -uenum_unextDefault(UEnumeration* en, - int32_t* resultLength, - UErrorCode* status) +uenum_unextDefault(UEnumeration* en U_LIFETIME_BOUND, + int32_t* resultLength, + UErrorCode* status) { char16_t *ustr = nullptr; int32_t len = 0; @@ -99,7 +99,8 @@ uenum_unextDefault(UEnumeration* en, if (ustr == nullptr) { *status = U_MEMORY_ALLOCATION_ERROR; } else { - u_charsToUChars(cstr, ustr, len+1); + u_charsToUChars(cstr, ustr, len); + ustr[len] = 0; } } } else { @@ -113,9 +114,9 @@ uenum_unextDefault(UEnumeration* en, /* Don't call this directly. Only uenum_next should be calling this. */ U_CAPI const char* U_EXPORT2 -uenum_nextDefault(UEnumeration* en, - int32_t* resultLength, - UErrorCode* status) +uenum_nextDefault(UEnumeration* en U_LIFETIME_BOUND, + int32_t* resultLength, + UErrorCode* status) { if (en->uNext != nullptr) { char *tempCharVal; @@ -129,7 +130,8 @@ uenum_nextDefault(UEnumeration* en, *status = U_MEMORY_ALLOCATION_ERROR; return nullptr; } - u_UCharsToChars(tempUCharVal, tempCharVal, *resultLength + 1); + u_UCharsToChars(tempUCharVal, tempCharVal, *resultLength); + tempCharVal[*resultLength] = 0; return tempCharVal; } else { *status = U_UNSUPPORTED_ERROR; @@ -138,7 +140,7 @@ uenum_nextDefault(UEnumeration* en, } U_CAPI const char16_t* U_EXPORT2 -uenum_unext(UEnumeration* en, +uenum_unext(UEnumeration* en U_LIFETIME_BOUND, int32_t* resultLength, UErrorCode* status) { @@ -154,9 +156,9 @@ uenum_unext(UEnumeration* en, } U_CAPI const char* U_EXPORT2 -uenum_next(UEnumeration* en, - int32_t* resultLength, - UErrorCode* status) +uenum_next(UEnumeration* en U_LIFETIME_BOUND, + int32_t* resultLength, + UErrorCode* status) { if (!en || U_FAILURE(*status)) { return nullptr; diff --git a/deps/icu-small/source/common/uenumimp.h b/deps/icu-small/source/common/uenumimp.h index 9c9df75ae049..5fe2e87cc9c6 100644 --- a/deps/icu-small/source/common/uenumimp.h +++ b/deps/icu-small/source/common/uenumimp.h @@ -137,9 +137,9 @@ U_CDECL_END * function. */ U_CAPI const UChar* U_EXPORT2 -uenum_unextDefault(UEnumeration* en, - int32_t* resultLength, - UErrorCode* status); +uenum_unextDefault(UEnumeration* en U_LIFETIME_BOUND, + int32_t* resultLength, + UErrorCode* status); /* This is the default implementation for uenum_next(). * It automatically converts the UChar * string to char *. @@ -148,8 +148,8 @@ uenum_unextDefault(UEnumeration* en, * function. */ U_CAPI const char* U_EXPORT2 -uenum_nextDefault(UEnumeration* en, - int32_t* resultLength, - UErrorCode* status); +uenum_nextDefault(UEnumeration* en U_LIFETIME_BOUND, + int32_t* resultLength, + UErrorCode* status); #endif diff --git a/deps/icu-small/source/common/uidna.cpp b/deps/icu-small/source/common/uidna.cpp index b47edefe1167..04c5c2e4cd7f 100644 --- a/deps/icu-small/source/common/uidna.cpp +++ b/deps/icu-small/source/common/uidna.cpp @@ -915,6 +915,7 @@ uidna_compare( const char16_t *s1, int32_t length1, if (U_FAILURE(bufferStatus)) { *status = bufferStatus; + goto CLEANUP; } // when toASCII is applied all label separators are replaced with FULL_STOP diff --git a/deps/icu-small/source/common/uloc.cpp b/deps/icu-small/source/common/uloc.cpp index 7467f1cb336f..4b853e5feefa 100644 --- a/deps/icu-small/source/common/uloc.cpp +++ b/deps/icu-small/source/common/uloc.cpp @@ -101,91 +101,55 @@ namespace { /* ISO639 table version is 20150505 */ /* Subsequent hand addition of selected languages */ constexpr const char* LANGUAGES[] = { - "aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", - "af", "afh", "agq", "ain", "ak", "akk", "akz", "ale", - "aln", "alt", "am", "an", "ang", "anp", "ar", "arc", - "arn", "aro", "arp", "arq", "ars", "arw", "ary", "arz", "as", - "asa", "ase", "ast", "av", "avk", "awa", "ay", "az", - "ba", "bal", "ban", "bar", "bas", "bax", "bbc", "bbj", - "be", "bej", "bem", "bew", "bez", "bfd", "bfq", "bg", - "bgc", "bgn", "bho", "bi", "bik", "bin", "bjn", "bkm", "bla", - "blo", "bm", "bn", "bo", "bpy", "bqi", "br", "bra", "brh", - "brx", "bs", "bss", "bua", "bug", "bum", "byn", "byv", - "ca", "cad", "car", "cay", "cch", "ccp", "ce", "ceb", "cgg", - "ch", "chb", "chg", "chk", "chm", "chn", "cho", "chp", - "chr", "chy", "ckb", "co", "cop", "cps", "cr", "crh", - "cs", "csb", "csw", "cu", "cv", "cy", - "da", "dak", "dar", "dav", "de", "del", "den", "dgr", - "din", "dje", "doi", "dsb", "dtp", "dua", "dum", "dv", - "dyo", "dyu", "dz", "dzg", - "ebu", "ee", "efi", "egl", "egy", "eka", "el", "elx", - "en", "enm", "eo", "es", "esu", "et", "eu", "ewo", - "ext", - "fa", "fan", "fat", "ff", "fi", "fil", "fit", "fj", - "fo", "fon", "fr", "frc", "frm", "fro", "frp", "frr", - "frs", "fur", "fy", - "ga", "gaa", "gag", "gan", "gay", "gba", "gbz", "gd", - "gez", "gil", "gl", "glk", "gmh", "gn", "goh", "gom", - "gon", "gor", "got", "grb", "grc", "gsw", "gu", "guc", - "gur", "guz", "gv", "gwi", - "ha", "hai", "hak", "haw", "he", "hi", "hif", "hil", - "hit", "hmn", "ho", "hr", "hsb", "hsn", "ht", "hu", - "hup", "hy", "hz", - "ia", "iba", "ibb", "id", "ie", "ig", "ii", "ik", - "ilo", "inh", "io", "is", "it", "iu", "izh", - "ja", "jam", "jbo", "jgo", "jmc", "jpr", "jrb", "jut", - "jv", - "ka", "kaa", "kab", "kac", "kaj", "kam", "kaw", "kbd", - "kbl", "kcg", "kde", "kea", "ken", "kfo", "kg", "kgp", - "kha", "kho", "khq", "khw", "ki", "kiu", "kj", "kk", - "kkj", "kl", "kln", "km", "kmb", "kn", "ko", "koi", - "kok", "kos", "kpe", "kr", "krc", "kri", "krj", "krl", - "kru", "ks", "ksb", "ksf", "ksh", "ku", "kum", "kut", - "kv", "kw", "kxv", "ky", - "la", "lad", "lag", "lah", "lam", "lb", "lez", "lfn", - "lg", "li", "lij", "liv", "lkt", "lmo", "ln", "lo", - "lol", "loz", "lrc", "lt", "ltg", "lu", "lua", "lui", - "lun", "luo", "lus", "luy", "lv", "lzh", "lzz", - "mad", "maf", "mag", "mai", "mak", "man", "mas", "mde", - "mdf", "mdh", "mdr", "men", "mer", "mfe", "mg", "mga", - "mgh", "mgo", "mh", "mi", "mic", "min", "mis", "mk", - "ml", "mn", "mnc", "mni", - "moh", "mos", "mr", "mrj", - "ms", "mt", "mua", "mul", "mus", "mwl", "mwr", "mwv", - "my", "mye", "myv", "mzn", - "na", "nan", "nap", "naq", "nb", "nd", "nds", "ne", - "new", "ng", "nia", "niu", "njo", "nl", "nmg", "nn", - "nnh", "no", "nog", "non", "nov", "nqo", "nr", "nso", - "nus", "nv", "nwc", "ny", "nym", "nyn", "nyo", "nzi", - "oc", "oj", "om", "or", "os", "osa", "ota", - "pa", "pag", "pal", "pam", "pap", "pau", "pcd", "pcm", "pdc", - "pdt", "peo", "pfl", "phn", "pi", "pl", "pms", "pnt", - "pon", "prg", "pro", "ps", "pt", - "qu", "quc", "qug", - "raj", "rap", "rar", "rgn", "rif", "rm", "rn", "ro", - "rof", "rom", "rtm", "ru", "rue", "rug", "rup", - "rw", "rwk", - "sa", "sad", "sah", "sam", "saq", "sas", "sat", "saz", - "sba", "sbp", "sc", "scn", "sco", "sd", "sdc", "sdh", - "se", "see", "seh", "sei", "sel", "ses", "sg", "sga", - "sgs", "shi", "shn", "shu", "si", "sid", "sk", - "sl", "sli", "sly", "sm", "sma", "smj", "smn", "sms", - "sn", "snk", "so", "sog", "sq", "sr", "srn", "srr", - "ss", "ssy", "st", "stq", "su", "suk", "sus", "sux", - "sv", "sw", "swb", "syc", "syr", "szl", - "ta", "tcy", "te", "tem", "teo", "ter", "tet", "tg", - "th", "ti", "tig", "tiv", "tk", "tkl", "tkr", - "tlh", "tli", "tly", "tmh", "tn", "to", "tog", "tok", "tpi", - "tr", "tru", "trv", "ts", "tsd", "tsi", "tt", "ttt", - "tum", "tvl", "tw", "twq", "ty", "tyv", "tzm", - "udm", "ug", "uga", "uk", "umb", "und", "ur", "uz", - "vai", "ve", "vec", "vep", "vi", "vls", "vmf", "vmw", - "vo", "vot", "vro", "vun", - "wa", "wae", "wal", "war", "was", "wbp", "wo", "wuu", - "xal", "xh", "xmf", "xnr", "xog", - "yao", "yap", "yav", "ybb", "yi", "yo", "yrl", "yue", - "za", "zap", "zbl", "zea", "zen", "zgh", "zh", "zu", - "zun", "zxx", "zza", + "aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain", "ak", "akk", + "akz", "ale", "aln", "alt", "am", "an", "ang", "anp", "ar", "arc", "arn", "aro", "arp", + "arq", "ars", "arw", "ary", "arz", "as", "asa", "ase", "ast", "av", "avk", "awa", "ay", + "az", "ba", "bal", "ban", "bar", "bas", "bax", "bbc", "bbj", "be", "bej", "bem", "bew", + "bez", "bfd", "bfq", "bg", "bgc", "bgn", "bho", "bi", "bik", "bin", "bjn", "bkm", "bla", + "blo", "bm", "bn", "bo", "bpy", "bqi", "br", "bra", "brh", "brx", "bs", "bss", "bua", "bug", + "bum", "byn", "byv", "ca", "cad", "car", "cay", "cch", "ccp", "ce", "ceb", "cgg", "ch", + "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "co", "cop", "cps", + "cr", "crh", "cs", "csb", "csw", "cu", "cv", "cy", "da", "dak", "dar", "dav", "day", "de", + "del", "den", "dgr", "din", "dje", "doi", "dra", "dsb", "dtp", "dua", "dum", "dv", "dyo", + "dyu", "dz", "dzg", "ebu", "ee", "efi", "egl", "egy", "eka", "el", "elx", "en", "enm", "eo", + "es", "esu", "et", "eu", "ewo", "ext", "fa", "fan", "fat", "ff", "fi", "fil", "fit", "fiu", + "fj", "fo", "fon", "fr", "frc", "frm", "fro", "frp", "frr", "frs", "fur", "fy", "ga", "gaa", + "gag", "gan", "gay", "gba", "gbz", "gd", "gem", "gez", "gil", "gl", "glk", "gmh", "gn", + "goh", "gom", "gon", "gor", "got", "grb", "grc", "gsw", "gu", "guc", "gur", "guz", "gv", + "gwi", "ha", "hai", "hak", "haw", "he", "hi", "hif", "hil", "him", "hit", "hmn", "ho", "hr", + "hsb", "hsn", "ht", "hu", "hup", "hy", "hz", "ia", "iba", "ibb", "id", "ie", "ig", "ii", + "ijo", "ik", "ilo", "inc", "ine", "inh", "io", "ira", "iro", "is", "it", "iu", "izh", "ja", + "jam", "jbo", "jgo", "jmc", "jpr", "jrb", "jut", "jv", "ka", "kaa", "kab", "kac", "kaj", + "kam", "kar", "kaw", "kbd", "kbl", "kcg", "kde", "kea", "ken", "kfo", "kg", "kgp", "kha", + "khi", "kho", "khq", "khw", "ki", "kiu", "kj", "kk", "kkj", "kl", "kln", "km", "kmb", "kn", + "ko", "koi", "kok", "kos", "kpe", "kr", "krc", "kri", "krj", "krl", "kro", "kru", "ks", + "ksb", "ksf", "ksh", "ku", "kum", "kut", "kv", "kw", "kxv", "ky", "la", "lad", "lag", "lah", + "lam", "lb", "lez", "lfn", "lg", "li", "lij", "liv", "lkt", "lmo", "ln", "lo", "lol", "loz", + "lrc", "lt", "ltg", "lu", "lua", "lui", "lun", "luo", "lus", "luy", "lv", "lzh", "lzz", + "mad", "maf", "mag", "mai", "mak", "man", "map", "mas", "mde", "mdf", "mdh", "mdr", "men", + "mer", "mfe", "mg", "mga", "mgh", "mgo", "mh", "mi", "mic", "min", "mis", "mk", "mkh", "ml", + "mn", "mnc", "mni", "mno", "moh", "mos", "mr", "mrj", "ms", "mt", "mua", "mul", "mun", + "mus", "mwl", "mwr", "mwv", "my", "mye", "myn", "myv", "mzn", "na", "nah", "nai", "nan", + "nap", "naq", "nb", "nd", "nds", "ne", "new", "ng", "nia", "nic", "niu", "njo", "nl", "nmg", + "nn", "nnh", "no", "nog", "non", "nov", "nqo", "nr", "nso", "nub", "nus", "nv", "nwc", "ny", + "nym", "nyn", "nyo", "nzi", "oc", "oj", "om", "or", "os", "osa", "ota", "oto", "pa", "paa", + "pag", "pal", "pam", "pap", "pau", "pcd", "pcm", "pdc", "pdt", "peo", "pfl", "phi", "phn", + "pi", "pl", "pms", "pnt", "pon", "pra", "prg", "pro", "ps", "pt", "qu", "quc", "qug", "raj", + "rap", "rar", "rgn", "rif", "rm", "rn", "ro", "roa", "rof", "rom", "rtm", "ru", "rue", + "rug", "rup", "rw", "rwk", "sa", "sad", "sah", "sai", "sal", "sam", "saq", "sas", "sat", + "saz", "sba", "sbp", "sc", "scn", "sco", "sd", "sdc", "sdh", "se", "see", "seh", "sei", + "sel", "sem", "ses", "sg", "sga", "sgn", "sgs", "shi", "shn", "shu", "si", "sid", "sio", + "sit", "sk", "sl", "sla", "sli", "sly", "sm", "sma", "smi", "smj", "smn", "sms", "sn", + "snk", "so", "sog", "son", "sq", "sr", "srn", "srr", "ss", "ssa", "ssy", "st", "stq", "su", + "suk", "sus", "sux", "sv", "sw", "swb", "syc", "syr", "szl", "ta", "tai", "tcy", "te", + "tem", "teo", "ter", "tet", "tg", "th", "ti", "tig", "tiv", "tk", "tkl", "tkr", "tlh", + "tli", "tly", "tmh", "tn", "to", "tog", "tok", "tpi", "tr", "tru", "trv", "ts", "tsd", + "tsi", "tt", "ttt", "tum", "tup", "tut", "tvl", "tw", "twq", "ty", "tyv", "tzm", "udm", + "ug", "uga", "uk", "umb", "und", "ur", "uz", "vai", "ve", "vec", "vep", "vi", "vls", "vmf", + "vmw", "vo", "vot", "vro", "vun", "wa", "wae", "wak", "wal", "war", "was", "wbp", "wen", + "wo", "wuu", "xal", "xh", "xmf", "xnr", "xog", "yao", "yap", "yav", "ybb", "yi", "yo", + "ypk", "yrl", "yue", "za", "zap", "zbl", "zea", "zen", "zgh", "zh", "znd", "zu", "zun", + "zxx", "zza", nullptr, "in", "iw", "ji", "jw", "mo", "sh", "swc", "tl", /* obsolete language codes */ nullptr @@ -218,91 +182,56 @@ constexpr const char* REPLACEMENT_LANGUAGES[]={ /* ISO639 table version is 20150505 */ /* Subsequent hand addition of selected languages */ constexpr const char* LANGUAGES_3[] = { - "aar", "abk", "ace", "ach", "ada", "ady", "ave", "aeb", - "afr", "afh", "agq", "ain", "aka", "akk", "akz", "ale", - "aln", "alt", "amh", "arg", "ang", "anp", "ara", "arc", - "arn", "aro", "arp", "arq", "ars", "arw", "ary", "arz", "asm", - "asa", "ase", "ast", "ava", "avk", "awa", "aym", "aze", - "bak", "bal", "ban", "bar", "bas", "bax", "bbc", "bbj", - "bel", "bej", "bem", "bew", "bez", "bfd", "bfq", "bul", - "bgc", "bgn", "bho", "bis", "bik", "bin", "bjn", "bkm", "bla", - "blo", "bam", "ben", "bod", "bpy", "bqi", "bre", "bra", "brh", - "brx", "bos", "bss", "bua", "bug", "bum", "byn", "byv", - "cat", "cad", "car", "cay", "cch", "ccp", "che", "ceb", "cgg", - "cha", "chb", "chg", "chk", "chm", "chn", "cho", "chp", - "chr", "chy", "ckb", "cos", "cop", "cps", "cre", "crh", - "ces", "csb", "csw", "chu", "chv", "cym", - "dan", "dak", "dar", "dav", "deu", "del", "den", "dgr", - "din", "dje", "doi", "dsb", "dtp", "dua", "dum", "div", - "dyo", "dyu", "dzo", "dzg", - "ebu", "ewe", "efi", "egl", "egy", "eka", "ell", "elx", - "eng", "enm", "epo", "spa", "esu", "est", "eus", "ewo", - "ext", - "fas", "fan", "fat", "ful", "fin", "fil", "fit", "fij", - "fao", "fon", "fra", "frc", "frm", "fro", "frp", "frr", - "frs", "fur", "fry", - "gle", "gaa", "gag", "gan", "gay", "gba", "gbz", "gla", - "gez", "gil", "glg", "glk", "gmh", "grn", "goh", "gom", - "gon", "gor", "got", "grb", "grc", "gsw", "guj", "guc", - "gur", "guz", "glv", "gwi", - "hau", "hai", "hak", "haw", "heb", "hin", "hif", "hil", - "hit", "hmn", "hmo", "hrv", "hsb", "hsn", "hat", "hun", - "hup", "hye", "her", - "ina", "iba", "ibb", "ind", "ile", "ibo", "iii", "ipk", - "ilo", "inh", "ido", "isl", "ita", "iku", "izh", - "jpn", "jam", "jbo", "jgo", "jmc", "jpr", "jrb", "jut", - "jav", - "kat", "kaa", "kab", "kac", "kaj", "kam", "kaw", "kbd", - "kbl", "kcg", "kde", "kea", "ken", "kfo", "kon", "kgp", - "kha", "kho", "khq", "khw", "kik", "kiu", "kua", "kaz", - "kkj", "kal", "kln", "khm", "kmb", "kan", "kor", "koi", - "kok", "kos", "kpe", "kau", "krc", "kri", "krj", "krl", - "kru", "kas", "ksb", "ksf", "ksh", "kur", "kum", "kut", - "kom", "cor", "kxv", "kir", - "lat", "lad", "lag", "lah", "lam", "ltz", "lez", "lfn", - "lug", "lim", "lij", "liv", "lkt", "lmo", "lin", "lao", - "lol", "loz", "lrc", "lit", "ltg", "lub", "lua", "lui", - "lun", "luo", "lus", "luy", "lav", "lzh", "lzz", - "mad", "maf", "mag", "mai", "mak", "man", "mas", "mde", - "mdf", "mdh", "mdr", "men", "mer", "mfe", "mlg", "mga", - "mgh", "mgo", "mah", "mri", "mic", "min", "mis", "mkd", - "mal", "mon", "mnc", "mni", - "moh", "mos", "mar", "mrj", - "msa", "mlt", "mua", "mul", "mus", "mwl", "mwr", "mwv", - "mya", "mye", "myv", "mzn", - "nau", "nan", "nap", "naq", "nob", "nde", "nds", "nep", - "new", "ndo", "nia", "niu", "njo", "nld", "nmg", "nno", - "nnh", "nor", "nog", "non", "nov", "nqo", "nbl", "nso", - "nus", "nav", "nwc", "nya", "nym", "nyn", "nyo", "nzi", - "oci", "oji", "orm", "ori", "oss", "osa", "ota", - "pan", "pag", "pal", "pam", "pap", "pau", "pcd", "pcm", "pdc", - "pdt", "peo", "pfl", "phn", "pli", "pol", "pms", "pnt", - "pon", "prg", "pro", "pus", "por", - "que", "quc", "qug", - "raj", "rap", "rar", "rgn", "rif", "roh", "run", "ron", - "rof", "rom", "rtm", "rus", "rue", "rug", "rup", - "kin", "rwk", - "san", "sad", "sah", "sam", "saq", "sas", "sat", "saz", - "sba", "sbp", "srd", "scn", "sco", "snd", "sdc", "sdh", - "sme", "see", "seh", "sei", "sel", "ses", "sag", "sga", - "sgs", "shi", "shn", "shu", "sin", "sid", "slk", - "slv", "sli", "sly", "smo", "sma", "smj", "smn", "sms", - "sna", "snk", "som", "sog", "sqi", "srp", "srn", "srr", - "ssw", "ssy", "sot", "stq", "sun", "suk", "sus", "sux", - "swe", "swa", "swb", "syc", "syr", "szl", - "tam", "tcy", "tel", "tem", "teo", "ter", "tet", "tgk", - "tha", "tir", "tig", "tiv", "tuk", "tkl", "tkr", - "tlh", "tli", "tly", "tmh", "tsn", "ton", "tog", "tok", "tpi", - "tur", "tru", "trv", "tso", "tsd", "tsi", "tat", "ttt", - "tum", "tvl", "twi", "twq", "tah", "tyv", "tzm", - "udm", "uig", "uga", "ukr", "umb", "und", "urd", "uzb", - "vai", "ven", "vec", "vep", "vie", "vls", "vmf", "vmw", - "vol", "vot", "vro", "vun", - "wln", "wae", "wal", "war", "was", "wbp", "wol", "wuu", - "xal", "xho", "xmf", "xnr", "xog", - "yao", "yap", "yav", "ybb", "yid", "yor", "yrl", "yue", - "zha", "zap", "zbl", "zea", "zen", "zgh", "zho", "zul", - "zun", "zxx", "zza", + "aar", "abk", "ace", "ach", "ada", "ady", "ave", "aeb", "afr", "afh", "agq", "ain", "aka", + "akk", "akz", "ale", "aln", "alt", "amh", "arg", "ang", "anp", "ara", "arc", "arn", "aro", + "arp", "arq", "ars", "arw", "ary", "arz", "asm", "asa", "ase", "ast", "ava", "avk", "awa", + "aym", "aze", "bak", "bal", "ban", "bar", "bas", "bax", "bbc", "bbj", "bel", "bej", "bem", + "bew", "bez", "bfd", "bfq", "bul", "bgc", "bgn", "bho", "bis", "bik", "bin", "bjn", "bkm", + "bla", "blo", "bam", "ben", "bod", "bpy", "bqi", "bre", "bra", "brh", "brx", "bos", "bss", + "bua", "bug", "bum", "byn", "byv", "cat", "cad", "car", "cay", "cch", "ccp", "che", "ceb", + "cgg", "cha", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "cos", + "cop", "cps", "cre", "crh", "ces", "csb", "csw", "chu", "chv", "cym", "dan", "dak", "dar", + "dav", "day", "deu", "del", "den", "dgr", "din", "dje", "doi", "dra", "dsb", "dtp", "dua", + "dum", "div", "dyo", "dyu", "dzo", "dzg", "ebu", "ewe", "efi", "egl", "egy", "eka", "ell", + "elx", "eng", "enm", "epo", "spa", "esu", "est", "eus", "ewo", "ext", "fas", "fan", "fat", + "ful", "fin", "fil", "fit", "fiu", "fij", "fao", "fon", "fra", "frc", "frm", "fro", "frp", + "frr", "frs", "fur", "fry", "gle", "gaa", "gag", "gan", "gay", "gba", "gbz", "gla", "gem", + "gez", "gil", "glg", "glk", "gmh", "grn", "goh", "gom", "gon", "gor", "got", "grb", "grc", + "gsw", "guj", "guc", "gur", "guz", "glv", "gwi", "hau", "hai", "hak", "haw", "heb", "hin", + "hif", "hil", "him", "hit", "hmn", "hmo", "hrv", "hsb", "hsn", "hat", "hun", "hup", "hye", + "her", "ina", "iba", "ibb", "ind", "ile", "ibo", "iii", "ijo", "ipk", "ilo", "inc", "ine", + "inh", "ido", "ira", "iro", "isl", "ita", "iku", "izh", "jpn", "jam", "jbo", "jgo", "jmc", + "jpr", "jrb", "jut", "jav", "kat", "kaa", "kab", "kac", "kaj", "kam", "kar", "kaw", "kbd", + "kbl", "kcg", "kde", "kea", "ken", "kfo", "kon", "kgp", "kha", "khi", "kho", "khq", "khw", + "kik", "kiu", "kua", "kaz", "kkj", "kal", "kln", "khm", "kmb", "kan", "kor", "koi", "kok", + "kos", "kpe", "kau", "krc", "kri", "krj", "krl", "kro", "kru", "kas", "ksb", "ksf", "ksh", + "kur", "kum", "kut", "kom", "cor", "kxv", "kir", "lat", "lad", "lag", "lah", "lam", "ltz", + "lez", "lfn", "lug", "lim", "lij", "liv", "lkt", "lmo", "lin", "lao", "lol", "loz", "lrc", + "lit", "ltg", "lub", "lua", "lui", "lun", "luo", "lus", "luy", "lav", "lzh", "lzz", "mad", + "maf", "mag", "mai", "mak", "man", "map", "mas", "mde", "mdf", "mdh", "mdr", "men", "mer", + "mfe", "mlg", "mga", "mgh", "mgo", "mah", "mri", "mic", "min", "mis", "mkd", "mkh", "mal", + "mon", "mnc", "mni", "mno", "moh", "mos", "mar", "mrj", "msa", "mlt", "mua", "mul", "mun", + "mus", "mwl", "mwr", "mwv", "mya", "mye", "myn", "myv", "mzn", "nau", "nah", "nai", "nan", + "nap", "naq", "nob", "nde", "nds", "nep", "new", "ndo", "nia", "nic", "niu", "njo", "nld", + "nmg", "nno", "nnh", "nor", "nog", "non", "nov", "nqo", "nbl", "nso", "nub", "nus", "nav", + "nwc", "nya", "nym", "nyn", "nyo", "nzi", "oci", "oji", "orm", "ori", "oss", "osa", "ota", + "oto", "pan", "paa", "pag", "pal", "pam", "pap", "pau", "pcd", "pcm", "pdc", "pdt", "peo", + "pfl", "phi", "phn", "pli", "pol", "pms", "pnt", "pon", "pra", "prg", "pro", "pus", "por", + "que", "quc", "qug", "raj", "rap", "rar", "rgn", "rif", "roh", "run", "ron", "roa", "rof", + "rom", "rtm", "rus", "rue", "rug", "rup", "kin", "rwk", "san", "sad", "sah", "sai", "sal", + "sam", "saq", "sas", "sat", "saz", "sba", "sbp", "srd", "scn", "sco", "snd", "sdc", "sdh", + "sme", "see", "seh", "sei", "sel", "sem", "ses", "sag", "sga", "sgn", "sgs", "shi", "shn", + "shu", "sin", "sid", "sio", "sit", "slk", "slv", "sla", "sli", "sly", "smo", "sma", "smi", + "smj", "smn", "sms", "sna", "snk", "som", "sog", "son", "sqi", "srp", "srn", "srr", "ssw", + "ssa", "ssy", "sot", "stq", "sun", "suk", "sus", "sux", "swe", "swa", "swb", "syc", "syr", + "szl", "tam", "tai", "tcy", "tel", "tem", "teo", "ter", "tet", "tgk", "tha", "tir", "tig", + "tiv", "tuk", "tkl", "tkr", "tlh", "tli", "tly", "tmh", "tsn", "ton", "tog", "tok", "tpi", + "tur", "tru", "trv", "tso", "tsd", "tsi", "tat", "ttt", "tum", "tup", "tut", "tvl", "twi", + "twq", "tah", "tyv", "tzm", "udm", "uig", "uga", "ukr", "umb", "und", "urd", "uzb", "vai", + "ven", "vec", "vep", "vie", "vls", "vmf", "vmw", "vol", "vot", "vro", "vun", "wln", "wae", + "wak", "wal", "war", "was", "wbp", "wen", "wol", "wuu", "xal", "xho", "xmf", "xnr", "xog", + "yao", "yap", "yav", "ybb", "yid", "yor", "ypk", "yrl", "yue", "zha", "zap", "zbl", "zea", + "zen", "zgh", "zho", "znd", "zul", "zun", "zxx", "zza", nullptr, /* "in", "iw", "ji", "jw", "mo", "sh", "swc", "tl", */ "ind", "heb", "yid", "jaw", "mol", "srp", "swc", "tgl", @@ -522,8 +451,8 @@ inline bool UPRV_OK_VALUE_PUNCTUATION(char c) { return c == '_' || c == '-' || c #define ULOC_KEYWORD_BUFFER_LEN 25 #define ULOC_MAX_NO_KEYWORDS 25 -U_CAPI const char * U_EXPORT2 -locale_getKeywordsStart(std::string_view localeID) { +U_CAPI const char* U_EXPORT2 +locale_getKeywordsStart(std::string_view localeID U_LIFETIME_BOUND) { if (size_t pos = localeID.find('@'); pos != std::string_view::npos) { return localeID.data() + pos; } @@ -1195,12 +1124,12 @@ std::optional _findIndex(const char* const* list, const char* key) } // namespace U_CFUNC const char* -uloc_getCurrentCountryID(const char* oldID){ +uloc_getCurrentCountryID(const char* oldID U_LIFETIME_BOUND) { std::optional offset = _findIndex(DEPRECATED_COUNTRIES, oldID); return offset.has_value() ? REPLACEMENT_COUNTRIES[*offset] : oldID; } U_CFUNC const char* -uloc_getCurrentLanguageID(const char* oldID){ +uloc_getCurrentLanguageID(const char* oldID U_LIFETIME_BOUND) { std::optional offset = _findIndex(DEPRECATED_LANGUAGES, oldID); return offset.has_value() ? REPLACEMENT_LANGUAGES[*offset] : oldID; } @@ -2374,7 +2303,7 @@ uloc_getISOCountries() } U_CAPI const char* U_EXPORT2 -uloc_toUnicodeLocaleKey(const char* keyword) +uloc_toUnicodeLocaleKey(const char* keyword U_LIFETIME_BOUND) { if (keyword == nullptr || *keyword == '\0') { return nullptr; } std::optional result = ulocimp_toBcpKeyWithFallback(keyword); @@ -2382,7 +2311,7 @@ uloc_toUnicodeLocaleKey(const char* keyword) } U_EXPORT std::optional -ulocimp_toBcpKeyWithFallback(std::string_view keyword) +ulocimp_toBcpKeyWithFallback(std::string_view keyword U_LIFETIME_BOUND) { std::optional bcpKey = ulocimp_toBcpKey(keyword); if (!bcpKey.has_value() && @@ -2394,7 +2323,7 @@ ulocimp_toBcpKeyWithFallback(std::string_view keyword) } U_CAPI const char* U_EXPORT2 -uloc_toUnicodeLocaleType(const char* keyword, const char* value) +uloc_toUnicodeLocaleType(const char* keyword, const char* value U_LIFETIME_BOUND) { if (keyword == nullptr || *keyword == '\0' || value == nullptr || *value == '\0') { return nullptr; } @@ -2403,7 +2332,7 @@ uloc_toUnicodeLocaleType(const char* keyword, const char* value) } U_EXPORT std::optional -ulocimp_toBcpTypeWithFallback(std::string_view keyword, std::string_view value) +ulocimp_toBcpTypeWithFallback(std::string_view keyword, std::string_view value U_LIFETIME_BOUND) { std::optional bcpType = ulocimp_toBcpType(keyword, value); if (!bcpType.has_value() && @@ -2444,7 +2373,7 @@ isWellFormedLegacyType(std::string_view legacyType) } // namespace U_CAPI const char* U_EXPORT2 -uloc_toLegacyKey(const char* keyword) +uloc_toLegacyKey(const char* keyword U_LIFETIME_BOUND) { if (keyword == nullptr || *keyword == '\0') { return nullptr; } std::optional result = ulocimp_toLegacyKeyWithFallback(keyword); @@ -2452,7 +2381,7 @@ uloc_toLegacyKey(const char* keyword) } U_EXPORT std::optional -ulocimp_toLegacyKeyWithFallback(std::string_view keyword) +ulocimp_toLegacyKeyWithFallback(std::string_view keyword U_LIFETIME_BOUND) { std::optional legacyKey = ulocimp_toLegacyKey(keyword); if (!legacyKey.has_value() && isWellFormedLegacyKey(keyword)) { @@ -2469,7 +2398,7 @@ ulocimp_toLegacyKeyWithFallback(std::string_view keyword) } U_CAPI const char* U_EXPORT2 -uloc_toLegacyType(const char* keyword, const char* value) +uloc_toLegacyType(const char* keyword, const char* value U_LIFETIME_BOUND) { if (keyword == nullptr || *keyword == '\0' || value == nullptr || *value == '\0') { return nullptr; } @@ -2478,7 +2407,7 @@ uloc_toLegacyType(const char* keyword, const char* value) } U_EXPORT std::optional -ulocimp_toLegacyTypeWithFallback(std::string_view keyword, std::string_view value) +ulocimp_toLegacyTypeWithFallback(std::string_view keyword, std::string_view value U_LIFETIME_BOUND) { std::optional legacyType = ulocimp_toLegacyType(keyword, value); if (!legacyType.has_value() && isWellFormedLegacyType(value)) { diff --git a/deps/icu-small/source/common/uloc_keytype.cpp b/deps/icu-small/source/common/uloc_keytype.cpp index c9decf7cd18f..f089626c979e 100644 --- a/deps/icu-small/source/common/uloc_keytype.cpp +++ b/deps/icu-small/source/common/uloc_keytype.cpp @@ -469,7 +469,7 @@ ulocimp_toLegacyKey(std::string_view key) { } U_EXPORT std::optional -ulocimp_toBcpType(std::string_view key, std::string_view type) { +ulocimp_toBcpType(std::string_view key, std::string_view type U_LIFETIME_BOUND) { if (!init()) { return std::nullopt; } @@ -502,7 +502,7 @@ ulocimp_toBcpType(std::string_view key, std::string_view type) { U_EXPORT std::optional -ulocimp_toLegacyType(std::string_view key, std::string_view type) { +ulocimp_toLegacyType(std::string_view key, std::string_view type U_LIFETIME_BOUND) { if (!init()) { return std::nullopt; } diff --git a/deps/icu-small/source/common/uloc_tag.cpp b/deps/icu-small/source/common/uloc_tag.cpp index b2e9946f48a7..a62a6d0b9186 100644 --- a/deps/icu-small/source/common/uloc_tag.cpp +++ b/deps/icu-small/source/common/uloc_tag.cpp @@ -312,7 +312,7 @@ void ultag_close(ULanguageTag* langtag); const char* -ultag_getLanguage(const ULanguageTag* langtag); +ultag_getLanguage(const ULanguageTag* langtag U_LIFETIME_BOUND); #if 0 const char* @@ -320,34 +320,34 @@ ultag_getJDKLanguage(const ULanguageTag* langtag); #endif const char* -ultag_getExtlang(const ULanguageTag* langtag, int32_t idx); +ultag_getExtlang(const ULanguageTag* langtag U_LIFETIME_BOUND, int32_t idx); int32_t ultag_getExtlangSize(const ULanguageTag* langtag); const char* -ultag_getScript(const ULanguageTag* langtag); +ultag_getScript(const ULanguageTag* langtag U_LIFETIME_BOUND); const char* -ultag_getRegion(const ULanguageTag* langtag); +ultag_getRegion(const ULanguageTag* langtag U_LIFETIME_BOUND); const char* -ultag_getVariant(const ULanguageTag* langtag, int32_t idx); +ultag_getVariant(const ULanguageTag* langtag U_LIFETIME_BOUND, int32_t idx); int32_t ultag_getVariantsSize(const ULanguageTag* langtag); const char* -ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx); +ultag_getExtensionKey(const ULanguageTag* langtag U_LIFETIME_BOUND, int32_t idx); const char* -ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx); +ultag_getExtensionValue(const ULanguageTag* langtag U_LIFETIME_BOUND, int32_t idx); int32_t ultag_getExtensionsSize(const ULanguageTag* langtag); const char* -ultag_getPrivateUse(const ULanguageTag* langtag); +ultag_getPrivateUse(const ULanguageTag* langtag U_LIFETIME_BOUND); #if 0 const char* @@ -677,7 +677,7 @@ _isTKey(const char* s, int32_t len) } // namespace const char* -ultag_getTKeyStart(const char *localeID) { +ultag_getTKeyStart(const char* localeID U_LIFETIME_BOUND) { const char *result = localeID; const char *sep; while((sep = uprv_strchr(result, SEP)) != nullptr) { @@ -2416,7 +2416,7 @@ ultag_close(ULanguageTag* langtag) { } const char* -ultag_getLanguage(const ULanguageTag* langtag) { +ultag_getLanguage(const ULanguageTag* langtag U_LIFETIME_BOUND) { return langtag->language; } @@ -2434,7 +2434,7 @@ ultag_getJDKLanguage(const ULanguageTag* langtag) { #endif const char* -ultag_getExtlang(const ULanguageTag* langtag, int32_t idx) { +ultag_getExtlang(const ULanguageTag* langtag U_LIFETIME_BOUND, int32_t idx) { if (idx >= 0 && idx < MAXEXTLANG) { return langtag->extlang[idx]; } @@ -2454,17 +2454,17 @@ ultag_getExtlangSize(const ULanguageTag* langtag) { } const char* -ultag_getScript(const ULanguageTag* langtag) { +ultag_getScript(const ULanguageTag* langtag U_LIFETIME_BOUND) { return langtag->script; } const char* -ultag_getRegion(const ULanguageTag* langtag) { +ultag_getRegion(const ULanguageTag* langtag U_LIFETIME_BOUND) { return langtag->region; } const char* -ultag_getVariant(const ULanguageTag* langtag, int32_t idx) { +ultag_getVariant(const ULanguageTag* langtag U_LIFETIME_BOUND, int32_t idx) { const char *var = nullptr; VariantListEntry *cur = langtag->variants; int32_t i = 0; @@ -2494,7 +2494,7 @@ ultag_getVariantsSize(const ULanguageTag* langtag) { } const char* -ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx) { +ultag_getExtensionKey(const ULanguageTag* langtag U_LIFETIME_BOUND, int32_t idx) { const char *key = nullptr; ExtensionListEntry *cur = langtag->extensions; int32_t i = 0; @@ -2510,7 +2510,7 @@ ultag_getExtensionKey(const ULanguageTag* langtag, int32_t idx) { } const char* -ultag_getExtensionValue(const ULanguageTag* langtag, int32_t idx) { +ultag_getExtensionValue(const ULanguageTag* langtag U_LIFETIME_BOUND, int32_t idx) { const char *val = nullptr; ExtensionListEntry *cur = langtag->extensions; int32_t i = 0; @@ -2540,7 +2540,7 @@ ultag_getExtensionsSize(const ULanguageTag* langtag) { } const char* -ultag_getPrivateUse(const ULanguageTag* langtag) { +ultag_getPrivateUse(const ULanguageTag* langtag U_LIFETIME_BOUND) { return langtag->privateuse; } diff --git a/deps/icu-small/source/common/ulocale.cpp b/deps/icu-small/source/common/ulocale.cpp index 33814713dc1b..f561e504cea4 100644 --- a/deps/icu-small/source/common/ulocale.cpp +++ b/deps/icu-small/source/common/ulocale.cpp @@ -40,7 +40,7 @@ ulocale_close(ULocale* locale) { } #define IMPL_ULOCALE_STRING_GETTER(N1, N2) \ -const char* ulocale_get ## N1(const ULocale* locale) { \ +const char* ulocale_get ## N1(const ULocale* locale U_LIFETIME_BOUND) { \ if (locale == nullptr) return nullptr; \ return CONST_INTERNAL(locale)->get ## N2(); \ } diff --git a/deps/icu-small/source/common/ulocbuilder.cpp b/deps/icu-small/source/common/ulocbuilder.cpp index b8b6ce8c1869..b770392b4fd6 100644 --- a/deps/icu-small/source/common/ulocbuilder.cpp +++ b/deps/icu-small/source/common/ulocbuilder.cpp @@ -7,8 +7,8 @@ #include "unicode/localebuilder.h" #include "unicode/locid.h" #include "unicode/stringpiece.h" -#include "unicode/umachine.h" #include "unicode/ulocbuilder.h" +#include "unicode/utypes.h" #include "bytesinkutil.h" #include "cstring.h" #include "ustr_imp.h" diff --git a/deps/icu-small/source/common/ulocimp.h b/deps/icu-small/source/common/ulocimp.h index a45eba651f77..49cc42762aec 100644 --- a/deps/icu-small/source/common/ulocimp.h +++ b/deps/icu-small/source/common/ulocimp.h @@ -50,22 +50,22 @@ inline bool _isIDSeparator(char a) { return a == '_' || a == '-'; } } // namespace U_CFUNC const char* -uloc_getCurrentCountryID(const char* oldID); +uloc_getCurrentCountryID(const char* oldID U_LIFETIME_BOUND); U_CFUNC const char* -uloc_getCurrentLanguageID(const char* oldID); +uloc_getCurrentLanguageID(const char* oldID U_LIFETIME_BOUND); U_COMMON_API std::optional -ulocimp_toBcpKeyWithFallback(std::string_view keyword); +ulocimp_toBcpKeyWithFallback(std::string_view keyword U_LIFETIME_BOUND); U_COMMON_API std::optional -ulocimp_toBcpTypeWithFallback(std::string_view keyword, std::string_view value); +ulocimp_toBcpTypeWithFallback(std::string_view keyword, std::string_view value U_LIFETIME_BOUND); U_COMMON_API std::optional -ulocimp_toLegacyKeyWithFallback(std::string_view keyword); +ulocimp_toLegacyKeyWithFallback(std::string_view keyword U_LIFETIME_BOUND); U_COMMON_API std::optional -ulocimp_toLegacyTypeWithFallback(std::string_view keyword, std::string_view value); +ulocimp_toLegacyTypeWithFallback(std::string_view keyword, std::string_view value U_LIFETIME_BOUND); U_COMMON_API icu::CharString ulocimp_getKeywords(std::string_view localeID, @@ -363,8 +363,8 @@ ulocimp_minimizeSubtags(const char* localeID, bool favorScript, UErrorCode& err); -U_CAPI const char * U_EXPORT2 -locale_getKeywordsStart(std::string_view localeID); +U_CAPI const char* U_EXPORT2 +locale_getKeywordsStart(std::string_view localeID U_LIFETIME_BOUND); bool ultag_isExtensionSubtags(const char* s, int32_t len); @@ -403,7 +403,7 @@ bool ultag_isVariantSubtags(const char* s, int32_t len); const char* -ultag_getTKeyStart(const char* localeID); +ultag_getTKeyStart(const char* localeID U_LIFETIME_BOUND); U_COMMON_API std::optional ulocimp_toBcpKey(std::string_view key); @@ -412,10 +412,10 @@ U_COMMON_API std::optional ulocimp_toLegacyKey(std::string_view key); U_COMMON_API std::optional -ulocimp_toBcpType(std::string_view key, std::string_view type); +ulocimp_toBcpType(std::string_view key, std::string_view type U_LIFETIME_BOUND); U_COMMON_API std::optional -ulocimp_toLegacyType(std::string_view key, std::string_view type); +ulocimp_toLegacyType(std::string_view key, std::string_view type U_LIFETIME_BOUND); /* Function for testing purpose */ U_COMMON_API const char* const* diff --git a/deps/icu-small/source/common/umapfile.cpp b/deps/icu-small/source/common/umapfile.cpp index c01ac69c3a42..c99b9ef4a723 100644 --- a/deps/icu-small/source/common/umapfile.cpp +++ b/deps/icu-small/source/common/umapfile.cpp @@ -215,18 +215,19 @@ typedef HANDLE MemoryMap; UDataMemory_init(pData); /* Clear the output struct. */ - /* determine the length of the file */ - if(stat(path, &mystat)!=0 || mystat.st_size<=0) { - return false; - } - length=mystat.st_size; - /* open the file */ fd=open(path, O_RDONLY); if(fd==-1) { return false; } + /* determine the length of the file */ + if(stat(path, &mystat)!=0 || mystat.st_size<=0) { + close(fd); + return false; + } + length=mystat.st_size; + /* get a view of the mapping */ #if U_PLATFORM != U_PF_HPUX data=mmap(nullptr, length, PROT_READ, MAP_SHARED, fd, 0); diff --git a/deps/icu-small/source/common/unames.cpp b/deps/icu-small/source/common/unames.cpp index 71b2baff6c19..884f1c8499c5 100644 --- a/deps/icu-small/source/common/unames.cpp +++ b/deps/icu-small/source/common/unames.cpp @@ -85,6 +85,195 @@ typedef struct { uint32_t tokenStringOffset, groupsOffset, groupStringOffset, algNamesOffset; } UCharNames; +namespace { +// For a character name `name`, a query string `query` matches `name` under UAX44-LM2 if and only if +// the following returns true: +// auto matcher = CharacterNameQuery(query).matcher(); +// for (const char c : name) { +// if (!matcher.consistentWith(c)) { +// return false; +// } +// } +// return matcher.matches(); +// `name` must be an exact character name, in particular, all uppercase, with no underscores, no +// double hyphens, no isolated hyphens. There are no constraints on `query`; for instance, this +// class will match name="ZANABAZAR SQUARE LETTER -A" with query="Zanabazar-square_letter_-A". +// `Matcher::consistentWith` is not retryable: once it returns false, the `Matcher` should not be +// used again. +class CharacterNameQuery { + public: + class Matcher { + public: + // `query` must outlive the constructed object. + Matcher(const CharacterNameQuery& query) + : query(query), skeletonIterator(query.skeleton.begin()) {} + + bool consistentWith(char c) { + // Instead of constructing a skeleton from the name as in the constructor of + // CharacterNameQuery, we check character-by-character if the skeleton we would + // construct from the name would be consistent with `query->skeleton`. + // We require that this be called with characters from an actual character name, so we + // need not worry about case or underscores here. + + if (skeletonIterator == query.skeleton.end()) { + return false; + } + if (c == ' ') { + // The last hyphen was word-final; check that there is a corresponding significant + // hyphen in the skeleton. A hyphen in a character name cannot be both word-final + // and word-initial by rule R3 in + // https://unicode.org/versions/Unicode17.0.0/core-spec/chapter-4/#G135165, so we do + // not have to worry about checking the skeleton for the same significant hyphen + // twice. + if (lastChar == '-') { + if (*skeletonIterator++ != lastChar) { + return false; + } + } + lastChar = c; + return true; + } else if (c == '-') { + if (lastChar == ' ' || + (query.is1180 && skeletonIterator == query.skeleton.end() - 2)) { + // If lastChar == ' ', this is a word-initial hyphen, so we know it is + // significant. Check that we are expecting it. + // If we are looking for U+1180 and we matched everything but the trailing -E, + // this could be that hyphen; move past it. This could turn out to be a + // different character name if there is something other than E afterwards, in + // which case we should in principle have ignored the hyphen; but then since the + // suffixes will differ, we will return false anyway. + // For example, when searching for HANGUL JUNGSEONG O-E and checking consistency + // with HANGUL JUNGSEONG O-U, if we computed both skeleta and compared them, + // the skeleta would be HANGULJUNGSEONGO-E and HANGULJUNGSEONGOU, and the + // comparison would fail on - vs. U. + // Here, while feeding HANGUL JUNGSEONG O-U character-by-character, we assume + // its skeleton would be HANGULJUNGSEONGO-, and fail on E vs. U. + if (*skeletonIterator++ != c) { + return false; + } + } + // If lastChar is not ' ', we do not know whether this hyphen is word-final, so we + // cannot check against the skeleton. + lastChar = c; + return true; + } else { + if (*skeletonIterator++ != c) { + return false; + } + lastChar = c; + return true; + } + } + + bool consistentWith(const std::string_view substring) { + for (const char c : substring) { + if (!consistentWith(c)) { + return false; + } + } + return true; + } + + bool matches() { + // If a character name could end with a HYPHEN-MINUS, that HYPHEN-MINUS would be + // significant: we would need to check that if lastChar == '-', + // *skeletonIterator == '-', and then advance skeletonIterator. + // However, this is disallowed by rule R3 in + // https://unicode.org/versions/Unicode17.0.0/core-spec/chapter-4/#G135165. + U_ASSERT(lastChar != '-'); + return skeletonIterator == query.skeleton.end(); + } + + std::string_view remainingSignificantCharacters() const { + return query.skeleton.substr(skeletonIterator - query.skeleton.begin()); + } + + private: + const CharacterNameQuery& query; + std::string_view::const_iterator skeletonIterator; + // Initialized to ' ' so that a leading hyphen is treated like a hyphen that follows a + // space (non-medial and thus not ignorable). There are in fact no leading hyphens in + // character names by rule R3 in + // https://unicode.org/versions/Unicode17.0.0/core-spec/chapter-4/#G135165, and technically + // we do not read the value of this variable before writing to it because the first call to + // consistentWith never has c=' ' either by R4, but it seems cleanest to initialize lastChar + // nonetheless. + char lastChar = ' '; + }; + + explicit CharacterNameQuery(std::string_view query) { + // Construct a skeleton obtained by + // 1. removing medial hyphens (except the one in the name of U+1180); + // 2. removing spaces and underscores; + // 3. uppercasing, + // as described in https://www.unicode.org/reports/tr44/#UAX44-LM2. + // We do all three in a single pass. + char *skeletonLimit = skeletonData; + for (std::size_t i = 0; i < query.length(); ++i) { + U_ASSERT(skeletonLimit < skeletonData + sizeof(skeletonData)); + if (skeletonLimit >= skeletonData + sizeof(skeletonData)) { + // The caller should limit the query length appropriately; if they do not, assert, + // and if assertions are disabled, query for the empty string (which will quickly + // find nothing). + skeletonLimit = skeletonData; + break; + } + if (query[i] == ' ' || query[i] == '_') { + continue; + } + if (query[i] == '-') { + bool isMedial; + bool is1180MedialHyphen = false; + if (i == 0 || i == query.length() - 1) { + isMedial = false; + } else { + isMedial = isASCIILetterOrDigit(query[i - 1]) && isASCIILetterOrDigit(query[i + 1]); + } + // A medial hyphen is the hyphen in the name of U+1180 HANGUL JUNGSEONG O-E if what + // comes before skeletonizes to HANGULJUNGSEONGO and what comes after skeletonizes + // to E. + if (isMedial && uprv_toupper(query[i + 1]) == 'E' && + std::string_view(skeletonData, skeletonLimit - skeletonData) == "HANGULJUNGSEONGO") { + is1180MedialHyphen = true; + // If there is anything significant after the E, the part of the name after the + // hyphen does not skeletonize to E, and thus this is not U+1180. + // There can be no hyphens there: if there is one, it is either non-medial, or + // there is another letter beyond the E. The insignificant characters are thus + // only spaces and underscores. + for (std::size_t j = i + 2; j < query.length(); ++j) { + if (query[j] != ' ' && query[j] != '_') { + is1180MedialHyphen = false; + } + } + } + if (!isMedial || is1180MedialHyphen) { + *skeletonLimit++ = query[i]; + } + } else { + *skeletonLimit++ = uprv_toupper(query[i]); + } + } + skeleton = std::string_view(skeletonData, skeletonLimit - skeletonData); + // This can be true even if we never went through the is1180MedialHyphen path, e.g., if the + // query was "HANGUL JUNGSEONG O -E". + is1180 = skeleton == "HANGULJUNGSEONGO-E"; + } + + Matcher matcher() const { + return Matcher(*this); + } + +private: + static bool isASCIILetterOrDigit(const char c) { + return uprv_isASCIILetter(c) || (c >= '0' && c <= '9'); + } + + char skeletonData[120]; + std::string_view skeleton; + bool is1180; +}; +} // namespace + /* * Get the groups table from a UCharNames struct. * The groups table consists of one uint16_t groupCount followed by @@ -97,7 +286,7 @@ typedef struct { #define GET_GROUPS(names) (const uint16_t *)((const char *)names+names->groupsOffset) typedef struct { - const char *otherName; + const CharacterNameQuery *otherName; UChar32 code; } FindName; @@ -293,14 +482,6 @@ expandName(UCharNames *names, /* explicit letter */ WRITE_CHAR(buffer, bufferLength, bufferPos, c); } else { - /* stop, but skip the semicolon if we are seeking - extended names and there was no 2.0 name but there - is a 1.0 name. */ - if(!bufferPos && nameChoice == U_EXTENDED_CHAR_NAME) { - if (static_cast(';') >= tokenCount || tokens[static_cast(';')] == static_cast(-1)) { - continue; - } - } /* finished */ break; } @@ -330,12 +511,12 @@ expandName(UCharNames *names, static UBool compareName(UCharNames *names, const uint8_t *name, uint16_t nameLength, UCharNameChoice nameChoice, - const char *otherName) { + const CharacterNameQuery& otherName) { uint16_t* tokens = reinterpret_cast(names) + 8; uint16_t token, tokenCount=*tokens++; uint8_t* tokenStrings = reinterpret_cast(names) + names->tokenStringOffset; uint8_t c; - const char *origOtherName = otherName; + auto matcher = otherName.matcher(); if(nameChoice!=U_UNICODE_CHAR_NAME && nameChoice!=U_EXTENDED_CHAR_NAME) { /* @@ -370,7 +551,7 @@ compareName(UCharNames *names, if(c>=tokenCount) { if(c!=';') { /* implicit letter */ - if (static_cast(c) != *otherName++) { + if (!matcher.consistentWith(c)) { return false; } } else { @@ -387,35 +568,24 @@ compareName(UCharNames *names, if (token == static_cast(-1)) { if(c!=';') { /* explicit letter */ - if (static_cast(c) != *otherName++) { + if (!matcher.consistentWith(c)) { return false; } } else { - /* stop, but skip the semicolon if we are seeking - extended names and there was no 2.0 name but there - is a 1.0 name. */ - if(otherName == origOtherName && nameChoice == U_EXTENDED_CHAR_NAME) { - if (static_cast(';') >= tokenCount || tokens[static_cast(';')] == static_cast(-1)) { - continue; - } - } /* finished */ break; } } else { /* write token word */ - uint8_t *tokenString=tokenStrings+token; - while((c=*tokenString++)!=0) { - if (static_cast(c) != *otherName++) { - return false; - } + if (!matcher.consistentWith(reinterpret_cast(tokenStrings + token))) { + return false; } } } } /* complete match? */ - return *otherName == 0; + return matcher.matches(); } static uint8_t getCharCat(UChar32 cp) { @@ -622,7 +792,7 @@ enumGroupNames(UCharNames *names, const uint16_t *group, ++start; } } else { - const char* otherName = static_cast(context)->otherName; + const CharacterNameQuery& otherName = *static_cast(context)->otherName; while(start<=end) { if(compareName(names, s+offsets[start&GROUP_MASK], lengths[start&GROUP_MASK], nameChoice, otherName)) { static_cast(context)->code = start; @@ -1075,8 +1245,9 @@ enumAlgNames(AlgorithmicRange *range, * It returns 0xffff otherwise. */ static UChar32 -findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *otherName) { +findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, CharacterNameQuery& query) { UChar32 code; + auto matcher = query.matcher(); if(nameChoice!=U_UNICODE_CHAR_NAME && nameChoice!=U_EXTENDED_CHAR_NAME) { return 0xffff; @@ -1086,22 +1257,15 @@ findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *oth case 0: { /* name = prefix hex-digits */ const char* s = reinterpret_cast(range + 1); - char c; - - uint16_t i, count; /* compare prefix */ - while((c=*s++)!=0) { - if (c != *otherName++) { - return 0xffff; - } + if (!matcher.consistentWith(s)) { + return 0xffff; } /* read hexadecimal code point value */ - count=range->variant; code=0; - for(i=0; istart <= static_cast(code) && static_cast(code) <= range->end) { + if (range->start <= static_cast(code) && static_cast(code) <= range->end) { return code; } break; @@ -1123,30 +1287,32 @@ findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *oth const char *elementBases[8], *elements[8]; const uint16_t* factors = reinterpret_cast(range + 1); uint16_t count=range->variant; - const char *s = reinterpret_cast(factors + count), *t; + const char *s = reinterpret_cast(factors + count); UChar32 start, limit; uint16_t i, idx; - char c; - /* name = prefix factorized-elements */ /* compare prefix */ - while((c=*s++)!=0) { - if (c != *otherName++) { - return 0xffff; - } + std::string_view prefix = s; + if (!matcher.consistentWith(prefix)) { + return 0xffff; } + s += prefix.length() + 1; + start = static_cast(range->start); limit = static_cast(range->end + 1); - + + // This implementation assumes that the suffix does not contain SPACEs nor HYPHEN-MINUSes, + // which is the case in practice for the names of Hangul syllables. + std::string_view querySuffix = matcher.remainingSignificantCharacters(); /* initialize the suffix elements for enumeration; indexes should all be set to 0 */ writeFactorSuffix(factors, count, s, 0, indexes, elementBases, elements, buffer, sizeof(buffer)); /* compare the first suffix */ - if(0==uprv_strcmp(otherName, buffer)) { + if(querySuffix == buffer) { return start; } @@ -1171,17 +1337,18 @@ findAlgName(AlgorithmicRange *range, UCharNameChoice nameChoice, const char *oth } /* to make matters a little easier, just compare all elements of the suffix */ - t=otherName; + auto it = querySuffix.begin(); for(i=0; i') { // Parse a string like "" where HHHH is a hex code point. @@ -1609,12 +1777,15 @@ u_charFromName(UCharNameChoice nameChoice, return error; } + // From now on we do UAX44 matching. + CharacterNameQuery query(name); + /* try algorithmic names now */ p=(uint32_t *)((uint8_t *)uCharNames+uCharNames->algNamesOffset); i=*p; algRange=(AlgorithmicRange *)(p+1); while(i>0) { - if((cp=findAlgName(algRange, nameChoice, upper))!=0xffff) { + if((cp=findAlgName(algRange, nameChoice, query))!=0xffff) { return cp; } algRange=(AlgorithmicRange *)((uint8_t *)algRange+algRange->size); @@ -1622,7 +1793,7 @@ u_charFromName(UCharNameChoice nameChoice, } /* normal character name */ - findName.otherName=upper; + findName.otherName=&query; findName.code=error; enumNames(uCharNames, 0, UCHAR_MAX_VALUE + 1, DO_FIND_NAME, &findName, nameChoice); if (findName.code == error) { diff --git a/deps/icu-small/source/common/unicode/appendable.h b/deps/icu-small/source/common/unicode/appendable.h index 0e37f4562a58..520ccc8ef0ff 100644 --- a/deps/icu-small/source/common/unicode/appendable.h +++ b/deps/icu-small/source/common/unicode/appendable.h @@ -141,10 +141,11 @@ class U_COMMON_API Appendable : public UObject { * @return a buffer with *resultCapacity>=minCapacity * @stable ICU 4.8 */ - virtual char16_t *getAppendBuffer(int32_t minCapacity, - int32_t desiredCapacityHint, - char16_t *scratch, int32_t scratchCapacity, - int32_t *resultCapacity); + virtual char16_t* getAppendBuffer(int32_t minCapacity, + int32_t desiredCapacityHint, + char16_t* scratch U_LIFETIME_BOUND, + int32_t scratchCapacity, + int32_t* resultCapacity) U_LIFETIME_BOUND; }; /** @@ -223,10 +224,10 @@ class U_COMMON_API UnicodeStringAppendable : public Appendable { * @return a buffer with *resultCapacity>=minCapacity * @stable ICU 4.8 */ - virtual char16_t *getAppendBuffer(int32_t minCapacity, - int32_t desiredCapacityHint, - char16_t *scratch, int32_t scratchCapacity, - int32_t *resultCapacity) override; + virtual char16_t* getAppendBuffer(int32_t minCapacity, + int32_t desiredCapacityHint, + char16_t* scratch U_LIFETIME_BOUND, int32_t scratchCapacity, + int32_t* resultCapacity) U_LIFETIME_BOUND override; private: UnicodeString &str; diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index 088592b873e5..8be80dc6d98b 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -152,7 +152,7 @@ class U_COMMON_API_CLASS BreakIterator : public UObject { * Return a CharacterIterator over the text being analyzed. * @stable ICU 2.0 */ - U_COMMON_API virtual CharacterIterator& getText() const = 0; + U_COMMON_API virtual CharacterIterator& getText() const U_LIFETIME_BOUND = 0; /** * Get a UText for the text being analyzed. @@ -168,7 +168,7 @@ class U_COMMON_API_CLASS BreakIterator : public UObject { * UText was provided, it will always be returned. * @stable ICU 3.4 */ - U_COMMON_API virtual UText* getUText(UText* fillIn, UErrorCode& status) const = 0; + U_COMMON_API virtual UText* getUText(UText* fillIn U_LIFETIME_BOUND, UErrorCode& status) const = 0; /** * Change the text over which this operates. The text boundary is @@ -483,9 +483,10 @@ class U_COMMON_API_CLASS BreakIterator : public UObject { * @return user-displayable name * @stable ICU 2.0 */ - U_COMMON_API static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, - const Locale& displayLocale, - UnicodeString& name); + U_COMMON_API static UnicodeString& U_EXPORT2 + getDisplayName(const Locale& objectLocale, + const Locale& displayLocale, + UnicodeString& name U_LIFETIME_BOUND); /** * Get name of the object for the desired Locale, in the language of the @@ -495,8 +496,9 @@ class U_COMMON_API_CLASS BreakIterator : public UObject { * @return user-displayable name * @stable ICU 2.0 */ - U_COMMON_API static UnicodeString& U_EXPORT2 getDisplayName(const Locale& objectLocale, - UnicodeString& name); + U_COMMON_API static UnicodeString& U_EXPORT2 + getDisplayName(const Locale& objectLocale, + UnicodeString& name U_LIFETIME_BOUND); #ifndef U_FORCE_HIDE_DEPRECATED_API /** @@ -593,7 +595,8 @@ class U_COMMON_API_CLASS BreakIterator : public UObject { * @return the locale * @internal */ - U_COMMON_API const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const; + U_COMMON_API const char* getLocaleID(ULocDataLocaleType type, + UErrorCode& status) const U_LIFETIME_BOUND; #endif /* U_HIDE_INTERNAL_API */ /** @@ -621,7 +624,8 @@ class U_COMMON_API_CLASS BreakIterator : public UObject { * * @stable ICU 49 */ - U_COMMON_API virtual BreakIterator& refreshInputText(UText* input, UErrorCode& status) = 0; + U_COMMON_API virtual BreakIterator& refreshInputText(UText* input, + UErrorCode& status) U_LIFETIME_BOUND = 0; private: static BreakIterator* buildInstance(const Locale& loc, const char *type, UErrorCode& status); @@ -642,7 +646,7 @@ class U_COMMON_API_CLASS BreakIterator : public UObject { /** @internal */ U_COMMON_API BreakIterator(const Locale& valid, const Locale& actual); /** @internal. Assignment Operator, used by RuleBasedBreakIterator. */ - U_COMMON_API BreakIterator& operator=(const BreakIterator& other); + U_COMMON_API BreakIterator& operator=(const BreakIterator& other) U_LIFETIME_BOUND; #endif /* U_HIDE_INTERNAL_API */ private: diff --git a/deps/icu-small/source/common/unicode/bytestream.h b/deps/icu-small/source/common/unicode/bytestream.h index 224899b9567d..b6dbe60e83d6 100644 --- a/deps/icu-small/source/common/unicode/bytestream.h +++ b/deps/icu-small/source/common/unicode/bytestream.h @@ -149,8 +149,9 @@ class U_COMMON_API ByteSink : public UMemory { */ virtual char* GetAppendBuffer(int32_t min_capacity, int32_t desired_capacity_hint, - char* scratch, int32_t scratch_capacity, - int32_t* result_capacity); + char* scratch U_LIFETIME_BOUND, + int32_t scratch_capacity, + int32_t* result_capacity) U_LIFETIME_BOUND; /** * Flush internal buffers. @@ -201,7 +202,7 @@ class U_COMMON_API CheckedArrayByteSink : public ByteSink { * @return *this * @stable ICU 4.6 */ - virtual CheckedArrayByteSink& Reset(); + virtual CheckedArrayByteSink& Reset() U_LIFETIME_BOUND; /** * Append "bytes[0,n-1]" to this. * @param bytes the pointer to the bytes @@ -225,8 +226,9 @@ class U_COMMON_API CheckedArrayByteSink : public ByteSink { */ virtual char* GetAppendBuffer(int32_t min_capacity, int32_t desired_capacity_hint, - char* scratch, int32_t scratch_capacity, - int32_t* result_capacity) override; + char* scratch U_LIFETIME_BOUND, + int32_t scratch_capacity, + int32_t* result_capacity) U_LIFETIME_BOUND override; /** * Returns the number of bytes actually written to the sink. * @return number of bytes written to the buffer diff --git a/deps/icu-small/source/common/unicode/bytestrie.h b/deps/icu-small/source/common/unicode/bytestrie.h index c07dfada941e..81a959dce3ce 100644 --- a/deps/icu-small/source/common/unicode/bytestrie.h +++ b/deps/icu-small/source/common/unicode/bytestrie.h @@ -68,7 +68,7 @@ class U_COMMON_API BytesTrie : public UMemory { * @param trieBytes The byte array that contains the serialized trie. * @stable ICU 4.8 */ - BytesTrie(const void *trieBytes) + BytesTrie(const void* trieBytes U_LIFETIME_BOUND) : ownedArray_(nullptr), bytes_(static_cast(trieBytes)), pos_(bytes_), remainingMatchLength_(-1) {} @@ -93,7 +93,7 @@ class U_COMMON_API BytesTrie : public UMemory { * @return *this * @stable ICU 4.8 */ - BytesTrie &reset() { + BytesTrie& reset() U_LIFETIME_BOUND { pos_=bytes_; remainingMatchLength_=-1; return *this; @@ -126,7 +126,7 @@ class U_COMMON_API BytesTrie : public UMemory { * @see reset * @stable ICU 65 */ - BytesTrie &resetToState64(uint64_t state) { + BytesTrie& resetToState64(uint64_t state) U_LIFETIME_BOUND { remainingMatchLength_ = static_cast(state >> kState64RemainingShift) - 2; pos_ = bytes_ + (state & kState64PosMask); return *this; @@ -159,7 +159,7 @@ class U_COMMON_API BytesTrie : public UMemory { * @see resetToState * @stable ICU 4.8 */ - const BytesTrie &saveState(State &state) const { + const BytesTrie& saveState(State& state) const U_LIFETIME_BOUND { state.bytes=bytes_; state.pos=pos_; state.remainingMatchLength=remainingMatchLength_; @@ -176,7 +176,7 @@ class U_COMMON_API BytesTrie : public UMemory { * @see reset * @stable ICU 4.8 */ - BytesTrie &resetToState(const State &state) { + BytesTrie& resetToState(const State& state) U_LIFETIME_BOUND { if(bytes_==state.bytes && bytes_!=nullptr) { pos_=state.pos; remainingMatchLength_=state.remainingMatchLength; @@ -292,7 +292,9 @@ class U_COMMON_API BytesTrie : public UMemory { * function chaining. (See User Guide for details.) * @stable ICU 4.8 */ - Iterator(const void *trieBytes, int32_t maxStringLength, UErrorCode &errorCode); + Iterator(const void* trieBytes U_LIFETIME_BOUND, + int32_t maxStringLength, + UErrorCode& errorCode); /** * Iterates from the current state of the specified BytesTrie. @@ -318,7 +320,7 @@ class U_COMMON_API BytesTrie : public UMemory { * @return *this * @stable ICU 4.8 */ - Iterator &reset(); + Iterator& reset() U_LIFETIME_BOUND; /** * @return true if there are more elements. @@ -346,7 +348,7 @@ class U_COMMON_API BytesTrie : public UMemory { * @return The NUL-terminated byte sequence for the last successful next(). * @stable ICU 4.8 */ - StringPiece getString() const; + StringPiece getString() const U_LIFETIME_BOUND; /** * @return The value for the last successful next(). * @stable ICU 4.8 @@ -356,7 +358,9 @@ class U_COMMON_API BytesTrie : public UMemory { private: UBool truncateAndStop(); - const uint8_t *branchNext(const uint8_t *pos, int32_t length, UErrorCode &errorCode); + const uint8_t* branchNext(const uint8_t* pos U_LIFETIME_BOUND, + int32_t length, + UErrorCode& errorCode); const uint8_t *bytes_; const uint8_t *pos_; @@ -403,7 +407,7 @@ class U_COMMON_API BytesTrie : public UMemory { // Reads a compact 32-bit integer. // pos is already after the leadByte, and the lead byte is already shifted right by 1. static int32_t readValue(const uint8_t *pos, int32_t leadByte); - static inline const uint8_t *skipValue(const uint8_t *pos, int32_t leadByte) { + static inline const uint8_t* skipValue(const uint8_t* pos U_LIFETIME_BOUND, int32_t leadByte) { // U_ASSERT(leadByte>=kMinValueLead); if(leadByte>=(kMinTwoByteValueLead<<1)) { if(leadByte<(kMinThreeByteValueLead<<1)) { @@ -416,15 +420,15 @@ class U_COMMON_API BytesTrie : public UMemory { } return pos; } - static inline const uint8_t *skipValue(const uint8_t *pos) { + static inline const uint8_t* skipValue(const uint8_t* pos U_LIFETIME_BOUND) { int32_t leadByte=*pos++; return skipValue(pos, leadByte); } // Reads a jump delta and jumps. - static const uint8_t *jumpByDelta(const uint8_t *pos); + static const uint8_t* jumpByDelta(const uint8_t* pos U_LIFETIME_BOUND); - static inline const uint8_t *skipDelta(const uint8_t *pos) { + static inline const uint8_t* skipDelta(const uint8_t* pos U_LIFETIME_BOUND) { int32_t delta=*pos++; if(delta>=kMinTwoByteDeltaLead) { if(delta>> -inline const char16_t *uprv_char16PtrFromUChar(const T *p) { +template >> +inline const char16_t* uprv_char16PtrFromUChar(const T* p U_LIFETIME_BOUND) { if constexpr (std::is_same_v) { return p; } else { @@ -285,7 +285,7 @@ inline const char16_t *uprv_char16PtrFromUChar(const T *p) { } #if !U_CHAR16_IS_TYPEDEF && (!defined(_LIBCPP_VERSION) || _LIBCPP_VERSION < 180000) /** @internal */ -inline const char16_t *uprv_char16PtrFromUint16(const uint16_t *p) { +inline const char16_t* uprv_char16PtrFromUint16(const uint16_t* p U_LIFETIME_BOUND) { #if U_SHOW_CPLUSPLUS_API return ConstChar16Ptr(p).get(); #else @@ -298,7 +298,7 @@ inline const char16_t *uprv_char16PtrFromUint16(const uint16_t *p) { #endif #if U_SIZEOF_WCHAR_T==2 /** @internal */ -inline const char16_t *uprv_char16PtrFromWchar(const wchar_t *p) { +inline const char16_t* uprv_char16PtrFromWchar(const wchar_t* p U_LIFETIME_BOUND) { #if U_SHOW_CPLUSPLUS_API return ConstChar16Ptr(p).get(); #else @@ -318,7 +318,7 @@ inline const char16_t *uprv_char16PtrFromWchar(const wchar_t *p) { * @return p as const UChar * * @stable ICU 59 */ -inline const UChar *toUCharPtr(const char16_t *p) { +inline const UChar* toUCharPtr(const char16_t* p U_LIFETIME_BOUND) { #ifdef U_ALIASING_BARRIER U_ALIASING_BARRIER(p); #endif @@ -332,7 +332,7 @@ inline const UChar *toUCharPtr(const char16_t *p) { * @return p as UChar * * @stable ICU 59 */ -inline UChar *toUCharPtr(char16_t *p) { +inline UChar* toUCharPtr(char16_t* p U_LIFETIME_BOUND) { #ifdef U_ALIASING_BARRIER U_ALIASING_BARRIER(p); #endif @@ -346,7 +346,7 @@ inline UChar *toUCharPtr(char16_t *p) { * @return p as const OldUChar * * @stable ICU 59 */ -inline const OldUChar *toOldUCharPtr(const char16_t *p) { +inline const OldUChar* toOldUCharPtr(const char16_t* p U_LIFETIME_BOUND) { #ifdef U_ALIASING_BARRIER U_ALIASING_BARRIER(p); #endif @@ -360,7 +360,7 @@ inline const OldUChar *toOldUCharPtr(const char16_t *p) { * @return p as OldUChar * * @stable ICU 59 */ -inline OldUChar *toOldUCharPtr(char16_t *p) { +inline OldUChar* toOldUCharPtr(char16_t* p U_LIFETIME_BOUND) { #ifdef U_ALIASING_BARRIER U_ALIASING_BARRIER(p); #endif @@ -397,7 +397,7 @@ namespace internal { * Pass-through overload. * @internal */ -inline std::u16string_view toU16StringView(std::u16string_view sv) { return sv; } +inline std::u16string_view toU16StringView(std::u16string_view sv U_LIFETIME_BOUND) { return sv; } #if !U_CHAR16_IS_TYPEDEF && (!defined(_LIBCPP_VERSION) || _LIBCPP_VERSION < 180000) /** @@ -405,7 +405,7 @@ inline std::u16string_view toU16StringView(std::u16string_view sv) { return sv; * from std::basic_string_view to std::u16string_view. * @internal */ -inline std::u16string_view toU16StringView(std::basic_string_view sv) { +inline std::u16string_view toU16StringView(std::basic_string_view sv U_LIFETIME_BOUND) { return { ConstChar16Ptr(sv.data()), sv.length() }; } #endif @@ -416,7 +416,7 @@ inline std::u16string_view toU16StringView(std::basic_string_view sv) * from std::wstring_view to std::u16string_view. * @internal */ -inline std::u16string_view toU16StringView(std::wstring_view sv) { +inline std::u16string_view toU16StringView(std::wstring_view sv U_LIFETIME_BOUND) { return { ConstChar16Ptr(sv.data()), sv.length() }; } #endif @@ -427,7 +427,7 @@ inline std::u16string_view toU16StringView(std::wstring_view sv) { */ template >>> -inline std::u16string_view toU16StringViewNullable(const T& text) { +inline std::u16string_view toU16StringViewNullable(const T& text U_LIFETIME_BOUND) { return toU16StringView(text); } @@ -438,7 +438,7 @@ inline std::u16string_view toU16StringViewNullable(const T& text) { template >>, typename = void> -inline std::u16string_view toU16StringViewNullable(const T& text) { +inline std::u16string_view toU16StringViewNullable(const T& text U_LIFETIME_BOUND) { if (text == nullptr) return {}; // For backward compatibility. return toU16StringView(text); } diff --git a/deps/icu-small/source/common/unicode/chariter.h b/deps/icu-small/source/common/unicode/chariter.h index 411825677fd5..506358dbc729 100644 --- a/deps/icu-small/source/common/unicode/chariter.h +++ b/deps/icu-small/source/common/unicode/chariter.h @@ -186,7 +186,9 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * Assignment operator to be overridden in the implementing class. * @stable ICU 2.0 */ - ForwardCharacterIterator &operator=(const ForwardCharacterIterator&) { return *this; } + ForwardCharacterIterator& operator=(const ForwardCharacterIterator&) U_LIFETIME_BOUND { + return *this; + } }; /** @@ -664,7 +666,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator { * @return the newly set CharacterIterator. * @stable ICU 2.0 */ - CharacterIterator &operator=(const CharacterIterator &that); + CharacterIterator& operator=(const CharacterIterator& that) U_LIFETIME_BOUND; /** * Base class text length field. diff --git a/deps/icu-small/source/common/unicode/dtintrv.h b/deps/icu-small/source/common/unicode/dtintrv.h index 1fd0ba5deee9..7dcaae3dd6ba 100644 --- a/deps/icu-small/source/common/unicode/dtintrv.h +++ b/deps/icu-small/source/common/unicode/dtintrv.h @@ -101,7 +101,7 @@ class U_COMMON_API DateInterval : public UObject { * Default assignment operator * @stable ICU 4.0 */ - DateInterval& operator=(const DateInterval&); + DateInterval& operator=(const DateInterval&) U_LIFETIME_BOUND; /** * Equality operator. diff --git a/deps/icu-small/source/common/unicode/edits.h b/deps/icu-small/source/common/unicode/edits.h index bc3c9438222d..05c4ecb36083 100644 --- a/deps/icu-small/source/common/unicode/edits.h +++ b/deps/icu-small/source/common/unicode/edits.h @@ -122,7 +122,7 @@ class U_COMMON_API Edits final : public UMemory { * @return *this * @stable ICU 60 */ - Edits &operator=(const Edits &other); + Edits& operator=(const Edits& other) U_LIFETIME_BOUND; /** * Move assignment operator, might leave src empty. @@ -132,7 +132,7 @@ class U_COMMON_API Edits final : public UMemory { * @return *this * @stable ICU 60 */ - Edits &operator=(Edits &&src) noexcept; + Edits& operator=(Edits&& src) noexcept U_LIFETIME_BOUND; /** * Resets the data but may not release memory. @@ -219,7 +219,7 @@ class U_COMMON_API Edits final : public UMemory { * Assignment operator. * @stable ICU 59 */ - Iterator &operator=(const Iterator &other) = default; + Iterator& operator=(const Iterator& other) U_LIFETIME_BOUND = default; /** * Advances the iterator to the next edit. @@ -397,13 +397,13 @@ class U_COMMON_API Edits final : public UMemory { * should not depend on the contents of the return string. * @internal */ - UnicodeString& toString(UnicodeString& appendTo) const; + UnicodeString& toString(UnicodeString& appendTo U_LIFETIME_BOUND) const; #endif // U_HIDE_INTERNAL_API private: friend class Edits; - Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs); + Iterator(const uint16_t* a U_LIFETIME_BOUND, int32_t len, UBool oc, UBool crs); int32_t readLength(int32_t head); void updateNextIndexes(); @@ -435,7 +435,7 @@ class U_COMMON_API Edits final : public UMemory { * @return an Iterator that merges adjacent changes. * @stable ICU 59 */ - Iterator getCoarseChangesIterator() const { + Iterator getCoarseChangesIterator() const U_LIFETIME_BOUND { return Iterator(array, length, true, true); } @@ -447,7 +447,7 @@ class U_COMMON_API Edits final : public UMemory { * @return an Iterator that merges adjacent changes. * @stable ICU 59 */ - Iterator getCoarseIterator() const { + Iterator getCoarseIterator() const U_LIFETIME_BOUND { return Iterator(array, length, false, true); } @@ -459,7 +459,7 @@ class U_COMMON_API Edits final : public UMemory { * @return an Iterator that separates adjacent changes. * @stable ICU 59 */ - Iterator getFineChangesIterator() const { + Iterator getFineChangesIterator() const U_LIFETIME_BOUND { return Iterator(array, length, true, false); } @@ -470,7 +470,7 @@ class U_COMMON_API Edits final : public UMemory { * @return an Iterator that separates adjacent changes. * @stable ICU 59 */ - Iterator getFineIterator() const { + Iterator getFineIterator() const U_LIFETIME_BOUND { return Iterator(array, length, false, false); } @@ -501,12 +501,12 @@ class U_COMMON_API Edits final : public UMemory { * @return *this, with the merged edits appended * @stable ICU 60 */ - Edits &mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &errorCode); + Edits& mergeAndAppend(const Edits& ab, const Edits& bc, UErrorCode& errorCode) U_LIFETIME_BOUND; private: void releaseArray() noexcept; - Edits ©Array(const Edits &other); - Edits &moveArray(Edits &src) noexcept; + Edits& copyArray(const Edits& other) U_LIFETIME_BOUND; + Edits& moveArray(Edits& src) noexcept U_LIFETIME_BOUND; void setLastUnit(int32_t last) { array[length - 1] = static_cast(last); } int32_t lastUnit() const { return length > 0 ? array[length - 1] : 0xffff; } diff --git a/deps/icu-small/source/common/unicode/enumset.h b/deps/icu-small/source/common/unicode/enumset.h index bde8c455c0dd..c5731999e34c 100644 --- a/deps/icu-small/source/common/unicode/enumset.h +++ b/deps/icu-small/source/common/unicode/enumset.h @@ -45,7 +45,8 @@ class EnumSet { inline int32_t get(T toCheck) const { return (fBools & flag(toCheck))?1:0; } inline UBool isValidEnum(T toCheck) const { return (toCheck>=minValue&&toCheck& operator=(const EnumSet& other) { + inline const EnumSet& + operator=(const EnumSet& other) U_LIFETIME_BOUND { fBools = other.fBools; return *this; } diff --git a/deps/icu-small/source/common/unicode/errorcode.h b/deps/icu-small/source/common/unicode/errorcode.h index fe7b5183232c..ee3cff6298f1 100644 --- a/deps/icu-small/source/common/unicode/errorcode.h +++ b/deps/icu-small/source/common/unicode/errorcode.h @@ -91,9 +91,9 @@ class U_COMMON_API ErrorCode: public UMemory { /** Destructor, does nothing. See class documentation for details. @stable ICU 4.2 */ virtual ~ErrorCode(); /** Conversion operator, returns a reference. @stable ICU 4.2 */ - operator UErrorCode & () { return errorCode; } + operator UErrorCode&() U_LIFETIME_BOUND { return errorCode; } /** Conversion operator, returns a pointer. @stable ICU 4.2 */ - operator UErrorCode * () { return &errorCode; } + operator UErrorCode*() U_LIFETIME_BOUND { return &errorCode; } /** Tests for U_SUCCESS(). @stable ICU 4.2 */ UBool isSuccess() const { return U_SUCCESS(errorCode); } /** Tests for U_FAILURE(). @stable ICU 4.2 */ diff --git a/deps/icu-small/source/common/unicode/icuplug.h b/deps/icu-small/source/common/unicode/icuplug.h index c787fcd42664..017b8036dbf9 100644 --- a/deps/icu-small/source/common/unicode/icuplug.h +++ b/deps/icu-small/source/common/unicode/icuplug.h @@ -266,8 +266,8 @@ uplug_setPlugName(UPlugData *plug, const char *name); * @return the name of this plugin * @internal ICU 4.4 Technology Preview */ -U_CAPI const char * U_EXPORT2 -uplug_getPlugName(UPlugData *plug); +U_CAPI const char* U_EXPORT2 +uplug_getPlugName(UPlugData* plug U_LIFETIME_BOUND); /** * Return the symbol name for this plugin, if known. @@ -275,8 +275,8 @@ uplug_getPlugName(UPlugData *plug); * @return the symbol name, or NULL * @internal ICU 4.4 Technology Preview */ -U_CAPI const char * U_EXPORT2 -uplug_getSymbolName(UPlugData *plug); +U_CAPI const char* U_EXPORT2 +uplug_getSymbolName(UPlugData* plug U_LIFETIME_BOUND); /** * Return the library name for this plugin, if known. @@ -285,8 +285,8 @@ uplug_getSymbolName(UPlugData *plug); * @return the library name, or NULL * @internal ICU 4.4 Technology Preview */ -U_CAPI const char * U_EXPORT2 -uplug_getLibraryName(UPlugData *plug, UErrorCode *status); +U_CAPI const char* U_EXPORT2 +uplug_getLibraryName(UPlugData* plug U_LIFETIME_BOUND, UErrorCode* status); /** * Return the library used for this plugin, if known. @@ -324,8 +324,8 @@ uplug_setContext(UPlugData *plug, void *context); * @return configuration string, or else null. * @internal ICU 4.4 Technology Preview */ -U_CAPI const char * U_EXPORT2 -uplug_getConfiguration(UPlugData *plug); +U_CAPI const char* U_EXPORT2 +uplug_getConfiguration(UPlugData* plug U_LIFETIME_BOUND); /** * Return all currently installed plugins, from newest to oldest diff --git a/deps/icu-small/source/common/unicode/idna.h b/deps/icu-small/source/common/unicode/idna.h index 1e36fa771f06..d695e1a09d29 100644 --- a/deps/icu-small/source/common/unicode/idna.h +++ b/deps/icu-small/source/common/unicode/idna.h @@ -116,9 +116,11 @@ class U_COMMON_API IDNA : public UObject { * @return dest * @stable ICU 4.6 */ - virtual UnicodeString & - labelToASCII(const UnicodeString &label, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const = 0; + virtual UnicodeString& + labelToASCII(const UnicodeString& label, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const = 0; /** * Converts a single domain name label into its Unicode form for human-readable display. @@ -138,9 +140,11 @@ class U_COMMON_API IDNA : public UObject { * @return dest * @stable ICU 4.6 */ - virtual UnicodeString & - labelToUnicode(const UnicodeString &label, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const = 0; + virtual UnicodeString& + labelToUnicode(const UnicodeString& label, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const = 0; /** * Converts a whole domain name into its ASCII form for DNS lookup. @@ -162,9 +166,11 @@ class U_COMMON_API IDNA : public UObject { * @return dest * @stable ICU 4.6 */ - virtual UnicodeString & - nameToASCII(const UnicodeString &name, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const = 0; + virtual UnicodeString& + nameToASCII(const UnicodeString& name, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const = 0; /** * Converts a whole domain name into its Unicode form for human-readable display. @@ -184,9 +190,11 @@ class U_COMMON_API IDNA : public UObject { * @return dest * @stable ICU 4.6 */ - virtual UnicodeString & - nameToUnicode(const UnicodeString &name, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const = 0; + virtual UnicodeString& + nameToUnicode(const UnicodeString& name, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const = 0; // UTF-8 versions of the processing methods ---------------------------- *** @@ -201,7 +209,6 @@ class U_COMMON_API IDNA : public UObject { * pass the U_SUCCESS() test, or else the function returns * immediately. Check for U_FAILURE() on output or use with * function chaining. (See User Guide for details.) - * @return dest * @stable ICU 4.6 */ virtual void @@ -219,7 +226,6 @@ class U_COMMON_API IDNA : public UObject { * pass the U_SUCCESS() test, or else the function returns * immediately. Check for U_FAILURE() on output or use with * function chaining. (See User Guide for details.) - * @return dest * @stable ICU 4.6 */ virtual void @@ -237,7 +243,6 @@ class U_COMMON_API IDNA : public UObject { * pass the U_SUCCESS() test, or else the function returns * immediately. Check for U_FAILURE() on output or use with * function chaining. (See User Guide for details.) - * @return dest * @stable ICU 4.6 */ virtual void @@ -255,7 +260,6 @@ class U_COMMON_API IDNA : public UObject { * pass the U_SUCCESS() test, or else the function returns * immediately. Check for U_FAILURE() on output or use with * function chaining. (See User Guide for details.) - * @return dest * @stable ICU 4.6 */ virtual void diff --git a/deps/icu-small/source/common/unicode/localebuilder.h b/deps/icu-small/source/common/unicode/localebuilder.h index a58edf8de633..c3a66dfd5967 100644 --- a/deps/icu-small/source/common/unicode/localebuilder.h +++ b/deps/icu-small/source/common/unicode/localebuilder.h @@ -87,7 +87,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * * @stable ICU 64 */ - LocaleBuilder& setLocale(const Locale& locale); + LocaleBuilder& setLocale(const Locale& locale) U_LIFETIME_BOUND; /** * Resets the LocaleBuilder to match the provided IETF BCP 47 language tag. @@ -104,7 +104,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return This builder. * @stable ICU 64 */ - LocaleBuilder& setLanguageTag(StringPiece tag); + LocaleBuilder& setLanguageTag(StringPiece tag) U_LIFETIME_BOUND; /** * Sets the language. If language is the empty string, the @@ -119,7 +119,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return This builder. * @stable ICU 64 */ - LocaleBuilder& setLanguage(StringPiece language); + LocaleBuilder& setLanguage(StringPiece language) U_LIFETIME_BOUND; /** * Sets the script. If script is the empty string, the script in @@ -135,7 +135,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return This builder. * @stable ICU 64 */ - LocaleBuilder& setScript(StringPiece script); + LocaleBuilder& setScript(StringPiece script) U_LIFETIME_BOUND; /** * Sets the region. If region is the empty string, the region in this @@ -154,7 +154,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return This builder. * @stable ICU 64 */ - LocaleBuilder& setRegion(StringPiece region); + LocaleBuilder& setRegion(StringPiece region) U_LIFETIME_BOUND; /** * Sets the variant. If variant is the empty string, the variant in this @@ -175,7 +175,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return This builder. * @stable ICU 64 */ - LocaleBuilder& setVariant(StringPiece variant); + LocaleBuilder& setVariant(StringPiece variant) U_LIFETIME_BOUND; /** * Sets the extension for the given key. If the value is the empty string, @@ -196,7 +196,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return This builder. * @stable ICU 64 */ - LocaleBuilder& setExtension(char key, StringPiece value); + LocaleBuilder& setExtension(char key, StringPiece value) U_LIFETIME_BOUND; /** * Sets the Unicode locale keyword type for the given key. If the type @@ -216,8 +216,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return This builder. * @stable ICU 64 */ - LocaleBuilder& setUnicodeLocaleKeyword( - StringPiece key, StringPiece type); + LocaleBuilder& setUnicodeLocaleKeyword(StringPiece key, StringPiece type) U_LIFETIME_BOUND; /** * Adds a unicode locale attribute, if not already present, otherwise @@ -229,7 +228,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return This builder. * @stable ICU 64 */ - LocaleBuilder& addUnicodeLocaleAttribute(StringPiece attribute); + LocaleBuilder& addUnicodeLocaleAttribute(StringPiece attribute) U_LIFETIME_BOUND; /** * Removes a unicode locale attribute, if present, otherwise has no @@ -242,7 +241,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return This builder. * @stable ICU 64 */ - LocaleBuilder& removeUnicodeLocaleAttribute(StringPiece attribute); + LocaleBuilder& removeUnicodeLocaleAttribute(StringPiece attribute) U_LIFETIME_BOUND; /** * Resets the builder to its initial, empty state. @@ -251,7 +250,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return this builder * @stable ICU 64 */ - LocaleBuilder& clear(); + LocaleBuilder& clear() U_LIFETIME_BOUND; /** * Resets the extensions to their initial, empty state. @@ -260,7 +259,7 @@ class U_COMMON_API LocaleBuilder : public UObject { * @return this builder * @stable ICU 64 */ - LocaleBuilder& clearExtensions(); + LocaleBuilder& clearExtensions() U_LIFETIME_BOUND; /** * Returns an instance of Locale created from the fields set diff --git a/deps/icu-small/source/common/unicode/localematcher.h b/deps/icu-small/source/common/unicode/localematcher.h index e16f1a31ca50..0cc8b2738e08 100644 --- a/deps/icu-small/source/common/unicode/localematcher.h +++ b/deps/icu-small/source/common/unicode/localematcher.h @@ -216,7 +216,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @param src Result to move contents from. * @stable ICU 65 */ - Result &operator=(Result &&src) noexcept; + Result& operator=(Result&& src) noexcept U_LIFETIME_BOUND; /** * Returns the best-matching desired locale. @@ -225,7 +225,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return the best-matching desired locale, or nullptr. * @stable ICU 65 */ - inline const Locale *getDesiredLocale() const { return desiredLocale; } + inline const Locale* getDesiredLocale() const U_LIFETIME_BOUND { return desiredLocale; } /** * Returns the best-matching supported locale. @@ -236,7 +236,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return the best-matching supported locale, or nullptr. * @stable ICU 65 */ - inline const Locale *getSupportedLocale() const { return supportedLocale; } + inline const Locale* getSupportedLocale() const U_LIFETIME_BOUND { return supportedLocale; } /** * Returns the index of the best-matching desired locale in the input Iterable order. @@ -303,7 +303,6 @@ class U_COMMON_API LocaleMatcher : public UMemory { /** * Constructs a builder used in chaining parameters for building a LocaleMatcher. * - * @return a new Builder object * @stable ICU 65 */ Builder() {} @@ -331,7 +330,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @param src Builder to move contents from. * @stable ICU 65 */ - Builder &operator=(Builder &&src) noexcept; + Builder& operator=(Builder&& src) noexcept U_LIFETIME_BOUND; /** * Parses an Accept-Language string @@ -344,7 +343,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 65 */ - Builder &setSupportedLocalesFromListString(StringPiece locales); + Builder& setSupportedLocalesFromListString(StringPiece locales) U_LIFETIME_BOUND; /** * Copies the supported locales, preserving iteration order. @@ -355,7 +354,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 65 */ - Builder &setSupportedLocales(Locale::Iterator &locales); + Builder& setSupportedLocales(Locale::Iterator& locales) U_LIFETIME_BOUND; /** * Copies the supported locales from the begin/end range, preserving iteration order. @@ -370,8 +369,8 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 65 */ - template - Builder &setSupportedLocales(Iter begin, Iter end) { + template + Builder& setSupportedLocales(Iter begin, Iter end) U_LIFETIME_BOUND { if (U_FAILURE(errorCode_)) { return *this; } clearSupportedLocales(); while (begin != end) { @@ -395,8 +394,9 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 65 */ - template - Builder &setSupportedLocalesViaConverter(Iter begin, Iter end, Conv converter) { + template + Builder& setSupportedLocalesViaConverter(Iter begin, Iter end, + Conv converter) U_LIFETIME_BOUND { if (U_FAILURE(errorCode_)) { return *this; } clearSupportedLocales(); while (begin != end) { @@ -413,7 +413,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 65 */ - Builder &addSupportedLocale(const Locale &locale); + Builder& addSupportedLocale(const Locale& locale) U_LIFETIME_BOUND; /** * Sets no default locale. @@ -423,7 +423,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * * @stable ICU 68 */ - Builder &setNoDefaultLocale(); + Builder& setNoDefaultLocale() U_LIFETIME_BOUND; /** * Sets the default locale; if nullptr, or if it is not set explicitly, @@ -435,7 +435,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 65 */ - Builder &setDefaultLocale(const Locale *defaultLocale); + Builder& setDefaultLocale(const Locale* defaultLocale) U_LIFETIME_BOUND; /** * If ULOCMATCH_FAVOR_SCRIPT, then the language differences are smaller than script @@ -447,7 +447,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 65 */ - Builder &setFavorSubtag(ULocMatchFavorSubtag subtag); + Builder& setFavorSubtag(ULocMatchFavorSubtag subtag) U_LIFETIME_BOUND; /** * Option for whether all desired locales are treated equally or @@ -457,7 +457,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 65 */ - Builder &setDemotionPerDesiredLocale(ULocMatchDemotion demotion); + Builder& setDemotionPerDesiredLocale(ULocMatchDemotion demotion) U_LIFETIME_BOUND; /** * Option for whether to include or ignore one-way (fallback) match data. @@ -467,7 +467,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 67 */ - Builder &setDirection(ULocMatchDirection matchDirection) { + Builder& setDirection(ULocMatchDirection matchDirection) U_LIFETIME_BOUND { if (U_SUCCESS(errorCode_)) { direction_ = matchDirection; } @@ -495,7 +495,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return this Builder object * @stable ICU 68 */ - Builder &setMaxDistance(const Locale &desired, const Locale &supported); + Builder& setMaxDistance(const Locale& desired, const Locale& supported) U_LIFETIME_BOUND; /** * Sets the UErrorCode if an error occurred while setting parameters. @@ -566,7 +566,7 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return *this * @stable ICU 65 */ - LocaleMatcher &operator=(LocaleMatcher &&src) noexcept; + LocaleMatcher& operator=(LocaleMatcher&& src) noexcept U_LIFETIME_BOUND; /** * Returns the supported locale which best matches the desired locale. @@ -578,7 +578,8 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return the best-matching supported locale. * @stable ICU 65 */ - const Locale *getBestMatch(const Locale &desiredLocale, UErrorCode &errorCode) const; + const Locale* getBestMatch(const Locale& desiredLocale, + UErrorCode& errorCode) const U_LIFETIME_BOUND; /** * Returns the supported locale which best matches one of the desired locales. @@ -590,7 +591,8 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return the best-matching supported locale. * @stable ICU 65 */ - const Locale *getBestMatch(Locale::Iterator &desiredLocales, UErrorCode &errorCode) const; + const Locale* getBestMatch(Locale::Iterator& desiredLocales, + UErrorCode& errorCode) const U_LIFETIME_BOUND; /** * Parses an Accept-Language string @@ -606,7 +608,8 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return the best-matching supported locale. * @stable ICU 65 */ - const Locale *getBestMatchForListString(StringPiece desiredLocaleList, UErrorCode &errorCode) const; + const Locale* getBestMatchForListString(StringPiece desiredLocaleList, + UErrorCode& errorCode) const U_LIFETIME_BOUND; /** * Returns the best match between the desired locale and the supported locales. @@ -620,7 +623,8 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return the best-matching pair of the desired and a supported locale. * @stable ICU 65 */ - Result getBestMatchResult(const Locale &desiredLocale, UErrorCode &errorCode) const; + Result getBestMatchResult(const Locale& desiredLocale U_LIFETIME_BOUND, + UErrorCode& errorCode) const U_LIFETIME_BOUND; /** * Returns the best match between the desired and supported locales. @@ -634,7 +638,8 @@ class U_COMMON_API LocaleMatcher : public UMemory { * @return the best-matching pair of a desired and a supported locale. * @stable ICU 65 */ - Result getBestMatchResult(Locale::Iterator &desiredLocales, UErrorCode &errorCode) const; + Result getBestMatchResult(Locale::Iterator& desiredLocales, + UErrorCode& errorCode) const U_LIFETIME_BOUND; /** * Returns true if the pair of locales matches acceptably. diff --git a/deps/icu-small/source/common/unicode/localpointer.h b/deps/icu-small/source/common/unicode/localpointer.h index 1803222d8d7a..a80654875394 100644 --- a/deps/icu-small/source/common/unicode/localpointer.h +++ b/deps/icu-small/source/common/unicode/localpointer.h @@ -117,19 +117,19 @@ class LocalPointerBase { * @return the pointer value * @stable ICU 4.4 */ - T *getAlias() const { return ptr; } + T* getAlias() const U_LIFETIME_BOUND { return ptr; } /** * Access without ownership change. * @return the pointer value as a reference * @stable ICU 4.4 */ - T &operator*() const { return *ptr; } + T& operator*() const U_LIFETIME_BOUND { return *ptr; } /** * Access without ownership change. * @return the pointer value * @stable ICU 4.4 */ - T *operator->() const { return ptr; } + T* operator->() const U_LIFETIME_BOUND { return ptr; } /** * Gives up ownership; the internal pointer becomes nullptr. * @return the pointer value; @@ -250,7 +250,7 @@ class LocalPointer : public LocalPointerBase { * @return *this * @stable ICU 56 */ - LocalPointer &operator=(LocalPointer &&src) noexcept { + LocalPointer& operator=(LocalPointer&& src) noexcept U_LIFETIME_BOUND { delete LocalPointerBase::ptr; LocalPointerBase::ptr=src.ptr; src.ptr=nullptr; @@ -265,7 +265,7 @@ class LocalPointer : public LocalPointerBase { * @return *this * @stable ICU 64 */ - LocalPointer &operator=(std::unique_ptr &&p) noexcept { + LocalPointer& operator=(std::unique_ptr&& p) noexcept U_LIFETIME_BOUND { adoptInstead(p.release()); return *this; } @@ -425,7 +425,7 @@ class LocalArray : public LocalPointerBase { * @return *this * @stable ICU 56 */ - LocalArray &operator=(LocalArray &&src) noexcept { + LocalArray& operator=(LocalArray&& src) noexcept U_LIFETIME_BOUND { delete[] LocalPointerBase::ptr; LocalPointerBase::ptr=src.ptr; src.ptr=nullptr; @@ -440,7 +440,7 @@ class LocalArray : public LocalPointerBase { * @return *this * @stable ICU 64 */ - LocalArray &operator=(std::unique_ptr &&p) noexcept { + LocalArray& operator=(std::unique_ptr&& p) noexcept U_LIFETIME_BOUND { adoptInstead(p.release()); return *this; } @@ -507,7 +507,7 @@ class LocalArray : public LocalPointerBase { * @return reference to the array item * @stable ICU 4.4 */ - T &operator[](ptrdiff_t i) const { return LocalPointerBase::ptr[i]; } + T& operator[](ptrdiff_t i) const U_LIFETIME_BOUND { return LocalPointerBase::ptr[i]; } /** * Conversion operator to a C++11 std::unique_ptr. @@ -571,14 +571,15 @@ class LocalOpenPointer : public LocalPointerBase { explicit LocalOpenPointer(std::unique_ptr &&p) : LocalPointerBase(p.release()) {} ~LocalOpenPointer() { if (ptr != nullptr) { closeFunction(ptr); } } - LocalOpenPointer &operator=(LocalOpenPointer &&src) noexcept { + LocalOpenPointer& operator=(LocalOpenPointer&& src) noexcept U_LIFETIME_BOUND { if (ptr != nullptr) { closeFunction(ptr); } LocalPointerBase::ptr=src.ptr; src.ptr=nullptr; return *this; } /* TODO: Be agnostic of the deleter function signature from the user-provided std::unique_ptr? */ - LocalOpenPointer &operator=(std::unique_ptr &&p) { + LocalOpenPointer& + operator=(std::unique_ptr&& p) U_LIFETIME_BOUND { adoptInstead(p.release()); return *this; } diff --git a/deps/icu-small/source/common/unicode/locdspnm.h b/deps/icu-small/source/common/unicode/locdspnm.h index 4f06f857044c..5febce2f7a9f 100644 --- a/deps/icu-small/source/common/unicode/locdspnm.h +++ b/deps/icu-small/source/common/unicode/locdspnm.h @@ -87,7 +87,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @return the display locale * @stable ICU 4.4 */ - virtual const Locale& getLocale() const = 0; + virtual const Locale& getLocale() const U_LIFETIME_BOUND = 0; /** * Returns the dialect handling used in the display names. @@ -113,7 +113,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @stable ICU 4.4 */ virtual UnicodeString& localeDisplayName(const Locale& locale, - UnicodeString& result) const = 0; + UnicodeString& result U_LIFETIME_BOUND) const = 0; /** * Returns the display name of the provided locale id. @@ -123,7 +123,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @stable ICU 4.4 */ virtual UnicodeString& localeDisplayName(const char* localeId, - UnicodeString& result) const = 0; + UnicodeString& result U_LIFETIME_BOUND) const = 0; // names for components of a locale id /** @@ -134,7 +134,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @stable ICU 4.4 */ virtual UnicodeString& languageDisplayName(const char* lang, - UnicodeString& result) const = 0; + UnicodeString& result U_LIFETIME_BOUND) const = 0; /** * Returns the display name of the provided script code. @@ -144,7 +144,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @stable ICU 4.4 */ virtual UnicodeString& scriptDisplayName(const char* script, - UnicodeString& result) const = 0; + UnicodeString& result U_LIFETIME_BOUND) const = 0; /** * Returns the display name of the provided script code. @@ -154,7 +154,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @stable ICU 4.4 */ virtual UnicodeString& scriptDisplayName(UScriptCode scriptCode, - UnicodeString& result) const = 0; + UnicodeString& result U_LIFETIME_BOUND) const = 0; /** * Returns the display name of the provided region code. @@ -164,7 +164,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @stable ICU 4.4 */ virtual UnicodeString& regionDisplayName(const char* region, - UnicodeString& result) const = 0; + UnicodeString& result U_LIFETIME_BOUND) const = 0; /** * Returns the display name of the provided variant. @@ -174,7 +174,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @stable ICU 4.4 */ virtual UnicodeString& variantDisplayName(const char* variant, - UnicodeString& result) const = 0; + UnicodeString& result U_LIFETIME_BOUND) const = 0; /** * Returns the display name of the provided locale key. @@ -184,7 +184,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @stable ICU 4.4 */ virtual UnicodeString& keyDisplayName(const char* key, - UnicodeString& result) const = 0; + UnicodeString& result U_LIFETIME_BOUND) const = 0; /** * Returns the display name of the provided value (used with the provided key). @@ -195,7 +195,7 @@ class U_COMMON_API LocaleDisplayNames : public UObject { * @stable ICU 4.4 */ virtual UnicodeString& keyValueDisplayName(const char* key, const char* value, - UnicodeString& result) const = 0; + UnicodeString& result U_LIFETIME_BOUND) const = 0; }; inline LocaleDisplayNames* LocaleDisplayNames::createInstance(const Locale& locale) { diff --git a/deps/icu-small/source/common/unicode/locid.h b/deps/icu-small/source/common/unicode/locid.h index e702ff9c582d..e331470d52cc 100644 --- a/deps/icu-small/source/common/unicode/locid.h +++ b/deps/icu-small/source/common/unicode/locid.h @@ -311,7 +311,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return *this * @stable ICU 2.0 */ - U_COMMON_API Locale& operator=(const Locale& other); + U_COMMON_API Locale& operator=(const Locale& other) U_LIFETIME_BOUND; /** * Move assignment operator; might leave source in bogus state. @@ -322,7 +322,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return *this * @stable ICU 63 */ - U_COMMON_API Locale& operator=(Locale&& other) noexcept; + U_COMMON_API Locale& operator=(Locale&& other) noexcept U_LIFETIME_BOUND; /** * Checks if two locale keys are the same. @@ -471,7 +471,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return An alias to the code * @stable ICU 2.0 */ - U_COMMON_API const char* getLanguage() const; + U_COMMON_API const char* getLanguage() const U_LIFETIME_BOUND; /** * Returns the locale's ISO-15924 abbreviation script code. @@ -480,21 +480,21 @@ class U_COMMON_API_CLASS Locale : public UObject { * @see uscript_getCode * @stable ICU 2.8 */ - U_COMMON_API const char* getScript() const; + U_COMMON_API const char* getScript() const U_LIFETIME_BOUND; /** * Returns the locale's ISO-3166 country code. * @return An alias to the code * @stable ICU 2.0 */ - U_COMMON_API const char* getCountry() const; + U_COMMON_API const char* getCountry() const U_LIFETIME_BOUND; /** * Returns the locale's variant code. * @return An alias to the code * @stable ICU 2.0 */ - U_COMMON_API const char* getVariant() const; + U_COMMON_API const char* getVariant() const U_LIFETIME_BOUND; /** * Returns the programmatic name of the entire locale, with the language, @@ -504,7 +504,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return A pointer to "name". * @stable ICU 2.0 */ - U_COMMON_API const char* getName() const; + U_COMMON_API const char* getName() const U_LIFETIME_BOUND; /** * Returns the programmatic name of the entire locale as getName() would return, @@ -513,7 +513,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @see getName * @stable ICU 2.8 */ - U_COMMON_API const char* getBaseName() const; + U_COMMON_API const char* getBaseName() const U_LIFETIME_BOUND; /** * Add the likely subtags for this Locale, per the algorithm described @@ -837,7 +837,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return A reference to "dispLang". * @stable ICU 2.0 */ - U_COMMON_API UnicodeString& getDisplayLanguage(UnicodeString& dispLang) const; + U_COMMON_API UnicodeString& getDisplayLanguage(UnicodeString& dispLang U_LIFETIME_BOUND) const; /** * Fills in "dispLang" with the name of this locale's language in a format suitable for @@ -853,7 +853,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @stable ICU 2.0 */ U_COMMON_API UnicodeString& getDisplayLanguage(const Locale& displayLocale, - UnicodeString& dispLang) const; + UnicodeString& dispLang U_LIFETIME_BOUND) const; /** * Fills in "dispScript" with the name of this locale's script in a format suitable @@ -864,7 +864,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return A reference to "dispScript". * @stable ICU 2.8 */ - U_COMMON_API UnicodeString& getDisplayScript(UnicodeString& dispScript) const; + U_COMMON_API UnicodeString& getDisplayScript(UnicodeString& dispScript U_LIFETIME_BOUND) const; /** * Fills in "dispScript" with the name of this locale's country in a format suitable @@ -881,7 +881,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @stable ICU 2.8 */ U_COMMON_API UnicodeString& getDisplayScript(const Locale& displayLocale, - UnicodeString& dispScript) const; + UnicodeString& dispScript U_LIFETIME_BOUND) const; /** * Fills in "dispCountry" with the name of this locale's country in a format suitable @@ -892,7 +892,8 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return A reference to "dispCountry". * @stable ICU 2.0 */ - U_COMMON_API UnicodeString& getDisplayCountry(UnicodeString& dispCountry) const; + U_COMMON_API UnicodeString& + getDisplayCountry(UnicodeString& dispCountry U_LIFETIME_BOUND) const; /** * Fills in "dispCountry" with the name of this locale's country in a format suitable @@ -908,8 +909,9 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return A reference to "dispCountry". * @stable ICU 2.0 */ - U_COMMON_API UnicodeString& getDisplayCountry(const Locale& displayLocale, - UnicodeString& dispCountry) const; + U_COMMON_API UnicodeString& + getDisplayCountry(const Locale& displayLocale, + UnicodeString& dispCountry U_LIFETIME_BOUND) const; /** * Fills in "dispVar" with the name of this locale's variant code in a format suitable @@ -918,7 +920,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return A reference to "dispVar". * @stable ICU 2.0 */ - U_COMMON_API UnicodeString& getDisplayVariant(UnicodeString& dispVar) const; + U_COMMON_API UnicodeString& getDisplayVariant(UnicodeString& dispVar U_LIFETIME_BOUND) const; /** * Fills in "dispVar" with the name of this locale's variant code in a format @@ -929,7 +931,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @stable ICU 2.0 */ U_COMMON_API UnicodeString& getDisplayVariant(const Locale& displayLocale, - UnicodeString& dispVar) const; + UnicodeString& dispVar U_LIFETIME_BOUND) const; /** * Fills in "name" with the name of this locale in a format suitable for user display @@ -942,7 +944,7 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return A reference to "name". * @stable ICU 2.0 */ - U_COMMON_API UnicodeString& getDisplayName(UnicodeString& name) const; + U_COMMON_API UnicodeString& getDisplayName(UnicodeString& name U_LIFETIME_BOUND) const; /** * Fills in "name" with the name of this locale in a format suitable for user display @@ -956,7 +958,8 @@ class U_COMMON_API_CLASS Locale : public UObject { * @return A reference to "name". * @stable ICU 2.0 */ - U_COMMON_API UnicodeString& getDisplayName(const Locale& displayLocale, UnicodeString& name) const; + U_COMMON_API UnicodeString& getDisplayName(const Locale& displayLocale, + UnicodeString& name U_LIFETIME_BOUND) const; /** * Generates a hash code for the locale. @@ -1150,8 +1153,8 @@ class U_COMMON_API_CLASS Locale : public UObject { * @param cLocaleID The new locale name. * @param canonicalize whether to call uloc_canonicalize on cLocaleID */ - Locale& init(const char* localeID, UBool canonicalize); - Locale& init(StringPiece localeID, UBool canonicalize); + Locale& init(const char* localeID, UBool canonicalize) U_LIFETIME_BOUND; + Locale& init(StringPiece localeID, UBool canonicalize) U_LIFETIME_BOUND; /* * Internal constructor to allow construction of a locale object with @@ -1192,11 +1195,13 @@ class U_COMMON_API_CLASS Locale : public UObject { sizeof region - sizeof variantBegin]; - const char* getLanguage() const { return language; } - const char* getScript() const { return script; } - const char* getRegion() const { return region; } - const char* getVariant() const { return variantBegin == 0 ? "" : getBaseName() + variantBegin; } - const char* getBaseName() const { return baseName; } + const char* getLanguage() const U_LIFETIME_BOUND { return language; } + const char* getScript() const U_LIFETIME_BOUND { return script; } + const char* getRegion() const U_LIFETIME_BOUND { return region; } + const char* getVariant() const U_LIFETIME_BOUND { + return variantBegin == 0 ? "" : getBaseName() + variantBegin; + } + const char* getBaseName() const U_LIFETIME_BOUND { return baseName; } // Doesn't inherit from UMemory, shouldn't be heap allocated. static void* U_EXPORT2 operator new(size_t) noexcept = delete; @@ -1237,12 +1242,12 @@ class U_COMMON_API_CLASS Locale : public UObject { char region[ULOC_COUNTRY_CAPACITY]; Alloc* ptr; - const char* getLanguage() const { return language; } - const char* getScript() const { return script; } - const char* getRegion() const { return region; } - const char* getVariant() const; - const char* getFullName() const; - const char* getBaseName() const; + const char* getLanguage() const U_LIFETIME_BOUND { return language; } + const char* getScript() const U_LIFETIME_BOUND { return script; } + const char* getRegion() const U_LIFETIME_BOUND { return region; } + const char* getVariant() const U_LIFETIME_BOUND; + const char* getFullName() const U_LIFETIME_BOUND; + const char* getBaseName() const U_LIFETIME_BOUND; // Doesn't inherit from UMemory, shouldn't be heap allocated. static void* U_EXPORT2 operator new(size_t) noexcept = delete; @@ -1254,8 +1259,8 @@ class U_COMMON_API_CLASS Locale : public UObject { int32_t variantBegin); ~Heap(); - Heap& operator=(const Heap& other); - Heap& operator=(Heap&& other) noexcept; + Heap& operator=(const Heap& other) U_LIFETIME_BOUND; + Heap& operator=(Heap&& other) noexcept U_LIFETIME_BOUND; }; static_assert(sizeof(Heap) <= sizeof(Nest)); @@ -1283,15 +1288,15 @@ class U_COMMON_API_CLASS Locale : public UObject { Payload(const Payload& other); Payload(Payload&& other) noexcept; - Payload& operator=(const Payload& other); - Payload& operator=(Payload&& other) noexcept; + Payload& operator=(const Payload& other) U_LIFETIME_BOUND; + Payload& operator=(Payload&& other) noexcept U_LIFETIME_BOUND; void setToBogus(); bool isBogus() const { return type == eBOGUS; } - template T& emplace(Args&&... args); + template T& emplace(Args&&... args) U_LIFETIME_BOUND; - template T* get(); + template T* get() U_LIFETIME_BOUND; template auto visit(BogusFn bogusFn, NestFn nestFn, HeapFn heapFn, Args... args) const; @@ -1307,7 +1312,7 @@ class U_COMMON_API_CLASS Locale : public UObject { */ template - const char* getField() const; + const char* getField() const U_LIFETIME_BOUND; static const Locale &getLocale(int locid); diff --git a/deps/icu-small/source/common/unicode/messagepattern.h b/deps/icu-small/source/common/unicode/messagepattern.h index db36ede7274c..4053f5112a63 100644 --- a/deps/icu-small/source/common/unicode/messagepattern.h +++ b/deps/icu-small/source/common/unicode/messagepattern.h @@ -415,7 +415,7 @@ class U_COMMON_API MessagePattern : public UObject { * @return *this=other * @stable ICU 4.8 */ - MessagePattern &operator=(const MessagePattern &other); + MessagePattern& operator=(const MessagePattern& other) U_LIFETIME_BOUND; /** * Destructor. @@ -440,8 +440,9 @@ class U_COMMON_API MessagePattern : public UObject { * @throws NumberFormatException if a number could not be parsed * @stable ICU 4.8 */ - MessagePattern &parse(const UnicodeString &pattern, - UParseError *parseError, UErrorCode &errorCode); + MessagePattern& parse(const UnicodeString& pattern, + UParseError* parseError, + UErrorCode& errorCode) U_LIFETIME_BOUND; /** * Parses a ChoiceFormat pattern string. @@ -460,8 +461,9 @@ class U_COMMON_API MessagePattern : public UObject { * @throws NumberFormatException if a number could not be parsed * @stable ICU 4.8 */ - MessagePattern &parseChoiceStyle(const UnicodeString &pattern, - UParseError *parseError, UErrorCode &errorCode); + MessagePattern& parseChoiceStyle(const UnicodeString& pattern, + UParseError* parseError, + UErrorCode& errorCode) U_LIFETIME_BOUND; /** * Parses a PluralFormat pattern string. @@ -480,8 +482,9 @@ class U_COMMON_API MessagePattern : public UObject { * @throws NumberFormatException if a number could not be parsed * @stable ICU 4.8 */ - MessagePattern &parsePluralStyle(const UnicodeString &pattern, - UParseError *parseError, UErrorCode &errorCode); + MessagePattern& parsePluralStyle(const UnicodeString& pattern, + UParseError* parseError, + UErrorCode& errorCode) U_LIFETIME_BOUND; /** * Parses a SelectFormat pattern string. @@ -500,8 +503,9 @@ class U_COMMON_API MessagePattern : public UObject { * @throws NumberFormatException if a number could not be parsed * @stable ICU 4.8 */ - MessagePattern &parseSelectStyle(const UnicodeString &pattern, - UParseError *parseError, UErrorCode &errorCode); + MessagePattern& parseSelectStyle(const UnicodeString& pattern, + UParseError* parseError, + UErrorCode& errorCode) U_LIFETIME_BOUND; /** * Clears this MessagePattern. @@ -558,7 +562,7 @@ class U_COMMON_API MessagePattern : public UObject { * @return the parsed pattern string (null if none was parsed). * @stable ICU 4.8 */ - const UnicodeString &getPatternString() const { + const UnicodeString& getPatternString() const U_LIFETIME_BOUND { return msg; } @@ -623,7 +627,7 @@ class U_COMMON_API MessagePattern : public UObject { * @return the i-th pattern "part". * @stable ICU 4.8 */ - const Part &getPart(int32_t i) const { + const Part& getPart(int32_t i) const U_LIFETIME_BOUND { return parts[i]; } @@ -656,7 +660,7 @@ class U_COMMON_API MessagePattern : public UObject { * @return the substring associated with part. * @stable ICU 4.8 */ - UnicodeString getSubstring(const Part &part) const { + UnicodeString getSubstring(const Part& part) const U_LIFETIME_BOUND { return msg.tempSubString(part.index, part.length); } diff --git a/deps/icu-small/source/common/unicode/normalizer2.h b/deps/icu-small/source/common/unicode/normalizer2.h index 01271623f3b9..aa72a4634067 100644 --- a/deps/icu-small/source/common/unicode/normalizer2.h +++ b/deps/icu-small/source/common/unicode/normalizer2.h @@ -236,10 +236,10 @@ class U_COMMON_API Normalizer2 : public UObject { * @return dest * @stable ICU 4.4 */ - virtual UnicodeString & - normalize(const UnicodeString &src, - UnicodeString &dest, - UErrorCode &errorCode) const = 0; + virtual UnicodeString& + normalize(const UnicodeString& src, + UnicodeString& dest U_LIFETIME_BOUND, + UErrorCode& errorCode) const = 0; /** * Normalizes a UTF-8 string and optionally records how source substrings @@ -281,10 +281,10 @@ class U_COMMON_API Normalizer2 : public UObject { * @return first * @stable ICU 4.4 */ - virtual UnicodeString & - normalizeSecondAndAppend(UnicodeString &first, - const UnicodeString &second, - UErrorCode &errorCode) const = 0; + virtual UnicodeString& + normalizeSecondAndAppend(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, + UErrorCode& errorCode) const = 0; /** * Appends the second string to the first string * (merging them at the boundary) and returns the first string. @@ -299,10 +299,10 @@ class U_COMMON_API Normalizer2 : public UObject { * @return first * @stable ICU 4.4 */ - virtual UnicodeString & - append(UnicodeString &first, - const UnicodeString &second, - UErrorCode &errorCode) const = 0; + virtual UnicodeString& + append(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, + UErrorCode& errorCode) const = 0; /** * Gets the decomposition mapping of c. @@ -528,7 +528,8 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @param filterSet UnicodeSet which determines the characters to be normalized * @stable ICU 4.4 */ - FilteredNormalizer2(const Normalizer2 &n2, const UnicodeSet &filterSet) : + FilteredNormalizer2(const Normalizer2& n2 U_LIFETIME_BOUND, + const UnicodeSet& filterSet U_LIFETIME_BOUND) : norm2(n2), set(filterSet) {} /** @@ -550,10 +551,10 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @return dest * @stable ICU 4.4 */ - virtual UnicodeString & - normalize(const UnicodeString &src, - UnicodeString &dest, - UErrorCode &errorCode) const override; + virtual UnicodeString& + normalize(const UnicodeString& src, + UnicodeString& dest U_LIFETIME_BOUND, + UErrorCode& errorCode) const override; /** * Normalizes a UTF-8 string and optionally records how source substrings @@ -595,10 +596,10 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @return first * @stable ICU 4.4 */ - virtual UnicodeString & - normalizeSecondAndAppend(UnicodeString &first, - const UnicodeString &second, - UErrorCode &errorCode) const override; + virtual UnicodeString& + normalizeSecondAndAppend(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, + UErrorCode& errorCode) const override; /** * Appends the second string to the first string * (merging them at the boundary) and returns the first string. @@ -613,10 +614,10 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @return first * @stable ICU 4.4 */ - virtual UnicodeString & - append(UnicodeString &first, - const UnicodeString &second, - UErrorCode &errorCode) const override; + virtual UnicodeString& + append(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, + UErrorCode& errorCode) const override; /** * Gets the decomposition mapping of c. @@ -760,11 +761,11 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { */ virtual UBool isInert(UChar32 c) const override; private: - UnicodeString & - normalize(const UnicodeString &src, - UnicodeString &dest, + UnicodeString& + normalize(const UnicodeString& src, + UnicodeString& dest U_LIFETIME_BOUND, USetSpanCondition spanCondition, - UErrorCode &errorCode) const; + UErrorCode& errorCode) const; void normalizeUTF8(uint32_t options, const char *src, int32_t length, @@ -772,11 +773,11 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { USetSpanCondition spanCondition, UErrorCode &errorCode) const; - UnicodeString & - normalizeSecondAndAppend(UnicodeString &first, - const UnicodeString &second, + UnicodeString& + normalizeSecondAndAppend(UnicodeString& first U_LIFETIME_BOUND, + const UnicodeString& second, UBool doNormalize, - UErrorCode &errorCode) const; + UErrorCode& errorCode) const; const Normalizer2 &norm2; const UnicodeSet &set; diff --git a/deps/icu-small/source/common/unicode/normlzr.h b/deps/icu-small/source/common/unicode/normlzr.h index 0309bce5382d..c715c4d511c7 100644 --- a/deps/icu-small/source/common/unicode/normlzr.h +++ b/deps/icu-small/source/common/unicode/normlzr.h @@ -170,7 +170,7 @@ class U_COMMON_API Normalizer : public UObject { * @param mode The normalization mode. * @deprecated ICU 56 Use Normalizer2 instead. */ - Normalizer(ConstChar16Ptr str, int32_t length, UNormalizationMode mode); + Normalizer(ConstChar16Ptr str U_LIFETIME_BOUND, int32_t length, UNormalizationMode mode); /** * Creates a new Normalizer object for iterating over the @@ -377,11 +377,13 @@ class U_COMMON_API Normalizer : public UObject { * * @deprecated ICU 56 Use Normalizer2 instead. */ - static UnicodeString & - U_EXPORT2 concatenate(const UnicodeString &left, const UnicodeString &right, - UnicodeString &result, - UNormalizationMode mode, int32_t options, - UErrorCode &errorCode); + static UnicodeString& U_EXPORT2 + concatenate(const UnicodeString& left, + const UnicodeString& right, + UnicodeString& result U_LIFETIME_BOUND, + UNormalizationMode mode, + int32_t options, + UErrorCode& errorCode); #endif /* U_HIDE_DEPRECATED_API */ /** diff --git a/deps/icu-small/source/common/unicode/parsepos.h b/deps/icu-small/source/common/unicode/parsepos.h index 99cdd7edab80..913e8b4689f8 100644 --- a/deps/icu-small/source/common/unicode/parsepos.h +++ b/deps/icu-small/source/common/unicode/parsepos.h @@ -93,7 +93,7 @@ class U_COMMON_API ParsePosition : public UObject { * Assignment operator * @stable ICU 2.0 */ - inline ParsePosition& operator=(const ParsePosition& copy); + inline ParsePosition& operator=(const ParsePosition& copy) U_LIFETIME_BOUND; /** * Equality operator. @@ -185,7 +185,7 @@ class U_COMMON_API ParsePosition : public UObject { }; inline ParsePosition& -ParsePosition::operator=(const ParsePosition& copy) +ParsePosition::operator=(const ParsePosition& copy) U_LIFETIME_BOUND { index = copy.index; errorIndex = copy.errorIndex; diff --git a/deps/icu-small/source/common/unicode/platform.h b/deps/icu-small/source/common/unicode/platform.h index b45048d68348..9369a95b656a 100644 --- a/deps/icu-small/source/common/unicode/platform.h +++ b/deps/icu-small/source/common/unicode/platform.h @@ -408,6 +408,17 @@ #else # define UPRV_HAS_FEATURE(x) 0 #endif +#if UPRV_HAS_FEATURE(address_sanitizer) || \ + UPRV_HAS_FEATURE(memory_sanitizer) || \ + UPRV_HAS_FEATURE(thread_sanitizer) || \ + UPRV_HAS_FEATURE(undefined_sanitizer) || \ + defined(__SANITIZE_ADDRESS__) || \ + defined(__SANITIZE_THREAD__) || \ + defined(__SANITIZE_UNDEFINED__) +# define UPRV_HAS_SANITIZER 1 +#else +# define UPRV_HAS_SANITIZER 0 +#endif #ifdef __has_extension # define UPRV_HAS_EXTENSION(x) __has_extension(x) #else @@ -421,8 +432,10 @@ #if defined(__clang__) +#define UPRV_NO_SANITIZE_FUNCTION __attribute__((no_sanitize("function"))) #define UPRV_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined"))) #else +#define UPRV_NO_SANITIZE_FUNCTION #define UPRV_NO_SANITIZE_UNDEFINED #endif @@ -507,6 +520,37 @@ # define U_FALLTHROUGH #endif +#ifndef U_IN_DOXYGEN +/** + * \def U_LIFETIME_BOUND + * + * Annotate a function parameter or implicit object parameter to indicate that + * objects that are referred to by that parameter may also be referred to by the + * return value of the annotated function (or, for a parameter of a constructor, + * by the value of the constructed object). + * + * https://clang.llvm.org/docs/AttributeReference.html#lifetimebound + * https://learn.microsoft.com/en-us/cpp/code-quality/c26816?view=msvc-170 + * + * @internal + */ +#ifndef __cplusplus +// Not for C. +#elif defined(U_LIFETIME_BOUND) +// Use the predefined value. +#elif UPRV_HAS_CPP_ATTRIBUTE(clang::lifetimebound) +# define U_LIFETIME_BOUND [[clang::lifetimebound]] +#elif UPRV_HAS_CPP_ATTRIBUTE(msvc::lifetimebound) +# define U_LIFETIME_BOUND [[msvc::lifetimebound]] +#elif UPRV_HAS_ATTRIBUTE(lifetimebound) +# define U_LIFETIME_BOUND __attribute__((lifetimebound)) +#endif + +#ifndef U_LIFETIME_BOUND +# define U_LIFETIME_BOUND +#endif +#endif + /** @} */ /*===========================================================================*/ diff --git a/deps/icu-small/source/common/unicode/rbbi.h b/deps/icu-small/source/common/unicode/rbbi.h index e70254982c91..28c2c6915262 100644 --- a/deps/icu-small/source/common/unicode/rbbi.h +++ b/deps/icu-small/source/common/unicode/rbbi.h @@ -339,7 +339,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return the newly created RuleBasedBreakIterator * @stable ICU 2.0 */ - RuleBasedBreakIterator& operator=(const RuleBasedBreakIterator& that); + RuleBasedBreakIterator& operator=(const RuleBasedBreakIterator& that) U_LIFETIME_BOUND; /** * Equality operator. Returns true if both BreakIterators are of the @@ -386,7 +386,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return the description used to create this iterator * @stable ICU 2.0 */ - virtual const UnicodeString& getRules() const; + virtual const UnicodeString& getRules() const U_LIFETIME_BOUND; //======================================================================= // BreakIterator overrides @@ -416,7 +416,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @return An iterator over the text being analyzed. * @stable ICU 2.0 */ - virtual CharacterIterator& getText() const override; + virtual CharacterIterator& getText() const U_LIFETIME_BOUND override; /** * Get a UText for the text being analyzed. @@ -432,7 +432,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * UText was provided, it will always be returned. * @stable ICU 3.4 */ - virtual UText *getUText(UText *fillIn, UErrorCode &status) const override; + virtual UText* getUText(UText* fillIn U_LIFETIME_BOUND, UErrorCode& status) const override; /** * Set the iterator to analyze a new piece of text. This function resets @@ -682,7 +682,7 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * caller, and must not be modified or deleted. * @stable ICU 4.8 */ - virtual const uint8_t *getBinaryRules(uint32_t &length); + virtual const uint8_t* getBinaryRules(uint32_t& length) U_LIFETIME_BOUND; /** * Set the subject text string upon which the break iterator is operating @@ -709,23 +709,32 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * * @stable ICU 49 */ - virtual RuleBasedBreakIterator &refreshInputText(UText *input, UErrorCode &status) override; + virtual RuleBasedBreakIterator& refreshInputText(UText* input, + UErrorCode& status) U_LIFETIME_BOUND override; private: //======================================================================= // implementation //======================================================================= + +#ifndef U_HIDE_INTERNAL_API +public: +#endif /* U_HIDE_INTERNAL_API */ /** * Iterate backwards from an arbitrary position in the input text using the * synthesized Safe Reverse rules. * This locates a "Safe Position" from which the forward break rules * will operate correctly. A Safe Position is not necessarily a boundary itself. * + * Public only for testing (to avoid regressions like ICU-23478). + * * @param fromPosition the position in the input text to begin the iteration. + * @internal */ int32_t handleSafePrevious(int32_t fromPosition); +private: /** * Find a rule-based boundary by running the state machine. * Input @@ -767,7 +776,8 @@ class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { * @param c A character in the dictionary set * @param locale The locale. */ - const LanguageBreakEngine *getLanguageBreakEngine(UChar32 c, const char* locale); + const LanguageBreakEngine* getLanguageBreakEngine(UChar32 c, + const char* locale) U_LIFETIME_BOUND; public: #ifndef U_HIDE_INTERNAL_API diff --git a/deps/icu-small/source/common/unicode/rep.h b/deps/icu-small/source/common/unicode/rep.h index 7115c97b8299..b1bad3f9b147 100644 --- a/deps/icu-small/source/common/unicode/rep.h +++ b/deps/icu-small/source/common/unicode/rep.h @@ -120,7 +120,6 @@ class U_COMMON_API Replaceable : public UObject { * @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.1 */ virtual void extractBetween(int32_t start, diff --git a/deps/icu-small/source/common/unicode/resbund.h b/deps/icu-small/source/common/unicode/resbund.h index 03ff6faee239..f5c8441aa640 100644 --- a/deps/icu-small/source/common/unicode/resbund.h +++ b/deps/icu-small/source/common/unicode/resbund.h @@ -178,8 +178,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @param other The resource bundle to copy. * @stable ICU 2.0 */ - ResourceBundle& - operator=(const ResourceBundle& other); + ResourceBundle& operator=(const ResourceBundle& other) U_LIFETIME_BOUND; /** Destructor. * @stable ICU 2.0 @@ -221,8 +220,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a pointer to a zero-terminated char16_t array which lives in a memory mapped/DLL file. * @stable ICU 2.0 */ - UnicodeString - getString(UErrorCode& status) const; + UnicodeString getString(UErrorCode& status) const U_LIFETIME_BOUND; /** * returns a binary data from a resource. Can be used at most primitive resource types (binaries, @@ -236,9 +234,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a pointer to a chunk of unsigned bytes which live in a memory mapped/DLL file. * @stable ICU 2.0 */ - const uint8_t* - getBinary(int32_t& len, UErrorCode& status) const; - + const uint8_t* getBinary(int32_t& len, UErrorCode& status) const U_LIFETIME_BOUND; /** * returns an integer vector from a resource. @@ -251,8 +247,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a pointer to a vector of integers that lives in a memory mapped/DLL file. * @stable ICU 2.0 */ - const int32_t* - getIntVector(int32_t& len, UErrorCode& status) const; + const int32_t* getIntVector(int32_t& len, UErrorCode& status) const U_LIFETIME_BOUND; /** * returns an unsigned integer from a resource. @@ -304,7 +299,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a key associated to this resource, or nullptr if it doesn't have a key * @stable ICU 2.0 */ - const char* getKey() const; + const char* getKey() const U_LIFETIME_BOUND; /** * Gets the locale ID of the resource bundle as a string. @@ -313,7 +308,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return the locale ID of the resource bundle as a string * @stable ICU 2.0 */ - const char* getName() const; + const char* getName() const U_LIFETIME_BOUND; /** * Returns the type of a resource. Available types are defined in enum UResType @@ -341,8 +336,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return an UnicodeString object. * @stable ICU 2.0 */ - UnicodeString - getNextString(UErrorCode& status); + UnicodeString getNextString(UErrorCode& status) U_LIFETIME_BOUND; /** * Returns the next string in a resource or nullptr if there are no more resources @@ -353,9 +347,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return an UnicodeString object. * @stable ICU 2.0 */ - UnicodeString - getNextString(const char ** key, - UErrorCode& status); + UnicodeString getNextString(const char** key, UErrorCode& status) U_LIFETIME_BOUND; /** * Returns the resource in a resource at the specified index. @@ -377,9 +369,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return an UnicodeString object. If there is an error, string is bogus * @stable ICU 2.0 */ - UnicodeString - getStringEx(int32_t index, - UErrorCode& status) const; + UnicodeString getStringEx(int32_t index, UErrorCode& status) const U_LIFETIME_BOUND; /** * Returns a resource in a resource that has a given key. This procedure works only with table @@ -403,9 +393,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return an UnicodeString object. If there is an error, string is bogus * @stable ICU 2.0 */ - UnicodeString - getStringEx(const char* key, - UErrorCode& status) const; + UnicodeString getStringEx(const char* key, UErrorCode& status) const U_LIFETIME_BOUND; #ifndef U_HIDE_DEPRECATED_API /** @@ -417,7 +405,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @see getVersion * @deprecated ICU 2.8 Use getVersion instead. */ - const char* getVersionNumber() const; + const char* getVersionNumber() const U_LIFETIME_BOUND; #endif /* U_HIDE_DEPRECATED_API */ /** @@ -437,7 +425,7 @@ class U_COMMON_API ResourceBundle : public UObject { * @return a Locale object * @deprecated ICU 2.8 Use getLocale(ULocDataLocaleType type, UErrorCode &status) overload instead. */ - const Locale& getLocale() const; + const Locale& getLocale() const U_LIFETIME_BOUND; #endif /* U_HIDE_DEPRECATED_API */ /** diff --git a/deps/icu-small/source/common/unicode/schriter.h b/deps/icu-small/source/common/unicode/schriter.h index 96f03604ade5..05df2ee236ef 100644 --- a/deps/icu-small/source/common/unicode/schriter.h +++ b/deps/icu-small/source/common/unicode/schriter.h @@ -113,8 +113,7 @@ class U_COMMON_API StringCharacterIterator : public UCharCharacterIterator { * @return the newly created object. * @stable ICU 2.0 */ - StringCharacterIterator& - operator=(const StringCharacterIterator& that); + StringCharacterIterator& operator=(const StringCharacterIterator& that) U_LIFETIME_BOUND; /** * Returns true if the iterators iterate over the same range of the diff --git a/deps/icu-small/source/common/unicode/simpleformatter.h b/deps/icu-small/source/common/unicode/simpleformatter.h index 62c75d08bbc0..7af660ebec04 100644 --- a/deps/icu-small/source/common/unicode/simpleformatter.h +++ b/deps/icu-small/source/common/unicode/simpleformatter.h @@ -108,7 +108,7 @@ class U_COMMON_API SimpleFormatter final : public UMemory { * Assignment operator. * @stable ICU 57 */ - SimpleFormatter &operator=(const SimpleFormatter& other); + SimpleFormatter& operator=(const SimpleFormatter& other) U_LIFETIME_BOUND; /** * Destructor. @@ -168,9 +168,10 @@ class U_COMMON_API SimpleFormatter final : public UMemory { * @return appendTo * @stable ICU 57 */ - UnicodeString &format( - const UnicodeString &value0, - UnicodeString &appendTo, UErrorCode &errorCode) const; + UnicodeString& format( + const UnicodeString& value0, + UnicodeString& appendTo U_LIFETIME_BOUND, + UErrorCode& errorCode) const; /** * Formats the given values, appending to the appendTo builder. @@ -185,10 +186,11 @@ class U_COMMON_API SimpleFormatter final : public UMemory { * @return appendTo * @stable ICU 57 */ - UnicodeString &format( - const UnicodeString &value0, - const UnicodeString &value1, - UnicodeString &appendTo, UErrorCode &errorCode) const; + UnicodeString& format( + const UnicodeString& value0, + const UnicodeString& value1, + UnicodeString& appendTo U_LIFETIME_BOUND, + UErrorCode& errorCode) const; /** * Formats the given values, appending to the appendTo builder. @@ -204,11 +206,12 @@ class U_COMMON_API SimpleFormatter final : public UMemory { * @return appendTo * @stable ICU 57 */ - UnicodeString &format( - const UnicodeString &value0, - const UnicodeString &value1, - const UnicodeString &value2, - UnicodeString &appendTo, UErrorCode &errorCode) const; + UnicodeString& format( + const UnicodeString& value0, + const UnicodeString& value1, + const UnicodeString& value2, + UnicodeString& appendTo U_LIFETIME_BOUND, + UErrorCode& errorCode) const; /** * Formats the given values, appending to the appendTo string. @@ -229,10 +232,13 @@ class U_COMMON_API SimpleFormatter final : public UMemory { * @return appendTo * @stable ICU 57 */ - UnicodeString &formatAndAppend( - const UnicodeString *const *values, int32_t valuesLength, - UnicodeString &appendTo, - int32_t *offsets, int32_t offsetsLength, UErrorCode &errorCode) const; + UnicodeString& formatAndAppend( + const UnicodeString* const* values, + int32_t valuesLength, + UnicodeString& appendTo U_LIFETIME_BOUND, + int32_t* offsets, + int32_t offsetsLength, + UErrorCode& errorCode) const; /** * Formats the given values, replacing the contents of the result string. @@ -255,10 +261,13 @@ class U_COMMON_API SimpleFormatter final : public UMemory { * @return result * @stable ICU 57 */ - UnicodeString &formatAndReplace( - const UnicodeString *const *values, int32_t valuesLength, - UnicodeString &result, - int32_t *offsets, int32_t offsetsLength, UErrorCode &errorCode) const; + UnicodeString& formatAndReplace( + const UnicodeString* const* values, + int32_t valuesLength, + UnicodeString& result U_LIFETIME_BOUND, + int32_t* offsets, + int32_t offsetsLength, + UErrorCode& errorCode) const; /** * Returns the pattern text with none of the arguments. @@ -321,12 +330,16 @@ class U_COMMON_API SimpleFormatter final : public UMemory { int32_t *offsets, int32_t offsetsLength); - static UnicodeString &format( - const char16_t *compiledPattern, int32_t compiledPatternLength, - const UnicodeString *const *values, - UnicodeString &result, const UnicodeString *resultCopy, UBool forbidResultAsValue, - int32_t *offsets, int32_t offsetsLength, - UErrorCode &errorCode); + static UnicodeString& format( + const char16_t* compiledPattern, + int32_t compiledPatternLength, + const UnicodeString* const* values, + UnicodeString& result U_LIFETIME_BOUND, + const UnicodeString* resultCopy, + UBool forbidResultAsValue, + int32_t* offsets, + int32_t offsetsLength, + UErrorCode& errorCode); // Give access to internals to SimpleModifier for number formatting friend class number::impl::SimpleModifier; diff --git a/deps/icu-small/source/common/unicode/strenum.h b/deps/icu-small/source/common/unicode/strenum.h index fba5c9b8147e..b99fb394e662 100644 --- a/deps/icu-small/source/common/unicode/strenum.h +++ b/deps/icu-small/source/common/unicode/strenum.h @@ -129,7 +129,7 @@ class U_COMMON_API StringEnumeration : public UObject { * * @stable ICU 2.4 */ - virtual const char* next(int32_t *resultLength, UErrorCode& status); + virtual const char* next(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND; /** *

Returns the next element as a NUL-terminated char16_t*. If there @@ -154,7 +154,7 @@ class U_COMMON_API StringEnumeration : public UObject { * * @stable ICU 2.4 */ - virtual const char16_t* unext(int32_t *resultLength, UErrorCode& status); + virtual const char16_t* unext(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND; /** *

Returns the next element a UnicodeString*. If there are no @@ -176,7 +176,7 @@ class U_COMMON_API StringEnumeration : public UObject { * * @stable ICU 2.4 */ - virtual const UnicodeString* snext(UErrorCode& status); + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND; /** *

Resets the iterator. This re-establishes sync with the @@ -270,7 +270,7 @@ class U_COMMON_API StringEnumeration : public UObject { * @return A pointer to unistr. * @stable ICU 2.8 */ - UnicodeString *setChars(const char *s, int32_t length, UErrorCode &status); + UnicodeString* setChars(const char* s, int32_t length, UErrorCode& status) U_LIFETIME_BOUND; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/stringpiece.h b/deps/icu-small/source/common/unicode/stringpiece.h index adb3681fe6ef..f5c9df1d074c 100644 --- a/deps/icu-small/source/common/unicode/stringpiece.h +++ b/deps/icu-small/source/common/unicode/stringpiece.h @@ -75,14 +75,14 @@ class U_COMMON_API StringPiece : public UMemory { * @param str a NUL-terminated const char * pointer * @stable ICU 4.2 */ - StringPiece(const char* str); + StringPiece(const char* str U_LIFETIME_BOUND); #if defined(__cpp_char8_t) || defined(U_IN_DOXYGEN) /** * Constructs from a NUL-terminated const char8_t * pointer. * @param str a NUL-terminated const char8_t * pointer * @stable ICU 67 */ - StringPiece(const char8_t* str) : StringPiece(reinterpret_cast(str)) {} + StringPiece(const char8_t* str U_LIFETIME_BOUND) : StringPiece(reinterpret_cast(str)) {} #endif /** * Constructs an empty StringPiece. @@ -96,14 +96,14 @@ class U_COMMON_API StringPiece : public UMemory { * Constructs from a std::string. * @stable ICU 4.2 */ - StringPiece(const std::string& str) + StringPiece(const std::string& str U_LIFETIME_BOUND) : ptr_(str.data()), length_(static_cast(str.size())) { } #if defined(__cpp_lib_char8_t) || defined(U_IN_DOXYGEN) /** * Constructs from a std::u8string. * @stable ICU 67 */ - StringPiece(const std::u8string& str) + StringPiece(const std::u8string& str U_LIFETIME_BOUND) : ptr_(reinterpret_cast(str.data())), length_(static_cast(str.size())) { } #endif @@ -138,7 +138,7 @@ class U_COMMON_API StringPiece : public UMemory { #endif ) && std::is_same_v>> - StringPiece(T str) + StringPiece(T str U_LIFETIME_BOUND) : ptr_(reinterpret_cast(str.data())), length_(static_cast(str.size())) {} @@ -148,7 +148,7 @@ class U_COMMON_API StringPiece : public UMemory { * @param len the length of the string; must be non-negative * @stable ICU 4.2 */ - StringPiece(const char* offset, int32_t len) : ptr_(offset), length_(len) { } + StringPiece(const char* offset U_LIFETIME_BOUND, int32_t len) : ptr_(offset), length_(len) { } #if defined(__cpp_char8_t) || defined(U_IN_DOXYGEN) /** * Constructs from a const char8_t * pointer and a specified length. @@ -156,7 +156,7 @@ class U_COMMON_API StringPiece : public UMemory { * @param len the length of the string; must be non-negative * @stable ICU 67 */ - StringPiece(const char8_t* str, int32_t len) : + StringPiece(const char8_t* str U_LIFETIME_BOUND, int32_t len) : StringPiece(reinterpret_cast(str), len) {} #endif @@ -166,7 +166,7 @@ class U_COMMON_API StringPiece : public UMemory { * @param pos start position in x; must be non-negative and <= x.length(). * @stable ICU 4.2 */ - StringPiece(const StringPiece& x, int32_t pos); + StringPiece(const StringPiece& x U_LIFETIME_BOUND, int32_t pos); /** * Substring of another StringPiece. * @param x the other StringPiece @@ -175,7 +175,7 @@ class U_COMMON_API StringPiece : public UMemory { * must be non-negative and will be pinned to at most x.length() - pos. * @stable ICU 4.2 */ - StringPiece(const StringPiece& x, int32_t pos, int32_t len); + StringPiece(const StringPiece& x U_LIFETIME_BOUND, int32_t pos, int32_t len); #ifndef U_HIDE_INTERNAL_API /** diff --git a/deps/icu-small/source/common/unicode/stringtriebuilder.h b/deps/icu-small/source/common/unicode/stringtriebuilder.h index 62108dfe3ea1..111ba2d69ecc 100644 --- a/deps/icu-small/source/common/unicode/stringtriebuilder.h +++ b/deps/icu-small/source/common/unicode/stringtriebuilder.h @@ -101,10 +101,16 @@ class U_COMMON_API StringTrieBuilder : public UObject { #ifndef U_HIDE_INTERNAL_API /** @internal */ - Node *makeNode(int32_t start, int32_t limit, int32_t unitIndex, UErrorCode &errorCode); - /** @internal */ - Node *makeBranchSubNode(int32_t start, int32_t limit, int32_t unitIndex, - int32_t length, UErrorCode &errorCode); + Node* makeNode(int32_t start, + int32_t limit, + int32_t unitIndex, + UErrorCode& errorCode) U_LIFETIME_BOUND; + /** @internal */ + Node* makeBranchSubNode(int32_t start, + int32_t limit, + int32_t unitIndex, + int32_t length, + UErrorCode& errorCode) U_LIFETIME_BOUND; #endif /* U_HIDE_INTERNAL_API */ /** @internal */ @@ -157,7 +163,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { * an equivalent node if newNode is a duplicate. * @internal */ - Node *registerNode(Node *newNode, UErrorCode &errorCode); + Node* registerNode(Node* newNode, UErrorCode& errorCode) U_LIFETIME_BOUND; /** * Makes sure that there is only one unique FinalValueNode registered * with this value. @@ -168,7 +174,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { * @return A FinalValueNode with the given value. * @internal */ - Node *registerFinalValue(int32_t value, UErrorCode &errorCode); + Node* registerFinalValue(int32_t value, UErrorCode& errorCode) U_LIFETIME_BOUND; #endif /* U_HIDE_INTERNAL_API */ /* @@ -193,9 +199,9 @@ class U_COMMON_API StringTrieBuilder : public UObject { // Do not conditionalize the following with #ifndef U_HIDE_INTERNAL_API, // it is needed for layout of other objects. + /// \cond /** * @internal - * \cond */ class Node : public UObject { public: diff --git a/deps/icu-small/source/common/unicode/symtable.h b/deps/icu-small/source/common/unicode/symtable.h index 647a3884a00c..5f533f7b105b 100644 --- a/deps/icu-small/source/common/unicode/symtable.h +++ b/deps/icu-small/source/common/unicode/symtable.h @@ -19,11 +19,11 @@ #include "unicode/uobject.h" /** - * \file + * \file * \brief C++ API: An interface that defines both lookup protocol and parsing of * symbolic names. */ - + U_NAMESPACE_BEGIN class ParsePosition; @@ -80,7 +80,17 @@ class U_COMMON_API SymbolTable /* not : public UObject because this is an interf * there is no mapping for s. * @stable ICU 2.8 */ - virtual const UnicodeString* lookup(const UnicodeString& s) const = 0; + virtual const UnicodeString* lookup(const UnicodeString& s) const U_LIFETIME_BOUND = 0; + + /** + * Returns a pointer to a pre-parsed set associated with the variable with + * the given name, or null if there is no such set (as is the case for an + * undefined or string-valued variable). + * @internal + */ + virtual const UnicodeSet* lookupSet(const UnicodeString& /*name*/) const { + return nullptr; + } /** * Lookup the UnicodeMatcher associated with the given character, and @@ -90,7 +100,7 @@ class U_COMMON_API SymbolTable /* not : public UObject because this is an interf * character, or nullptr if there is no mapping for ch. * @stable ICU 2.8 */ - virtual const UnicodeFunctor* lookupMatcher(UChar32 ch) const = 0; + virtual const UnicodeFunctor* lookupMatcher(UChar32 ch) const U_LIFETIME_BOUND = 0; /** * Parse a symbol reference name from the given string, starting diff --git a/deps/icu-small/source/common/unicode/ubidi.h b/deps/icu-small/source/common/unicode/ubidi.h index 536f4172bc20..5081370024ce 100644 --- a/deps/icu-small/source/common/unicode/ubidi.h +++ b/deps/icu-small/source/common/unicode/ubidi.h @@ -19,6 +19,7 @@ #ifndef UBIDI_H #define UBIDI_H +#include "unicode/unistr.h" #include "unicode/utypes.h" #include "unicode/uchar.h" @@ -1348,8 +1349,8 @@ ubidi_getBaseDirection(const UChar *text, int32_t length ); * @see ubidi_setLine * @stable ICU 2.0 */ -U_CAPI const UChar * U_EXPORT2 -ubidi_getText(const UBiDi *pBiDi); +U_CAPI const UChar* U_EXPORT2 +ubidi_getText(const UBiDi* pBiDi); /** * Get the length of the text. @@ -1498,8 +1499,8 @@ ubidi_getLevelAt(const UBiDi *pBiDi, int32_t charIndex); * @see ubidi_getProcessedLength * @stable ICU 2.0 */ -U_CAPI const UBiDiLevel * U_EXPORT2 -ubidi_getLevels(UBiDi *pBiDi, UErrorCode *pErrorCode); +U_CAPI const UBiDiLevel* U_EXPORT2 +ubidi_getLevels(UBiDi* pBiDi, UErrorCode* pErrorCode); /** * Get a logical run. @@ -2208,4 +2209,179 @@ ubidi_writeReverse(const UChar *src, int32_t srcLength, /*#define BIDI_SAMPLE_CODE*/ /*@}*/ +/* Utilities for MessageFormat ------------------------------------------------*/ + +#if U_SHOW_CPLUSPLUS_API + +U_NAMESPACE_BEGIN + +/** + * Used to denote the directionality of the input to a function. + * + * See https://github.com/unicode-org/message-format-wg/blob/main/spec/u-namespace.md#udir + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ +typedef enum UMFBidiOption { + /** + * Left-to-right directionality. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_OPTION_LTR = 0, + /** + * Right-to-left directionality. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_OPTION_RTL, + /** + * Directionality determined from expression contents. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_OPTION_AUTO, + /** + * Directionality inherited from the message without + * requiring isolation of the expression value. + * (Default when no u:dir option is present.) + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_OPTION_INHERIT +} UMFBidiOption; + +/** + * Used to represent the directionality of a message, where + * the AUTO setting has been resolved based on locale. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ +typedef enum UMFDirectionality { + /** + * Denotes a left-to-right message. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_DIRECTIONALITY_LTR = 0, + /** + * Denotes a right-to-left message. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_DIRECTIONALITY_RTL, + /** + * Denotes a message with unknown directionality. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_DIRECTIONALITY_UNKNOWN, + U_MF_DIRECTIONALITY_DEFAULT = U_MF_DIRECTIONALITY_UNKNOWN +} UMFDirectionality; + +/** + * Used in conjunction with the + * MessageFormatter::Builder::setBidiIsolationStrategy() method. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ +typedef enum UMFBidiIsolationStrategy { + /** + * Do not perform bidi isolation. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_OFF = 0, + /** + * Perform bidi isolation using the "default" strategy + * described in the MF2 specification (default). + * https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#handling-bidirectional-text + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_AUTO, + U_MF_BIDI_DEFAULT = U_MF_BIDI_AUTO +} UMFBidiIsolationStrategy; + +/** + * Used in conjunction with the + * MessageFormatter::Builder::setBidiIsolationStyle() method. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ +typedef enum UMFBidiIsolationStyle { + /** + * Insert bidi control characters for isolation. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_STYLE_CONTROL = 0, + /** + * Insert HTML markup tags for isolation. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_STYLE_HTML, + U_MF_BIDI_STYLE_DEFAULT = U_MF_BIDI_STYLE_CONTROL +} UMFBidiIsolationStyle; + +/** + * Convert a string to a UMFBidiOption, representing text directionality. + * + * @param s A string. + * + * @return U_MF_BIDI_OPTION_LTR if s is "ltr", U_MF_BIDI_OPTION_RTL if s is "rtl", + * U_MF_BIDI_OPTION_AUTO if s is "auto", or U_MF_BIDI_OPTION_INHERIT otherwise. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ +U_CAPI UMFBidiOption U_EXPORT2 +ubidi_getMFOption(const UnicodeString& s); + +/** + * Isolate a string according to the "Default Bidi Strategy" from the MessageFormat + * specification https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#handling-bidirectional-text + * + * @param bidiIsolationStrategy Isolation strategy to use. + * @param msgdir The directionality of the message. + * @param bidiIsolationStyle The isolation style to use for the output. + * @param uDirOption The directionality set with the u:dir option on the source + * expression. + * @param dir The directionality of fmt -- each function can set the + * directionality of the resolved value of its result. + * @param fmt String to isolate. + * + * @return A pointer to a string bidi-isolated according to bidiIsolationStrategy. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ +U_CAPI UnicodeString* U_EXPORT2 +ubidi_isolate(UMFBidiIsolationStrategy bidiIsolationStrategy, + UMFDirectionality msgdir, + UMFBidiIsolationStyle bidiIsolationStyle, + UMFBidiOption uDirOption, + UMFDirectionality dir, + UnicodeString& fmt); + +U_NAMESPACE_END + +#endif + #endif diff --git a/deps/icu-small/source/common/unicode/ubrk.h b/deps/icu-small/source/common/unicode/ubrk.h index 2b3dc7aa5768..d512f022c660 100644 --- a/deps/icu-small/source/common/unicode/ubrk.h +++ b/deps/icu-small/source/common/unicode/ubrk.h @@ -579,7 +579,8 @@ ubrk_getRuleStatusVec(UBreakIterator *bi, int32_t *fillInVec, int32_t capacity, * @stable ICU 2.8 */ U_CAPI const char* U_EXPORT2 -ubrk_getLocaleByType(const UBreakIterator *bi, ULocDataLocaleType type, UErrorCode* status); +ubrk_getLocaleByType(const UBreakIterator* bi U_LIFETIME_BOUND, + ULocDataLocaleType type, UErrorCode* status); /** * Set the subject text string upon which the break iterator is operating diff --git a/deps/icu-small/source/common/unicode/ucasemap.h b/deps/icu-small/source/common/unicode/ucasemap.h index 4b623e691071..5c4b62314baa 100644 --- a/deps/icu-small/source/common/unicode/ucasemap.h +++ b/deps/icu-small/source/common/unicode/ucasemap.h @@ -108,8 +108,8 @@ U_NAMESPACE_END * @return locale ID * @stable ICU 3.4 */ -U_CAPI const char * U_EXPORT2 -ucasemap_getLocale(const UCaseMap *csm); +U_CAPI const char* U_EXPORT2 +ucasemap_getLocale(const UCaseMap* csm U_LIFETIME_BOUND); /** * Get the options bit set that is used for case folding and string comparisons. @@ -157,8 +157,8 @@ ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode); * @return titlecasing break iterator * @stable ICU 3.8 */ -U_CAPI const UBreakIterator * U_EXPORT2 -ucasemap_getBreakIterator(const UCaseMap *csm); +U_CAPI const UBreakIterator* U_EXPORT2 +ucasemap_getBreakIterator(const UCaseMap* csm U_LIFETIME_BOUND); /** * Set the break iterator that is used for titlecasing. diff --git a/deps/icu-small/source/common/unicode/ucat.h b/deps/icu-small/source/common/unicode/ucat.h index 93850348fff3..9f3598ed27bb 100644 --- a/deps/icu-small/source/common/unicode/ucat.h +++ b/deps/icu-small/source/common/unicode/ucat.h @@ -150,9 +150,12 @@ u_catclose(u_nl_catd catd); * @stable ICU 2.6 */ U_CAPI const UChar* U_EXPORT2 -u_catgets(u_nl_catd catd, int32_t set_num, int32_t msg_num, - const UChar* s, - int32_t* len, UErrorCode* ec); +u_catgets(u_nl_catd catd U_LIFETIME_BOUND, + int32_t set_num, + int32_t msg_num, + const UChar* s U_LIFETIME_BOUND, + int32_t* len, + UErrorCode* ec); U_CDECL_END diff --git a/deps/icu-small/source/common/unicode/uchar.h b/deps/icu-small/source/common/unicode/uchar.h index d33b8cf7f3c8..7fd270ff2f6d 100644 --- a/deps/icu-small/source/common/unicode/uchar.h +++ b/deps/icu-small/source/common/unicode/uchar.h @@ -61,7 +61,7 @@ U_CDECL_BEGIN * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "17.0" +#define U_UNICODE_VERSION "18.0" /** * \file @@ -2000,6 +2000,23 @@ enum UBlockCode { /** @stable ICU 78 */ UBLOCK_TOLONG_SIKI = 346, /*[11DB0]*/ + // New blocks in Unicode 18.0.0 + + /** @stable ICU 79 */ + UBLOCK_ARCHAIC_CUNEIFORM_NUMERALS = 347, /*[12550]*/ + /** @stable ICU 79 */ + UBLOCK_BENGALI_SUPPLEMENT = 348, /*[11DF0]*/ + /** @stable ICU 79 */ + UBLOCK_JURCHEN = 349, /*[18E00]*/ + /** @stable ICU 79 */ + UBLOCK_JURCHEN_RADICALS = 350, /*[191A0]*/ + /** @stable ICU 79 */ + UBLOCK_MISCELLANEOUS_SYMBOLS_AND_ARROWS_EXTENDED = 351, /*[1DB00]*/ + /** @stable ICU 79 */ + UBLOCK_MUSICAL_SYMBOLS_SUPPLEMENT = 352, /*[1D250]*/ + /** @stable ICU 79 */ + UBLOCK_SEAL = 353, /*[3D000]*/ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UBlockCode value. @@ -2007,7 +2024,7 @@ enum UBlockCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UBLOCK_COUNT = 347, + UBLOCK_COUNT = 354, #endif // U_HIDE_DEPRECATED_API /** @stable ICU 2.0 */ @@ -2306,6 +2323,17 @@ typedef enum UJoiningGroup { U_JG_THIN_NOON, /**< @stable ICU 78 */ + U_JG_CROWN_AIN, /**< @stable ICU 79 */ + U_JG_CROWN_BEH, /**< @stable ICU 79 */ + U_JG_CROWN_FEH, /**< @stable ICU 79 */ + U_JG_CROWN_HAH, /**< @stable ICU 79 */ + U_JG_CROWN_HEH, /**< @stable ICU 79 */ + U_JG_CROWN_KAF, /**< @stable ICU 79 */ + U_JG_CROWN_MEEM, /**< @stable ICU 79 */ + U_JG_CROWN_SAD, /**< @stable ICU 79 */ + U_JG_CROWN_SEEN, /**< @stable ICU 79 */ + U_JG_CROWN_TAH, /**< @stable ICU 79 */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UJoiningGroup value. @@ -2781,6 +2809,15 @@ typedef enum UIndicConjunctBreak { U_INCB_EXTEND, /** @stable ICU 76 */ U_INCB_LINKER, +#ifndef U_HIDE_INTERNAL_API + /** + * One more than the highest normal UIndicConjunctBreak value. + * The highest value is available via u_getIntPropertyMaxValue(UCHAR_INDIC_CONJUNCT_BREAK). + * + * @internal The numeric value may change over time, see ICU ticket #12420. + */ + U_INTERNAL_INCB_COUNT +#endif // U_HIDE_INTERNAL_API } UIndicConjunctBreak; /** diff --git a/deps/icu-small/source/common/unicode/ucharstrie.h b/deps/icu-small/source/common/unicode/ucharstrie.h index ca4b46947045..8047ad3e9f4a 100644 --- a/deps/icu-small/source/common/unicode/ucharstrie.h +++ b/deps/icu-small/source/common/unicode/ucharstrie.h @@ -66,7 +66,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * @param trieUChars The char16_t array that contains the serialized trie. * @stable ICU 4.8 */ - UCharsTrie(ConstChar16Ptr trieUChars) + UCharsTrie(ConstChar16Ptr trieUChars U_LIFETIME_BOUND) : ownedArray_(nullptr), uchars_(trieUChars), pos_(uchars_), remainingMatchLength_(-1) {} @@ -91,7 +91,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * @return *this * @stable ICU 4.8 */ - UCharsTrie &reset() { + UCharsTrie& reset() U_LIFETIME_BOUND { pos_=uchars_; remainingMatchLength_=-1; return *this; @@ -124,7 +124,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * @see reset * @stable ICU 65 */ - UCharsTrie &resetToState64(uint64_t state) { + UCharsTrie& resetToState64(uint64_t state) U_LIFETIME_BOUND { remainingMatchLength_ = static_cast(state >> kState64RemainingShift) - 2; pos_ = uchars_ + (state & kState64PosMask); return *this; @@ -157,7 +157,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * @see resetToState * @stable ICU 4.8 */ - const UCharsTrie &saveState(State &state) const { + const UCharsTrie& saveState(State& state) const U_LIFETIME_BOUND { state.uchars=uchars_; state.pos=pos_; state.remainingMatchLength=remainingMatchLength_; @@ -174,7 +174,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * @see reset * @stable ICU 4.8 */ - UCharsTrie &resetToState(const State &state) { + UCharsTrie& resetToState(const State& state) U_LIFETIME_BOUND { if(uchars_==state.uchars && uchars_!=nullptr) { pos_=state.pos; remainingMatchLength_=state.remainingMatchLength; @@ -304,7 +304,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * function chaining. (See User Guide for details.) * @stable ICU 4.8 */ - Iterator(ConstChar16Ptr trieUChars, int32_t maxStringLength, UErrorCode &errorCode); + Iterator(ConstChar16Ptr trieUChars U_LIFETIME_BOUND, int32_t maxStringLength, UErrorCode& errorCode); /** * Iterates from the current state of the specified UCharsTrie. @@ -330,7 +330,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * @return *this * @stable ICU 4.8 */ - Iterator &reset(); + Iterator& reset() U_LIFETIME_BOUND; /** * @return true if there are more elements. @@ -358,7 +358,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * @return The string for the last successful next(). * @stable ICU 4.8 */ - const UnicodeString &getString() const { return str_; } + const UnicodeString& getString() const U_LIFETIME_BOUND { return str_; } /** * @return The value for the last successful next(). * @stable ICU 4.8 @@ -372,7 +372,9 @@ class U_COMMON_API UCharsTrie : public UMemory { return true; } - const char16_t *branchNext(const char16_t *pos, int32_t length, UErrorCode &errorCode); + const char16_t* branchNext(const char16_t* pos U_LIFETIME_BOUND, + int32_t length, + UErrorCode& errorCode); const char16_t *uchars_; const char16_t *pos_; @@ -428,7 +430,8 @@ class U_COMMON_API UCharsTrie : public UMemory { } return value; } - static inline const char16_t *skipValue(const char16_t *pos, int32_t leadUnit) { + static inline const char16_t* skipValue(const char16_t* pos U_LIFETIME_BOUND, + int32_t leadUnit) { if(leadUnit>=kMinTwoUnitValueLead) { if(leadUnit=kMinTwoUnitNodeValueLead) { if(leadUnit=kMinTwoUnitDeltaLead) { if(delta==kThreeUnitDeltaLead) { @@ -480,7 +484,7 @@ class U_COMMON_API UCharsTrie : public UMemory { return pos+delta; } - static const char16_t *skipDelta(const char16_t *pos) { + static const char16_t* skipDelta(const char16_t* pos U_LIFETIME_BOUND) { int32_t delta=*pos++; if(delta>=kMinTwoUnitDeltaLead) { if(delta==kThreeUnitDeltaLead) { @@ -505,8 +509,10 @@ class U_COMMON_API UCharsTrie : public UMemory { // Helper functions for hasUniqueValue(). // Recursively finds a unique value (or whether there is not a unique one) // from a branch. - static const char16_t *findUniqueValueFromBranch(const char16_t *pos, int32_t length, - UBool haveUniqueValue, int32_t &uniqueValue); + static const char16_t* findUniqueValueFromBranch(const char16_t* pos U_LIFETIME_BOUND, + int32_t length, + UBool haveUniqueValue, + int32_t& uniqueValue); // Recursively finds a unique value (or whether there is not a unique one) // starting from a position on a node lead unit. static UBool findUniqueValue(const char16_t *pos, UBool haveUniqueValue, int32_t &uniqueValue); diff --git a/deps/icu-small/source/common/unicode/ucharstriebuilder.h b/deps/icu-small/source/common/unicode/ucharstriebuilder.h index 5c8aa33ffb39..b0f539673626 100644 --- a/deps/icu-small/source/common/unicode/ucharstriebuilder.h +++ b/deps/icu-small/source/common/unicode/ucharstriebuilder.h @@ -69,7 +69,9 @@ class U_COMMON_API UCharsTrieBuilder : public StringTrieBuilder { * @return *this * @stable ICU 4.8 */ - UCharsTrieBuilder &add(const UnicodeString &s, int32_t value, UErrorCode &errorCode); + UCharsTrieBuilder& add(const UnicodeString& s, + int32_t value, + UErrorCode& errorCode) U_LIFETIME_BOUND; /** * Builds a UCharsTrie for the add()ed data. @@ -116,8 +118,9 @@ class U_COMMON_API UCharsTrieBuilder : public StringTrieBuilder { * @return result * @stable ICU 4.8 */ - UnicodeString &buildUnicodeString(UStringTrieBuildOption buildOption, UnicodeString &result, - UErrorCode &errorCode); + UnicodeString& buildUnicodeString(UStringTrieBuildOption buildOption, + UnicodeString& result U_LIFETIME_BOUND, + UErrorCode& errorCode) U_LIFETIME_BOUND; /** * Removes all (string, value) pairs. @@ -125,7 +128,7 @@ class U_COMMON_API UCharsTrieBuilder : public StringTrieBuilder { * @return *this * @stable ICU 4.8 */ - UCharsTrieBuilder &clear() { + UCharsTrieBuilder& clear() U_LIFETIME_BOUND { strings.remove(); elementsLength=0; ucharsLength=0; diff --git a/deps/icu-small/source/common/unicode/uchriter.h b/deps/icu-small/source/common/unicode/uchriter.h index bd2f29877b99..5e4d96d129db 100644 --- a/deps/icu-small/source/common/unicode/uchriter.h +++ b/deps/icu-small/source/common/unicode/uchriter.h @@ -46,7 +46,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @param length The length of the char16_t array * @stable ICU 2.0 */ - UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length); + UCharCharacterIterator(ConstChar16Ptr textPtr U_LIFETIME_BOUND, int32_t length); /** * Create an iterator over the char16_t array referred to by "textPtr". @@ -61,7 +61,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @param position The starting position of the iteration * @stable ICU 2.0 */ - UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, + UCharCharacterIterator(ConstChar16Ptr textPtr U_LIFETIME_BOUND, int32_t length, int32_t position); /** @@ -80,7 +80,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @param position The starting position of the iteration * @stable ICU 2.0 */ - UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, + UCharCharacterIterator(ConstChar16Ptr textPtr U_LIFETIME_BOUND, int32_t length, int32_t textBegin, int32_t textEnd, int32_t position); @@ -108,8 +108,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the newly created object * @stable ICU 2.0 */ - UCharCharacterIterator& - operator=(const UCharCharacterIterator& that); + UCharCharacterIterator& operator=(const UCharCharacterIterator& that) U_LIFETIME_BOUND; /** * Returns true if the iterators iterate over the same range of the diff --git a/deps/icu-small/source/common/unicode/uclean.h b/deps/icu-small/source/common/unicode/uclean.h index f5b0aa088a94..b29e9d56ac53 100644 --- a/deps/icu-small/source/common/unicode/uclean.h +++ b/deps/icu-small/source/common/unicode/uclean.h @@ -126,7 +126,6 @@ typedef void *U_CALLCONV UMemReallocFn(const void *context, void *mem, size_t si * similar the standard C library free(). * @param context user supplied value, obtained from u_setMemoryFunctions(). * @param mem Pointer to the memory block to be freed. - * @return Pointer to the resized memory block, or NULL if the resizing failed. * @stable ICU 2.8 * @system */ diff --git a/deps/icu-small/source/common/unicode/ucnv.h b/deps/icu-small/source/common/unicode/ucnv.h index 4a7972c95b75..7e9500b339a1 100644 --- a/deps/icu-small/source/common/unicode/ucnv.h +++ b/deps/icu-small/source/common/unicode/ucnv.h @@ -551,11 +551,11 @@ U_CAPI UConverter* U_EXPORT2 ucnv_clone(const UConverter *cnv, UErrorCode *statu * @return pointer to the new clone * @deprecated ICU 71 Use ucnv_clone() instead. */ -U_DEPRECATED UConverter * U_EXPORT2 -ucnv_safeClone(const UConverter *cnv, - void *stackBuffer, - int32_t *pBufferSize, - UErrorCode *status); +U_DEPRECATED UConverter* U_EXPORT2 +ucnv_safeClone(const UConverter* cnv, + void* stackBuffer U_LIFETIME_BOUND, + int32_t* pBufferSize, + UErrorCode* status); /** * \def U_CNV_SAFECLONE_BUFFERSIZE @@ -868,8 +868,8 @@ ucnv_getDisplayName(const UConverter *converter, * @see ucnv_getDisplayName * @stable ICU 2.0 */ -U_CAPI const char * U_EXPORT2 -ucnv_getName(const UConverter *converter, UErrorCode *err); +U_CAPI const char* U_EXPORT2 +ucnv_getName(const UConverter* converter U_LIFETIME_BOUND, UErrorCode* err); /** * Gets a codepage number associated with the converter. This is not guaranteed diff --git a/deps/icu-small/source/common/unicode/ucnvsel.h b/deps/icu-small/source/common/unicode/ucnvsel.h index 9373ec951bf8..e5b34a8e7297 100644 --- a/deps/icu-small/source/common/unicode/ucnvsel.h +++ b/deps/icu-small/source/common/unicode/ucnvsel.h @@ -132,7 +132,7 @@ U_NAMESPACE_END * @stable ICU 4.2 */ U_CAPI UConverterSelector* U_EXPORT2 -ucnvsel_openFromSerialized(const void* buffer, int32_t length, UErrorCode* status); +ucnvsel_openFromSerialized(const void* buffer U_LIFETIME_BOUND, int32_t length, UErrorCode* status); /** * Serialize a selector into a linear buffer. @@ -166,9 +166,11 @@ ucnvsel_serialize(const UConverterSelector* sel, * * @stable ICU 4.2 */ -U_CAPI UEnumeration * U_EXPORT2 -ucnvsel_selectForString(const UConverterSelector* sel, - const UChar *s, int32_t length, UErrorCode *status); +U_CAPI UEnumeration* U_EXPORT2 +ucnvsel_selectForString(const UConverterSelector* sel U_LIFETIME_BOUND, + const UChar* s, + int32_t length, + UErrorCode* status); /** * Select converters that can map all characters in a UTF-8 string, @@ -184,9 +186,11 @@ ucnvsel_selectForString(const UConverterSelector* sel, * * @stable ICU 4.2 */ -U_CAPI UEnumeration * U_EXPORT2 -ucnvsel_selectForUTF8(const UConverterSelector* sel, - const char *s, int32_t length, UErrorCode *status); +U_CAPI UEnumeration* U_EXPORT2 +ucnvsel_selectForUTF8(const UConverterSelector* sel U_LIFETIME_BOUND, + const char* s, + int32_t length, + UErrorCode* status); #endif /* !UCONFIG_NO_CONVERSION */ diff --git a/deps/icu-small/source/common/unicode/ucptrie.h b/deps/icu-small/source/common/unicode/ucptrie.h index dadef79c5120..96c2ef7cae6d 100644 --- a/deps/icu-small/source/common/unicode/ucptrie.h +++ b/deps/icu-small/source/common/unicode/ucptrie.h @@ -201,10 +201,13 @@ typedef enum UCPTrieValueWidth UCPTrieValueWidth; * @see ucptrie_toBinary * @stable ICU 63 */ -U_CAPI UCPTrie * U_EXPORT2 -ucptrie_openFromBinary(UCPTrieType type, UCPTrieValueWidth valueWidth, - const void *data, int32_t length, int32_t *pActualLength, - UErrorCode *pErrorCode); +U_CAPI UCPTrie* U_EXPORT2 +ucptrie_openFromBinary(UCPTrieType type, + UCPTrieValueWidth valueWidth, + const void* data U_LIFETIME_BOUND, + int32_t length, + int32_t* pActualLength, + UErrorCode* pErrorCode); /** * Closes a trie and releases associated memory. diff --git a/deps/icu-small/source/common/unicode/ucurr.h b/deps/icu-small/source/common/unicode/ucurr.h index 5589e7999049..8fe594b9022a 100644 --- a/deps/icu-small/source/common/unicode/ucurr.h +++ b/deps/icu-small/source/common/unicode/ucurr.h @@ -190,7 +190,7 @@ ucurr_unregister(UCurrRegistryKey key, UErrorCode* status); * @stable ICU 2.6 */ U_CAPI const UChar* U_EXPORT2 -ucurr_getName(const UChar* currency, +ucurr_getName(const UChar* currency U_LIFETIME_BOUND, const char* locale, UCurrNameStyle nameStyle, UBool* isChoiceFormat, @@ -215,7 +215,7 @@ ucurr_getName(const UChar* currency, * @stable ICU 4.2 */ U_CAPI const UChar* U_EXPORT2 -ucurr_getPluralName(const UChar* currency, +ucurr_getPluralName(const UChar* currency U_LIFETIME_BOUND, const char* locale, UBool* isChoiceFormat, const char* pluralCount, @@ -461,6 +461,16 @@ ucurr_getKeywordValuesForLocale(const char* key, U_CAPI int32_t U_EXPORT2 ucurr_getNumericCode(const UChar* currency); +/** + * The number of digits to be used when formatting + * a currency amount when the default number of + * digits cannot be determined from the currency name. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ +#define U_CURR_DEFAULT_DIGITS 2 + #endif /* #if !UCONFIG_NO_FORMATTING */ #endif diff --git a/deps/icu-small/source/common/unicode/udata.h b/deps/icu-small/source/common/unicode/udata.h index 4cda255010ad..7a1fa1dad0f6 100644 --- a/deps/icu-small/source/common/unicode/udata.h +++ b/deps/icu-small/source/common/unicode/udata.h @@ -276,8 +276,8 @@ udata_close(UDataMemory *pData); * @param pData The pointer to data memory object * @stable ICU 2.0 */ -U_CAPI const void * U_EXPORT2 -udata_getMemory(UDataMemory *pData); +U_CAPI const void* U_EXPORT2 +udata_getMemory(UDataMemory* pData U_LIFETIME_BOUND); /** * Get the information from the data memory header. diff --git a/deps/icu-small/source/common/unicode/uenum.h b/deps/icu-small/source/common/unicode/uenum.h index d9c893e06d92..a5da825f222f 100644 --- a/deps/icu-small/source/common/unicode/uenum.h +++ b/deps/icu-small/source/common/unicode/uenum.h @@ -111,7 +111,7 @@ uenum_count(UEnumeration* en, UErrorCode* status); * @stable ICU 2.2 */ U_CAPI const UChar* U_EXPORT2 -uenum_unext(UEnumeration* en, +uenum_unext(UEnumeration* en U_LIFETIME_BOUND, int32_t* resultLength, UErrorCode* status); @@ -144,7 +144,7 @@ uenum_unext(UEnumeration* en, * @stable ICU 2.2 */ U_CAPI const char* U_EXPORT2 -uenum_next(UEnumeration* en, +uenum_next(UEnumeration* en U_LIFETIME_BOUND, int32_t* resultLength, UErrorCode* status); @@ -188,8 +188,9 @@ uenum_openFromStringEnumeration(icu::StringEnumeration* adopted, UErrorCode* ec) * @stable ICU 50 */ U_CAPI UEnumeration* U_EXPORT2 -uenum_openUCharStringsEnumeration(const UChar* const strings[], int32_t count, - UErrorCode* ec); +uenum_openUCharStringsEnumeration(U_LIFETIME_BOUND const UChar* const strings[], + int32_t count, + UErrorCode* ec); /** * Given an array of const char* strings (invariant chars only), return a UEnumeration. String pointers from 0..count-1 must not be null. @@ -203,7 +204,8 @@ uenum_openUCharStringsEnumeration(const UChar* const strings[], int32_t count, * @stable ICU 50 */ U_CAPI UEnumeration* U_EXPORT2 -uenum_openCharStringsEnumeration(const char* const strings[], int32_t count, +uenum_openCharStringsEnumeration(U_LIFETIME_BOUND const char* const strings[], + int32_t count, UErrorCode* ec); #endif diff --git a/deps/icu-small/source/common/unicode/uldnames.h b/deps/icu-small/source/common/unicode/uldnames.h index 47b047ece97b..787272535b64 100644 --- a/deps/icu-small/source/common/unicode/uldnames.h +++ b/deps/icu-small/source/common/unicode/uldnames.h @@ -109,8 +109,8 @@ U_NAMESPACE_END * @return the display locale * @stable ICU 4.4 */ -U_CAPI const char * U_EXPORT2 -uldn_getLocale(const ULocaleDisplayNames *ldn); +U_CAPI const char* U_EXPORT2 +uldn_getLocale(const ULocaleDisplayNames* ldn U_LIFETIME_BOUND); /** * Returns the dialect handling used in the display names. diff --git a/deps/icu-small/source/common/unicode/uloc.h b/deps/icu-small/source/common/unicode/uloc.h index 9cd7f5e1b0d6..3486236a8397 100644 --- a/deps/icu-small/source/common/unicode/uloc.h +++ b/deps/icu-small/source/common/unicode/uloc.h @@ -1330,7 +1330,7 @@ uloc_toLanguageTag(const char* localeID, * @stable ICU 54 */ U_CAPI const char* U_EXPORT2 -uloc_toUnicodeLocaleKey(const char* keyword); +uloc_toUnicodeLocaleKey(const char* keyword U_LIFETIME_BOUND); /** * Converts the specified keyword value (legacy type, or BCP 47 @@ -1361,7 +1361,7 @@ uloc_toUnicodeLocaleKey(const char* keyword); * @stable ICU 54 */ U_CAPI const char* U_EXPORT2 -uloc_toUnicodeLocaleType(const char* keyword, const char* value); +uloc_toUnicodeLocaleType(const char* keyword, const char* value U_LIFETIME_BOUND); /** * Converts the specified keyword (BCP 47 Unicode locale extension key, or @@ -1376,7 +1376,7 @@ uloc_toUnicodeLocaleType(const char* keyword, const char* value); * @stable ICU 54 */ U_CAPI const char* U_EXPORT2 -uloc_toLegacyKey(const char* keyword); +uloc_toLegacyKey(const char* keyword U_LIFETIME_BOUND); /** * Converts the specified keyword value (BCP 47 Unicode locale extension type, @@ -1405,6 +1405,6 @@ uloc_toLegacyKey(const char* keyword); * @stable ICU 54 */ U_CAPI const char* U_EXPORT2 -uloc_toLegacyType(const char* keyword, const char* value); +uloc_toLegacyType(const char* keyword, const char* value U_LIFETIME_BOUND); #endif /*_ULOC*/ diff --git a/deps/icu-small/source/common/unicode/ulocale.h b/deps/icu-small/source/common/unicode/ulocale.h index 1b3af3a5f26d..07d600c12e1c 100644 --- a/deps/icu-small/source/common/unicode/ulocale.h +++ b/deps/icu-small/source/common/unicode/ulocale.h @@ -74,7 +74,7 @@ ulocale_close(ULocale* locale); * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 -ulocale_getLanguage(const ULocale* locale); +ulocale_getLanguage(const ULocale* locale U_LIFETIME_BOUND); /** * Returns the locale's ISO-15924 abbreviation script code. @@ -84,7 +84,7 @@ ulocale_getLanguage(const ULocale* locale); * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 -ulocale_getScript(const ULocale* locale); +ulocale_getScript(const ULocale* locale U_LIFETIME_BOUND); /** * Returns the locale's ISO-3166 region code. @@ -94,7 +94,7 @@ ulocale_getScript(const ULocale* locale); * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 -ulocale_getRegion(const ULocale* locale); +ulocale_getRegion(const ULocale* locale U_LIFETIME_BOUND); /** * Returns the locale's variant code. @@ -104,7 +104,7 @@ ulocale_getRegion(const ULocale* locale); * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 -ulocale_getVariant(const ULocale* locale); +ulocale_getVariant(const ULocale* locale U_LIFETIME_BOUND); /** * Returns the programmatic name of the entire locale, with the language, @@ -117,7 +117,7 @@ ulocale_getVariant(const ULocale* locale); * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 -ulocale_getLocaleID(const ULocale* locale); +ulocale_getLocaleID(const ULocale* locale U_LIFETIME_BOUND); /** * Returns the programmatic name of the entire locale as ulocale_getLocaleID() @@ -128,7 +128,7 @@ ulocale_getLocaleID(const ULocale* locale); * @stable ICU 74 */ U_CAPI const char* U_EXPORT2 -ulocale_getBaseName(const ULocale* locale); +ulocale_getBaseName(const ULocale* locale U_LIFETIME_BOUND); /** * Gets the bogus state. Locale object can be bogus if it doesn't exist diff --git a/deps/icu-small/source/common/unicode/ulocbuilder.h b/deps/icu-small/source/common/unicode/ulocbuilder.h index ce61995bde62..3e10c5118bd9 100644 --- a/deps/icu-small/source/common/unicode/ulocbuilder.h +++ b/deps/icu-small/source/common/unicode/ulocbuilder.h @@ -279,7 +279,6 @@ ulocbld_setExtension(ULocaleBuilder* builder, char key, const char* value, int32 * terminated when the length is non-negative) * @param typeLength the length of the type; if negative, then the type need to * be null terminated, - * @return This builder. * @stable ICU 74 */ U_CAPI void U_EXPORT2 diff --git a/deps/icu-small/source/common/unicode/unifilt.h b/deps/icu-small/source/common/unicode/unifilt.h index 0fcaf4b789c4..1c523c873f9f 100644 --- a/deps/icu-small/source/common/unicode/unifilt.h +++ b/deps/icu-small/source/common/unicode/unifilt.h @@ -93,7 +93,7 @@ class U_COMMON_API UnicodeFilter : public UnicodeFunctor, public UnicodeMatcher * and return the pointer. * @stable ICU 2.4 */ - virtual UnicodeMatcher* toMatcher() const override; + virtual UnicodeMatcher* toMatcher() const U_LIFETIME_BOUND override; /** * Implement UnicodeMatcher API. diff --git a/deps/icu-small/source/common/unicode/unifunct.h b/deps/icu-small/source/common/unicode/unifunct.h index 4aeb0f5d7da5..050e8cadeb42 100644 --- a/deps/icu-small/source/common/unicode/unifunct.h +++ b/deps/icu-small/source/common/unicode/unifunct.h @@ -63,7 +63,7 @@ class U_COMMON_API UnicodeFunctor : public UObject { * UnicodeFunctor. * @stable ICU 2.4 */ - virtual UnicodeMatcher* toMatcher() const; + virtual UnicodeMatcher* toMatcher() const U_LIFETIME_BOUND; /** * Cast 'this' to a UnicodeReplacer* pointer and return the @@ -75,7 +75,7 @@ class U_COMMON_API UnicodeFunctor : public UObject { * UnicodeFunctor. * @stable ICU 2.4 */ - virtual UnicodeReplacer* toReplacer() const; + virtual UnicodeReplacer* toReplacer() const U_LIFETIME_BOUND; /** * Return the class ID for this class. This is useful only for diff --git a/deps/icu-small/source/common/unicode/unimatch.h b/deps/icu-small/source/common/unicode/unimatch.h index 302332f4558c..62336cba4472 100644 --- a/deps/icu-small/source/common/unicode/unimatch.h +++ b/deps/icu-small/source/common/unicode/unimatch.h @@ -140,7 +140,7 @@ class U_COMMON_API UnicodeMatcher /* not : public UObject because this is an int * U+000A, U+0020..U+007E. * @stable ICU 2.4 */ - virtual UnicodeString& toPattern(UnicodeString& result, + virtual UnicodeString& toPattern(UnicodeString& result U_LIFETIME_BOUND, UBool escapeUnprintable = false) const = 0; /** diff --git a/deps/icu-small/source/common/unicode/uniset.h b/deps/icu-small/source/common/unicode/uniset.h index f9eb123e0736..38c22e0ae20f 100644 --- a/deps/icu-small/source/common/unicode/uniset.h +++ b/deps/icu-small/source/common/unicode/uniset.h @@ -39,236 +39,126 @@ class UVector; class RuleCharacterIterator; /** - * A mutable set of Unicode characters and multicharacter strings. Objects of this class - * represent character classes used in regular expressions. - * A character specifies a subset of Unicode code points. Legal - * code points are U+0000 to U+10FFFF, inclusive. + * A mutable set of Unicode characters and multicharacter strings. Objects of this class represent + * character classes used in regular expressions. A UnicodeSet specifies a finite set of + * Unicode code point sequences, optimized for single code points. + * + *

Note: method freeze() will not only make the set immutable, but also makes important methods + * much higher performance: contains(c), containsNone(...), span(...), spanBack(...) etc. After the + * object is frozen, any subsequent call that wants to change the object will throw + * UnsupportedOperationException. * *

The UnicodeSet class is not designed to be subclassed. * - *

UnicodeSet supports two APIs. The first is the - * operand API that allows the caller to modify the value of - * a UnicodeSet object. It conforms to Java 2's - * java.util.Set interface, although - * UnicodeSet does not actually implement that - * interface. All methods of Set are supported, with the - * modification that they take a character range or single character - * instead of an Object, and they take a - * UnicodeSet instead of a Collection. The - * operand API may be thought of in terms of boolean logic: a boolean - * OR is implemented by add, a boolean AND is implemented - * by retain, a boolean XOR is implemented by - * complement taking an argument, and a boolean NOT is - * implemented by complement with no argument. In terms - * of traditional set theory function names, add is a - * union, retain is an intersection, remove - * is an asymmetric difference, and complement with no - * argument is a set complement with respect to the superset range - * MIN_VALUE-MAX_VALUE + *

UnicodeSet supports two APIs. The first is the operand API that allows + * the caller to modify the value of a UnicodeSet object. It conforms to Java 2's + * java.util.Set interface, although UnicodeSet does not actually + * implement that interface. All methods of Set are supported, with the modification + * that they take a character range, a single character, or a string instead of an Object + * , and they take a UnicodeSet instead of a Collection. The + * operand API may be thought of in terms of boolean logic: a boolean OR is implemented by add + * , a boolean AND is implemented by retain, a boolean XOR is implemented by + * complement + * taking an argument, and a boolean NOT is implemented by complement with no + * argument. In terms of traditional set theory function names, add is a union, + * retain is an intersection, remove is an asymmetric difference, and + * complement with no argument is a set complement with respect to the superset range + * MIN_VALUE-MAX_VALUE. * - *

The second API is the - * applyPattern()/toPattern() API from the - * java.text.Format-derived classes. Unlike the - * methods that add characters, add categories, and control the logic - * of the set, the method applyPattern() sets all - * attributes of a UnicodeSet at once, based on a - * string pattern. + *

The second API for building up a UnicodeSet is the applyPattern()/ + * toPattern() API from the + * java.text.Format-derived classes. Unlike the methods that add characters, add categories, + * and control the logic of the set, the method applyPattern() sets all attributes of a + * UnicodeSet at once, based on a pattern string. * - *

Pattern syntax

+ *

Pattern syntax Pattern strings are accepted by the constructors and the {@link + * #applyPattern()} methods and returned by the {@link #toPattern()} method. These patterns follow + * the UnicodeSet syntax defined by Draft Unicode + * Technical Standard #61, UnicodeSet notation. * - * Patterns are accepted by the constructors and the - * applyPattern() methods and returned by the - * toPattern() method. These patterns follow a syntax - * similar to that employed by version 8 regular expression character - * classes. Here are some simple examples: + *

* - * \htmlonly
\endhtmlonly - * - * - * - * - * - * - * - * - * - * + *
[]No characters
[a]The character 'a'
[ae]The characters 'a' and 'e'
+ * + * + * + * + * + * + * + * + * * * - * - * + * * * - * - * + * + * * * - * - * + * * * - * - * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * * *
[]No characters
[a]The character 'a'
[ae]The characters 'a' and 'e'
[a-e]The characters 'a' through 'e' inclusive, in Unicode code + * [a-e]The characters 'a' through 'e' inclusive, in Unicode code * point order
[\\u4E01]The character U+4E01[\\u4E01]The character U+4E01
[a{ab}{ac}]The character 'a' and the multicharacter strings "ab" and + * [a{ab}{ac}]The character 'a' and the multicharacter strings "ab" and * "ac"
[\\p{Lu}]All characters in the general category Uppercase Letter[\\p{Lu}]All characters in the general category Uppercase Letter
[[:Letter:][:Number_Letter:]]All characters that have a General_Category in the Letter grouping or have the General_Category Number_Letter
[[:Word_Break=ALetter:]-[:Letter:]]All characters with a Word_Break property assignment of ALetter that do not have a General_Category in the Letter grouping
[\\p{Greek}&\\p{Letter}]All characters with a Script property assignment of Greek whose General_Category is in the Letter grouping
[^a]All code points except U+0061 'a'.
- * \htmlonly
\endhtmlonly * - * Any character may be preceded by a backslash in order to remove any special - * meaning. White space characters, as defined by UCharacter.isWhitespace(), are - * ignored, unless they are escaped. + *
* - *

Property patterns specify a set of characters having a certain - * property as defined by the Unicode standard. Both the POSIX-like - * "[:Lu:]" and the Perl-like syntax "\\p{Lu}" are recognized. For a - * complete list of supported property patterns, see the User's Guide - * for UnicodeSet at - * - * https://unicode-org.github.io/icu/userguide/strings/unicodeset. - * Actual determination of property data is defined by the underlying - * Unicode database as implemented by UCharacter. + * Most characters may be preceded by a backslash in order to remove any special meaning. Unescaped + * white space characters, as defined by the Unicode Pattern_White_Space property, are ignored + * outside of string literals, except insofar as they separate lexical elements. * - *

Patterns specify individual characters, ranges of characters, and - * Unicode property sets. When elements are concatenated, they - * specify their union. To complement a set, place a '^' immediately - * after the opening '['. Property patterns are inverted by modifying - * their delimiters; "[:^foo]" and "\\P{foo}". In any other location, - * '^' has no special meaning. + *

Property queries specify a set of characters having a certain property as defined by the + * Unicode standard. Both the POSIX-like "[:Lu:]" and the Perl-like syntax "\\p{Lu}" are recognized. * - *

Since ICU 70, "[^...]", "[:^foo]", "\\P{foo}", and "[:binaryProperty=No:]" - * perform a “code point complement” (all code points minus the original set), - * removing all multicharacter strings, - * equivalent to .complement().removeAllStrings(). - * The complement() API function continues to perform a - * symmetric difference with all code points and thus retains all multicharacter strings. + *

As shown in the examples above, UnicodeSet syntax supports some set operations: the union of + * sets 𝑋 and 𝑌 union is written [𝑋𝑌], their intersection [𝑋&𝑌], and their asymmetric set + * difference (the complement of 𝑌 in 𝑋) is [𝑋-𝑌]. The code point complement of 𝑋, equivalent + * to .{@link #complement()}.{@link #removeAllStrings()}, is written [^𝑋]. * - *

Ranges are indicated by placing two a '-' between two - * characters, as in "a-z". This specifies the range of all - * characters from the left to the right, in Unicode order. If the - * left character is greater than or equal to the - * right character it is a syntax error. If a '-' occurs as the first - * character after the opening '[' or '[^', or if it occurs as the - * last character before the closing ']', then it is taken as a - * literal. Thus "[a\-b]", "[-ab]", and "[ab-]" all indicate the same - * set of three characters, 'a', 'b', and '-'. + *

Ranges are indicated by placing a '-' between two characters, as in "a-z". This specifies the + * range of all characters from the left to the right, in code point order. * - *

Sets may be intersected using the '&' operator or the asymmetric - * set difference may be taken using the '-' operator, for example, - * "[[:L:]&[\\u0000-\\u0FFF]]" indicates the set of all Unicode letters - * with values less than 4096. Operators ('&' and '|') have equal - * precedence and bind left-to-right. Thus - * "[[:L:]-[a-z]-[\\u0100-\\u01FF]]" is equivalent to - * "[[[:L:]-[a-z]]-[\\u0100-\\u01FF]]". This only really matters for - * difference; intersection is commutative. - * - * - *
[a]The set containing 'a' - *
[a-z]The set containing 'a' - * through 'z' and all letters in between, in Unicode order - *
[^a-z]The set containing - * all characters but 'a' through 'z', - * that is, U+0000 through 'a'-1 and 'z'+1 through U+10FFFF - *
[[pat1][pat2]] - * The union of sets specified by pat1 and pat2 - *
[[pat1]&[pat2]] - * The intersection of sets specified by pat1 and pat2 - *
[[pat1]-[pat2]] - * The asymmetric difference of sets specified by pat1 and - * pat2 - *
[:Lu:] or \\p{Lu} - * The set of characters having the specified - * Unicode property; in - * this case, Unicode uppercase letters - *
[:^Lu:] or \\P{Lu} - * The set of characters not having the given - * Unicode property - *
+ *

Formal specification * - *

Formal syntax

+ *

This class is a conformant and consistent implementation of UnicodeSet notation as defined in + * Draft Unicode Technical Standard #61, UnicodeSet + * notation. It supports only property queries that are recommended for general-purpose APIs + * (that is, it does not support the productions with a gray background in the grammar). The set of + * supported properties, and additional restrictions, are described in the User Guide UnicodeSet / + * Restrictions. * - * \htmlonly

\endhtmlonly - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
pattern :=  ('[' '^'? item* ']') | - * property
item :=  char | (char '-' char) | pattern-expr
- *
pattern-expr :=  pattern | pattern-expr pattern | - * pattern-expr op pattern
- *
op :=  '&' | '-'
- *
special :=  '[' | ']' | '-'
- *
char :=  any character that is not special
- * | ('\'
any character)
- * | ('\\u' hex hex hex hex)
- *
hex :=  '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' |
- *     'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f'
property :=  a Unicode property set pattern
- *
- * - * - * - * - *
Legend: - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
a := b  a may be replaced by b
a?zero or one instance of a
- *
a*one or more instances of a
- *
a | beither a or b
- *
'a'the literal string between the quotes
- *
- * \htmlonly
\endhtmlonly + *

It implements a number of pure extensions documented in the User Guide at UnicodeSet / + * Extensions. In particular, the support for variables interacts with the API: If a {@link + * SymbolTable} is passed to the constructor of {@code UnicodeSet}, a lexical element variable is + * introduced, whose definition is given by the implementation of {@link + * SymbolTable#parseReference}. * *

Note: * - Most UnicodeSet methods do not take a UErrorCode parameter because @@ -482,7 +372,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * A frozen set will not be modified. * @stable ICU 2.0 */ - UnicodeSet& operator=(const UnicodeSet& o); + UnicodeSet& operator=(const UnicodeSet& o) U_LIFETIME_BOUND; /** * Compares the specified object with this set for equality. Returns @@ -532,7 +422,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * * @stable ICU 4.2 */ - inline static UnicodeSet *fromUSet(USet *uset); + inline static UnicodeSet* fromUSet(USet* uset U_LIFETIME_BOUND); /** * Get a UnicodeSet pointer from a const USet @@ -542,8 +432,8 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * * @stable ICU 4.2 */ - inline static const UnicodeSet *fromUSet(const USet *uset); - + inline static const UnicodeSet* fromUSet(const USet* uset U_LIFETIME_BOUND); + /** * Produce a USet * pointer for this UnicodeSet. * USet is the plain C type for UnicodeSet @@ -551,8 +441,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return a USet pointer for this UnicodeSet * @stable ICU 4.2 */ - inline USet *toUSet(); - + inline USet* toUSet() U_LIFETIME_BOUND; /** * Produce a const USet * pointer for this UnicodeSet. @@ -561,7 +450,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return a const USet pointer for this UnicodeSet * @stable ICU 4.2 */ - inline const USet * toUSet() const; + inline const USet* toUSet() const U_LIFETIME_BOUND; //---------------------------------------------------------------- @@ -591,7 +480,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see cloneAsThawed * @stable ICU 3.8 */ - UnicodeSet *freeze(); + UnicodeSet* freeze() U_LIFETIME_BOUND; /** * Clone the set and make the clone mutable. @@ -616,7 +505,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @param end last character in the set, inclusive * @stable ICU 2.4 */ - UnicodeSet& set(UChar32 start, UChar32 end); + UnicodeSet& set(UChar32 start, UChar32 end) U_LIFETIME_BOUND; /** * Return true if the given position, in the given pattern, appears @@ -638,8 +527,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return a reference to this * @stable ICU 2.0 */ - UnicodeSet& applyPattern(const UnicodeString& pattern, - UErrorCode& status); + UnicodeSet& applyPattern(const UnicodeString& pattern, UErrorCode& status) U_LIFETIME_BOUND; #ifndef U_HIDE_INTERNAL_API /** @@ -663,7 +551,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { UnicodeSet& applyPattern(const UnicodeString& pattern, uint32_t options, const SymbolTable* symbols, - UErrorCode& status); + UErrorCode& status) U_LIFETIME_BOUND; #endif /* U_HIDE_INTERNAL_API */ /** @@ -703,7 +591,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { ParsePosition& pos, uint32_t options, const SymbolTable* symbols, - UErrorCode& status); + UErrorCode& status) U_LIFETIME_BOUND; /** * Returns a string representation of this set. If the result of @@ -718,7 +606,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * U+000A, U+0020..U+007E. * @stable ICU 2.0 */ - virtual UnicodeString& toPattern(UnicodeString& result, + virtual UnicodeString& toPattern(UnicodeString& result U_LIFETIME_BOUND, UBool escapeUnprintable = false) const override; /** @@ -745,7 +633,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { */ UnicodeSet& applyIntPropertyValue(UProperty prop, int32_t value, - UErrorCode& ec); + UErrorCode& ec) U_LIFETIME_BOUND; /** * Modifies this set to contain those code points which have the @@ -778,7 +666,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { */ UnicodeSet& applyPropertyAlias(const UnicodeString& prop, const UnicodeString& value, - UErrorCode& ec); + UErrorCode& ec) U_LIFETIME_BOUND; /** * Returns the number of elements in this set (its cardinality). @@ -1119,7 +1007,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see begin * @see end */ - inline U_HEADER_NESTED_NAMESPACE::USetCodePoints codePoints() const { + inline U_HEADER_NESTED_NAMESPACE::USetCodePoints codePoints() const U_LIFETIME_BOUND { return U_HEADER_NESTED_NAMESPACE::USetCodePoints(toUSet()); } @@ -1145,7 +1033,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see begin * @see end */ - inline U_HEADER_NESTED_NAMESPACE::USetRanges ranges() const { + inline U_HEADER_NESTED_NAMESPACE::USetRanges ranges() const U_LIFETIME_BOUND { return U_HEADER_NESTED_NAMESPACE::USetRanges(toUSet()); } @@ -1169,11 +1057,10 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see begin * @see end */ - inline U_HEADER_NESTED_NAMESPACE::USetStrings strings() const { + inline U_HEADER_NESTED_NAMESPACE::USetStrings strings() const U_LIFETIME_BOUND { return U_HEADER_NESTED_NAMESPACE::USetStrings(toUSet()); } -#ifndef U_HIDE_DRAFT_API /** * Returns a C++ iterator for iterating over all of the elements of this set. * Convenient all-in one iteration, but creates a std::u16string for each @@ -1192,28 +1079,27 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * \endcode * * @return an all-elements iterator. - * @draft ICU 77 + * @stable ICU 77 * @see end * @see codePoints * @see ranges * @see strings */ - inline U_HEADER_NESTED_NAMESPACE::USetElementIterator begin() const { + inline U_HEADER_NESTED_NAMESPACE::USetElementIterator begin() const U_LIFETIME_BOUND { return U_HEADER_NESTED_NAMESPACE::USetElements(toUSet()).begin(); } /** * @return an exclusive-end sentinel for iterating over all of the elements of this set. - * @draft ICU 77 + * @stable ICU 77 * @see begin * @see codePoints * @see ranges * @see strings */ - inline U_HEADER_NESTED_NAMESPACE::USetElementIterator end() const { + inline U_HEADER_NESTED_NAMESPACE::USetElementIterator end() const U_LIFETIME_BOUND { return U_HEADER_NESTED_NAMESPACE::USetElements(toUSet()).end(); } -#endif // U_HIDE_DRAFT_API /** * Adds the specified range to this set if it is not already @@ -1229,7 +1115,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * to this set. * @stable ICU 2.0 */ - UnicodeSet& add(UChar32 start, UChar32 end); + UnicodeSet& add(UChar32 start, UChar32 end) U_LIFETIME_BOUND; /** * Adds the specified character to this set if it is not already @@ -1241,7 +1127,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.0 */ - UnicodeSet& add(UChar32 c); + UnicodeSet& add(UChar32 c) U_LIFETIME_BOUND; /** * Adds the specified multicharacter to this set if it is not already @@ -1254,7 +1140,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.4 */ - UnicodeSet& add(const UnicodeString& s); + UnicodeSet& add(const UnicodeString& s) U_LIFETIME_BOUND; private: /** @@ -1275,7 +1161,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.4 */ - UnicodeSet& addAll(const UnicodeString& s); + UnicodeSet& addAll(const UnicodeString& s) U_LIFETIME_BOUND; /** * Retains EACH of the characters in this string. Note: "ch" == {"c", "h"} @@ -1284,7 +1170,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.4 */ - UnicodeSet& retainAll(const UnicodeString& s); + UnicodeSet& retainAll(const UnicodeString& s) U_LIFETIME_BOUND; /** * Complement EACH of the characters in this string. Note: "ch" == {"c", "h"} @@ -1293,7 +1179,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.4 */ - UnicodeSet& complementAll(const UnicodeString& s); + UnicodeSet& complementAll(const UnicodeString& s) U_LIFETIME_BOUND; /** * Remove EACH of the characters in this string. Note: "ch" == {"c", "h"} @@ -1302,7 +1188,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.4 */ - UnicodeSet& removeAll(const UnicodeString& s); + UnicodeSet& removeAll(const UnicodeString& s) U_LIFETIME_BOUND; /** * Makes a set from a multicharacter string. Thus "ch" => {"ch"} @@ -1335,7 +1221,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @param end last character, inclusive, of range * @stable ICU 2.0 */ - UnicodeSet& retain(UChar32 start, UChar32 end); + UnicodeSet& retain(UChar32 start, UChar32 end) U_LIFETIME_BOUND; /** @@ -1346,7 +1232,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.0 */ - UnicodeSet& retain(UChar32 c); + UnicodeSet& retain(UChar32 c) U_LIFETIME_BOUND; /** * Retains only the specified string from this set if it is present. @@ -1358,7 +1244,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 69 */ - UnicodeSet& retain(const UnicodeString &s); + UnicodeSet& retain(const UnicodeString& s) U_LIFETIME_BOUND; /** * Removes the specified range from this set if it is present. @@ -1373,7 +1259,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * from this set. * @stable ICU 2.0 */ - UnicodeSet& remove(UChar32 start, UChar32 end); + UnicodeSet& remove(UChar32 start, UChar32 end) U_LIFETIME_BOUND; /** * Removes the specified character from this set if it is present. @@ -1385,7 +1271,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.0 */ - UnicodeSet& remove(UChar32 c); + UnicodeSet& remove(UChar32 c) U_LIFETIME_BOUND; /** * Removes the specified string from this set if it is present. @@ -1396,7 +1282,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.4 */ - UnicodeSet& remove(const UnicodeString& s); + UnicodeSet& remove(const UnicodeString& s) U_LIFETIME_BOUND; /** * This is equivalent to @@ -1410,7 +1296,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * A frozen set will not be modified. * @stable ICU 2.0 */ - UnicodeSet& complement(); + UnicodeSet& complement() U_LIFETIME_BOUND; /** * Complements the specified range in this set. Any character in @@ -1424,7 +1310,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @param end last character, inclusive, of range * @stable ICU 2.0 */ - UnicodeSet& complement(UChar32 start, UChar32 end); + UnicodeSet& complement(UChar32 start, UChar32 end) U_LIFETIME_BOUND; /** * Complements the specified character in this set. The character @@ -1436,7 +1322,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.0 */ - UnicodeSet& complement(UChar32 c); + UnicodeSet& complement(UChar32 c) U_LIFETIME_BOUND; /** * Complement the specified string in this set. @@ -1447,7 +1333,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return this object, for chaining * @stable ICU 2.4 */ - UnicodeSet& complement(const UnicodeString& s); + UnicodeSet& complement(const UnicodeString& s) U_LIFETIME_BOUND; /** * Adds all of the elements in the specified set to this set if @@ -1461,7 +1347,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @see #add(UChar32, UChar32) * @stable ICU 2.0 */ - UnicodeSet& addAll(const UnicodeSet& c); + UnicodeSet& addAll(const UnicodeSet& c) U_LIFETIME_BOUND; /** * Retains only the elements in this set that are contained in the @@ -1474,7 +1360,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @param c set that defines which elements this set will retain. * @stable ICU 2.0 */ - UnicodeSet& retainAll(const UnicodeSet& c); + UnicodeSet& retainAll(const UnicodeSet& c) U_LIFETIME_BOUND; /** * Removes from this set all of its elements that are contained in the @@ -1487,7 +1373,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * this set. * @stable ICU 2.0 */ - UnicodeSet& removeAll(const UnicodeSet& c); + UnicodeSet& removeAll(const UnicodeSet& c) U_LIFETIME_BOUND; /** * Complements in this set all elements contained in the specified @@ -1499,7 +1385,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * this set. * @stable ICU 2.4 */ - UnicodeSet& complementAll(const UnicodeSet& c); + UnicodeSet& complementAll(const UnicodeSet& c) U_LIFETIME_BOUND; /** * Removes all of the elements from this set. This set will be @@ -1507,7 +1393,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * A frozen set will not be modified. * @stable ICU 2.0 */ - UnicodeSet& clear(); + UnicodeSet& clear() U_LIFETIME_BOUND; /** * Close this set over the given attribute. For the attribute @@ -1536,7 +1422,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return a reference to this set. * @stable ICU 4.2 */ - UnicodeSet& closeOver(int32_t attribute); + UnicodeSet& closeOver(int32_t attribute) U_LIFETIME_BOUND; /** * Remove all strings from this set. @@ -1544,7 +1430,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * @return a reference to this set. * @stable ICU 4.2 */ - UnicodeSet &removeAllStrings(); + UnicodeSet& removeAllStrings() U_LIFETIME_BOUND; /** * Iteration method that returns the number of ranges contained in @@ -1629,7 +1515,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { * A frozen set will not be modified. * @stable ICU 2.4 */ - UnicodeSet& compact(); + UnicodeSet& compact() U_LIFETIME_BOUND; /** * Return the class ID for this class. This is useful only for @@ -1660,7 +1546,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { friend class USetAccess; - const UnicodeString* getString(int32_t index) const; + const UnicodeString* getString(int32_t index) const U_LIFETIME_BOUND; //---------------------------------------------------------------- // RuleBasedTransliterator support @@ -1683,7 +1569,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { //---------------------------------------------------------------- UnicodeSet(const UnicodeSet& o, UBool /* asThawed */); - UnicodeSet& copyFrom(const UnicodeSet& o, UBool asThawed); + UnicodeSet& copyFrom(const UnicodeSet& o, UBool asThawed) U_LIFETIME_BOUND; //---------------------------------------------------------------- // Implementation: Pattern parsing @@ -1694,13 +1580,58 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { const SymbolTable* symbols, UErrorCode& status); - void applyPattern(RuleCharacterIterator& chars, - const SymbolTable* symbols, - UnicodeString& rebuiltPat, + void applyPattern(const UnicodeString &pattern, + const ParsePosition& parsePosition, + RuleCharacterIterator &chars, + const SymbolTable *symbols, + UnicodeString &rebuiltPat, uint32_t options, - UnicodeSet& (UnicodeSet::*caseClosure)(int32_t attribute), - int32_t depth, - UErrorCode& ec); + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute), + UErrorCode &ec); + + // Recursive-descent predictive parsing. These functions parse the syntactic categories + // matching their name in the base grammar of PD UTR #56 (before the highlighted changes are + // applied). + // See https://www.unicode.org/reports/tr61/tr61-1.html#Set-Operations. + // `parseUnicodeSet` clears `*this` and makes it represent the parsed UnicodeSet; all other functions + // add the set represented by the parsed construct to `*this`. + + class Lexer; + + static UnicodeSet parseUnicodeSet(Lexer &lexer, + UnicodeString &rebuiltPat, + uint32_t options, + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute), + int32_t depth, + UErrorCode &ec); + + static UnicodeSet parseContent(Lexer &lexer, + UnicodeString &rebuiltPat, + uint32_t options, + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute), + int32_t depth, + bool &containsSetOperation, + UErrorCode &ec); + + void parseMutation(Lexer &lexer, + UnicodeString &rebuiltPat, + uint32_t options, + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute), + int32_t depth, + bool &containsSetOperation, + UErrorCode &ec); + + void parseSetOperations(Lexer &lexer, + UnicodeString &rebuiltPat, + uint32_t options, + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute), + int32_t depth, + UErrorCode &ec); + + static UnicodeSet parseElements(Lexer &lexer, + UnicodeString &rebuiltPat, + UErrorCode &ec); + void closeOverCaseInsensitive(bool simple); void closeOverAddCaseMappings(); @@ -1721,10 +1652,10 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { int32_t stringsSize() const; UBool stringsContains(const UnicodeString &s) const; - UnicodeString& _toPattern(UnicodeString& result, + UnicodeString& _toPattern(UnicodeString& result U_LIFETIME_BOUND, UBool escapeUnprintable) const; - UnicodeString& _generatePattern(UnicodeString& result, + UnicodeString& _generatePattern(UnicodeString& result U_LIFETIME_BOUND, UBool escapeUnprintable) const; static void _appendToPat(UnicodeString& buf, const UnicodeString& s, UBool escapeUnprintable); @@ -1752,9 +1683,6 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { static UBool resemblesPropertyPattern(const UnicodeString& pattern, int32_t pos); - static UBool resemblesPropertyPattern(RuleCharacterIterator& chars, - int32_t iterOpts); - /** * Parse the given property pattern at the given parse position * and set this UnicodeSet to the result. @@ -1796,11 +1724,7 @@ class U_COMMON_API UnicodeSet final : public UnicodeFilter { */ UnicodeSet& applyPropertyPattern(const UnicodeString& pattern, ParsePosition& ppos, - UErrorCode &ec); - - void applyPropertyPattern(RuleCharacterIterator& chars, - UnicodeString& rebuiltPat, - UErrorCode& ec); + UErrorCode& ec) U_LIFETIME_BOUND; /** * A filter that returns true if the given code point should be @@ -1863,19 +1787,19 @@ inline UBool UnicodeSet::isBogus() const { return fFlags & kIsBogus; } -inline UnicodeSet *UnicodeSet::fromUSet(USet *uset) { +inline UnicodeSet* UnicodeSet::fromUSet(USet* uset U_LIFETIME_BOUND) { return reinterpret_cast(uset); } -inline const UnicodeSet *UnicodeSet::fromUSet(const USet *uset) { +inline const UnicodeSet* UnicodeSet::fromUSet(const USet* uset U_LIFETIME_BOUND) { return reinterpret_cast(uset); } -inline USet *UnicodeSet::toUSet() { - return reinterpret_cast(this); +inline USet* UnicodeSet::toUSet() U_LIFETIME_BOUND { + return reinterpret_cast(this); } -inline const USet *UnicodeSet::toUSet() const { +inline const USet* UnicodeSet::toUSet() const U_LIFETIME_BOUND { return reinterpret_cast(this); } diff --git a/deps/icu-small/source/common/unicode/unistr.h b/deps/icu-small/source/common/unicode/unistr.h index 161b84527a60..bf1e98ec488d 100644 --- a/deps/icu-small/source/common/unicode/unistr.h +++ b/deps/icu-small/source/common/unicode/unistr.h @@ -1739,7 +1739,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a read-only alias UnicodeString object for the substring * @stable ICU 4.4 */ - UnicodeString tempSubString(int32_t start=0, int32_t length=INT32_MAX) const; + UnicodeString tempSubString(int32_t start=0, int32_t length=INT32_MAX) const U_LIFETIME_BOUND; /** * Create a temporary substring for the specified range. @@ -1751,7 +1751,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a read-only alias UnicodeString object for the substring * @stable ICU 4.4 */ - inline UnicodeString tempSubStringBetween(int32_t start, int32_t limit=INT32_MAX) const; + inline UnicodeString tempSubStringBetween(int32_t start, + int32_t limit = INT32_MAX) const U_LIFETIME_BOUND; /** * Convert the UnicodeString to UTF-8 and write the result @@ -1779,8 +1780,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 4.2 * @see toUTF8 */ - template - StringClass &toUTF8String(StringClass &result) const { + template + StringClass& toUTF8String(StringClass& result U_LIFETIME_BOUND) const { StringByteSink sbs(&result, length()); toUTF8(sbs); return result; @@ -1979,7 +1980,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 * @see fastCopyFrom */ - UnicodeString &operator=(const UnicodeString &srcText); + UnicodeString& operator=(const UnicodeString& srcText) U_LIFETIME_BOUND; /** * Almost the same as the assignment operator. @@ -2006,7 +2007,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.4 */ - UnicodeString &fastCopyFrom(const UnicodeString &src); + UnicodeString& fastCopyFrom(const UnicodeString& src) U_LIFETIME_BOUND; /** * Assignment operator. Replaces the characters in this UnicodeString @@ -2018,8 +2019,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 76 */ - template>> - inline UnicodeString &operator=(const S &src) { + template >> + inline UnicodeString& operator=(const S& src) U_LIFETIME_BOUND { unBogus(); return doReplace(0, length(), internal::toU16StringView(src)); } @@ -2032,7 +2033,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return *this * @stable ICU 56 */ - UnicodeString &operator=(UnicodeString &&src) noexcept; + UnicodeString& operator=(UnicodeString&& src) noexcept U_LIFETIME_BOUND; /** * Swap strings. @@ -2059,7 +2060,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& operator= (char16_t ch); + inline UnicodeString& operator=(char16_t ch) U_LIFETIME_BOUND; /** * Assignment operator. Replace the characters in this UnicodeString @@ -2068,7 +2069,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& operator= (UChar32 ch); + inline UnicodeString& operator=(UChar32 ch) U_LIFETIME_BOUND; /** * Set the text in the UnicodeString object to the characters @@ -2081,8 +2082,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.2 */ - inline UnicodeString& setTo(const UnicodeString& srcText, - int32_t srcStart); + inline UnicodeString& setTo(const UnicodeString& srcText, int32_t srcStart) U_LIFETIME_BOUND; /** * Set the text in the UnicodeString object to the characters @@ -2098,8 +2098,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& setTo(const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLength); + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; /** * Set the text in the UnicodeString object to the characters in @@ -2109,7 +2109,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& setTo(const UnicodeString& srcText); + inline UnicodeString& setTo(const UnicodeString& srcText) U_LIFETIME_BOUND; /** * Set the characters in the UnicodeString object to the characters @@ -2119,8 +2119,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& setTo(const char16_t *srcChars, - int32_t srcLength); + inline UnicodeString& setTo(const char16_t* srcChars, int32_t srcLength) U_LIFETIME_BOUND; /** * Set the characters in the UnicodeString object to the code unit @@ -2130,7 +2129,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& setTo(char16_t srcChar); + inline UnicodeString& setTo(char16_t srcChar) U_LIFETIME_BOUND; /** * Set the characters in the UnicodeString object to the code point @@ -2140,7 +2139,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& setTo(UChar32 srcChar); + inline UnicodeString& setTo(UChar32 srcChar) U_LIFETIME_BOUND; /** * Aliasing setTo() function, analogous to the readonly-aliasing char16_t* constructor. @@ -2165,9 +2164,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - UnicodeString &setTo(UBool isTerminated, - ConstChar16Ptr text, - int32_t textLength); + UnicodeString& setTo(UBool isTerminated, + ConstChar16Ptr text U_LIFETIME_BOUND, + int32_t textLength) U_LIFETIME_BOUND; /** * Aliasing setTo() function, analogous to the writable-aliasing char16_t* constructor. @@ -2188,9 +2187,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - UnicodeString &setTo(char16_t *buffer, + UnicodeString& setTo(char16_t* buffer U_LIFETIME_BOUND, int32_t buffLength, - int32_t buffCapacity); + int32_t buffCapacity) U_LIFETIME_BOUND; /** * Make this UnicodeString object invalid. @@ -2240,9 +2239,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this * @stable ICU 2.0 */ - UnicodeString& setCharAt(int32_t offset, - char16_t ch); - + UnicodeString& setCharAt(int32_t offset, char16_t ch) U_LIFETIME_BOUND; /* Append operations */ @@ -2253,7 +2250,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& operator+= (char16_t ch); + inline UnicodeString& operator+=(char16_t ch) U_LIFETIME_BOUND; /** * Append operator. Append the code point `ch` to the UnicodeString @@ -2262,7 +2259,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& operator+= (UChar32 ch); + inline UnicodeString& operator+=(UChar32 ch) U_LIFETIME_BOUND; /** * Append operator. Append the characters in `srcText` to the @@ -2271,7 +2268,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& operator+= (const UnicodeString& srcText); + inline UnicodeString& operator+=(const UnicodeString& srcText) U_LIFETIME_BOUND; /** * Append operator. Appends the characters in `src` @@ -2283,8 +2280,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 76 */ - template>> - inline UnicodeString& operator+=(const S &src) { + template >> + inline UnicodeString& operator+=(const S& src) U_LIFETIME_BOUND { return doAppend(internal::toU16StringView(src)); } @@ -2303,8 +2300,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& append(const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLength); + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; /** * Append the characters in `srcText` to the UnicodeString object. @@ -2313,7 +2310,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(const UnicodeString& srcText); + inline UnicodeString& append(const UnicodeString& srcText) U_LIFETIME_BOUND; /** * Append the characters in `srcChars` in the range @@ -2328,9 +2325,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(const char16_t *srcChars, - int32_t srcStart, - int32_t srcLength); + inline UnicodeString& append(const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; /** * Append the characters in `srcChars` to the UnicodeString object. @@ -2341,8 +2338,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(ConstChar16Ptr srcChars, - int32_t srcLength); + inline UnicodeString& append(ConstChar16Ptr srcChars, int32_t srcLength) U_LIFETIME_BOUND; /** * Appends the characters in `src` @@ -2354,8 +2350,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 76 */ - template>> - inline UnicodeString& append(const S &src) { + template >> + inline UnicodeString& append(const S& src) U_LIFETIME_BOUND { return doAppend(internal::toU16StringView(src)); } @@ -2365,7 +2361,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(char16_t srcChar); + inline UnicodeString& append(char16_t srcChar) U_LIFETIME_BOUND; /** * Append the code point `srcChar` to the UnicodeString object. @@ -2373,7 +2369,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& append(UChar32 srcChar); + UnicodeString& append(UChar32 srcChar) U_LIFETIME_BOUND; #ifndef U_HIDE_DRAFT_API /** @@ -2402,9 +2398,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& insert(int32_t start, - const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLength); + const UnicodeString& srcText, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; /** * Insert the characters in `srcText` into the UnicodeString object @@ -2414,8 +2410,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& insert(int32_t start, - const UnicodeString& srcText); + inline UnicodeString& insert(int32_t start, const UnicodeString& srcText) U_LIFETIME_BOUND; /** * Insert the characters in `srcChars` in the range @@ -2431,9 +2426,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& insert(int32_t start, - const char16_t *srcChars, - int32_t srcStart, - int32_t srcLength); + const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; /** * Insert the characters in `srcChars` into the UnicodeString object @@ -2445,8 +2440,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& insert(int32_t start, - ConstChar16Ptr srcChars, - int32_t srcLength); + ConstChar16Ptr srcChars, + int32_t srcLength) U_LIFETIME_BOUND; /** * Insert the code unit `srcChar` into the UnicodeString object at @@ -2456,8 +2451,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& insert(int32_t start, - char16_t srcChar); + inline UnicodeString& insert(int32_t start, char16_t srcChar) U_LIFETIME_BOUND; /** * Insert the code point `srcChar` into the UnicodeString object at @@ -2467,9 +2461,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& insert(int32_t start, - UChar32 srcChar); - + inline UnicodeString& insert(int32_t start, UChar32 srcChar) U_LIFETIME_BOUND; /* Replace operations */ @@ -2491,10 +2483,10 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& replace(int32_t start, - int32_t length, - const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLength); + int32_t length, + const UnicodeString& srcText, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; /** * Replace the characters in the range @@ -2509,8 +2501,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& replace(int32_t start, - int32_t length, - const UnicodeString& srcText); + int32_t length, + const UnicodeString& srcText) U_LIFETIME_BOUND; /** * Replace the characters in the range @@ -2530,10 +2522,10 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& replace(int32_t start, - int32_t length, - const char16_t *srcChars, - int32_t srcStart, - int32_t srcLength); + int32_t length, + const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; /** * Replace the characters in the range @@ -2548,9 +2540,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& replace(int32_t start, - int32_t length, - ConstChar16Ptr srcChars, - int32_t srcLength); + int32_t length, + ConstChar16Ptr srcChars, + int32_t srcLength) U_LIFETIME_BOUND; /** * Replace the characters in the range @@ -2563,9 +2555,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& replace(int32_t start, - int32_t length, - char16_t srcChar); + inline UnicodeString& replace(int32_t start, int32_t length, char16_t srcChar) U_LIFETIME_BOUND; /** * Replace the characters in the range @@ -2578,7 +2568,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& replace(int32_t start, int32_t length, UChar32 srcChar); + UnicodeString& replace(int32_t start, int32_t length, UChar32 srcChar) U_LIFETIME_BOUND; /** * Replace the characters in the range [`start`, `limit`) @@ -2590,8 +2580,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& replaceBetween(int32_t start, - int32_t limit, - const UnicodeString& srcText); + int32_t limit, + const UnicodeString& srcText) U_LIFETIME_BOUND; /** * Replace the characters in the range [`start`, `limit`) @@ -2608,10 +2598,10 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& replaceBetween(int32_t start, - int32_t limit, - const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLimit); + int32_t limit, + const UnicodeString& srcText, + int32_t srcStart, + int32_t srcLimit) U_LIFETIME_BOUND; /** * Replace a substring of this object with the given text. @@ -2657,7 +2647,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& findAndReplace(const UnicodeString& oldText, - const UnicodeString& newText); + const UnicodeString& newText) U_LIFETIME_BOUND; /** * Replace all occurrences of characters in oldText with characters @@ -2671,9 +2661,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& findAndReplace(int32_t start, - int32_t length, - const UnicodeString& oldText, - const UnicodeString& newText); + int32_t length, + const UnicodeString& oldText, + const UnicodeString& newText) U_LIFETIME_BOUND; /** * Replace all occurrences of characters in oldText in the range @@ -2693,13 +2683,13 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ UnicodeString& findAndReplace(int32_t start, - int32_t length, - const UnicodeString& oldText, - int32_t oldStart, - int32_t oldLength, - const UnicodeString& newText, - int32_t newStart, - int32_t newLength); + int32_t length, + const UnicodeString& oldText, + int32_t oldStart, + int32_t oldLength, + const UnicodeString& newText, + int32_t newStart, + int32_t newLength) U_LIFETIME_BOUND; /* Remove operations */ @@ -2712,7 +2702,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see setToBogus * @stable ICU 2.0 */ - inline UnicodeString& remove(); + inline UnicodeString& remove() U_LIFETIME_BOUND; /** * Remove the characters in the range @@ -2723,7 +2713,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& remove(int32_t start, - int32_t length = static_cast(INT32_MAX)); + int32_t length = static_cast(INT32_MAX)) U_LIFETIME_BOUND; /** * Remove the characters in the range @@ -2733,8 +2723,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& removeBetween(int32_t start, - int32_t limit = static_cast(INT32_MAX)); + inline UnicodeString& + removeBetween(int32_t start, int32_t limit = static_cast(INT32_MAX)) U_LIFETIME_BOUND; /** * Retain only the characters in the range @@ -2745,7 +2735,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 4.4 */ - inline UnicodeString &retainBetween(int32_t start, int32_t limit = INT32_MAX); + inline UnicodeString& retainBetween(int32_t start, int32_t limit = INT32_MAX) U_LIFETIME_BOUND; /* Length operations */ @@ -2790,7 +2780,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& trim(); + UnicodeString& trim() U_LIFETIME_BOUND; /* Miscellaneous operations */ @@ -2799,7 +2789,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& reverse(); + inline UnicodeString& reverse() U_LIFETIME_BOUND; /** * Reverse the range [`start`, `start + length`) in @@ -2809,8 +2799,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& reverse(int32_t start, - int32_t length); + inline UnicodeString& reverse(int32_t start, int32_t length) U_LIFETIME_BOUND; /** * Convert the characters in this to UPPER CASE following the conventions of @@ -2818,7 +2807,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.0 */ - UnicodeString& toUpper(); + UnicodeString& toUpper() U_LIFETIME_BOUND; /** * Convert the characters in this to UPPER CASE following the conventions of @@ -2827,7 +2816,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.0 */ - UnicodeString& toUpper(const Locale& locale); + UnicodeString& toUpper(const Locale& locale) U_LIFETIME_BOUND; /** * Convert the characters in this to lower case following the conventions of @@ -2835,7 +2824,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.0 */ - UnicodeString& toLower(); + UnicodeString& toLower() U_LIFETIME_BOUND; /** * Convert the characters in this to lower case following the conventions of @@ -2844,7 +2833,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.0 */ - UnicodeString& toLower(const Locale& locale); + UnicodeString& toLower(const Locale& locale) U_LIFETIME_BOUND; #if !UCONFIG_NO_BREAK_ITERATION @@ -2874,7 +2863,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.1 */ - UnicodeString &toTitle(BreakIterator *titleIter); + UnicodeString& toTitle(BreakIterator* titleIter) U_LIFETIME_BOUND; /** * Titlecase this string. @@ -2903,7 +2892,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.1 */ - UnicodeString &toTitle(BreakIterator *titleIter, const Locale &locale); + UnicodeString& toTitle(BreakIterator* titleIter, const Locale& locale) U_LIFETIME_BOUND; /** * Titlecase this string, with options. @@ -2935,7 +2924,9 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 3.8 */ - UnicodeString &toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options); + UnicodeString& toTitle(BreakIterator* titleIter, + const Locale& locale, + uint32_t options) U_LIFETIME_BOUND; #endif @@ -2952,7 +2943,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A reference to this. * @stable ICU 2.0 */ - UnicodeString &foldCase(uint32_t options=0 /*U_FOLD_CASE_DEFAULT*/); + UnicodeString& foldCase(uint32_t options = 0 /*U_FOLD_CASE_DEFAULT*/) U_LIFETIME_BOUND; //======================================== // Access to the internal buffer @@ -3001,7 +2992,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see getTerminatedBuffer() * @stable ICU 2.0 */ - char16_t *getBuffer(int32_t minCapacity); + char16_t* getBuffer(int32_t minCapacity) U_LIFETIME_BOUND; /** * Release a read/write buffer on a UnicodeString object with an @@ -3055,7 +3046,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see getTerminatedBuffer() * @stable ICU 2.0 */ - inline const char16_t *getBuffer() const; + inline const char16_t* getBuffer() const U_LIFETIME_BOUND; /** * Get a read-only pointer to the internal buffer, @@ -3090,7 +3081,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see getBuffer() * @stable ICU 2.2 */ - const char16_t *getTerminatedBuffer(); + const char16_t* getTerminatedBuffer() U_LIFETIME_BOUND; /** * Converts to a std::u16string_view. @@ -3371,7 +3362,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ UnicodeString(UBool isTerminated, - ConstChar16Ptr text, + ConstChar16Ptr text U_LIFETIME_BOUND, int32_t textLength); /** @@ -3392,7 +3383,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @param buffCapacity The size of `buffer` in char16_ts. * @stable ICU 2.0 */ - UnicodeString(char16_t *buffer, int32_t buffLength, int32_t buffCapacity); + UnicodeString(char16_t* buffer U_LIFETIME_BOUND, int32_t buffLength, int32_t buffCapacity); #if !U_CHAR16_IS_TYPEDEF /** @@ -3403,7 +3394,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @param buffCapacity buffer capacity * @stable ICU 59 */ - UnicodeString(uint16_t *buffer, int32_t buffLength, int32_t buffCapacity) : + UnicodeString(uint16_t* buffer U_LIFETIME_BOUND, int32_t buffLength, int32_t buffCapacity) : UnicodeString(Char16Ptr(buffer), buffLength, buffCapacity) {} #endif @@ -3417,7 +3408,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @param buffCapacity buffer capacity * @stable ICU 59 */ - UnicodeString(wchar_t *buffer, int32_t buffLength, int32_t buffCapacity) : + UnicodeString(wchar_t* buffer U_LIFETIME_BOUND, int32_t buffLength, int32_t buffCapacity) : UnicodeString(Char16Ptr(buffer), buffLength, buffCapacity) {} #endif @@ -3658,8 +3649,8 @@ class U_COMMON_API UnicodeString : public Replaceable * @param text The string view to alias for the UnicodeString. * @stable ICU 76 */ - template>> - static inline UnicodeString readOnlyAlias(const S &text) { + template >> + static inline UnicodeString readOnlyAlias(const S& text U_LIFETIME_BOUND) { return readOnlyAliasFromU16StringView(internal::toU16StringView(text)); } @@ -3682,7 +3673,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @param text The UnicodeString to alias. * @stable ICU 76 */ - static inline UnicodeString readOnlyAlias(const UnicodeString &text) { + static inline UnicodeString readOnlyAlias(const UnicodeString& text U_LIFETIME_BOUND) { return readOnlyAliasFromUnicodeString(text); } @@ -3813,11 +3804,11 @@ class U_COMMON_API UnicodeString : public Replaceable virtual UChar32 getChar32At(int32_t offset) const override; private: - static UnicodeString readOnlyAliasFromU16StringView(std::u16string_view text); - static UnicodeString readOnlyAliasFromUnicodeString(const UnicodeString &text); + static UnicodeString readOnlyAliasFromU16StringView(std::u16string_view text U_LIFETIME_BOUND); + static UnicodeString readOnlyAliasFromUnicodeString(const UnicodeString& text U_LIFETIME_BOUND); // For char* constructors. Could be made public. - UnicodeString &setToUTF8(StringPiece utf8); + UnicodeString& setToUTF8(StringPiece utf8) U_LIFETIME_BOUND; // For extract(char*). // We could make a toUTF8(target, capacity, errorCode) public but not // this version: New API will be cleaner if we make callers create substrings @@ -3919,32 +3910,35 @@ class U_COMMON_API UnicodeString : public Replaceable inline char16_t doCharAt(int32_t offset) const; UnicodeString& doReplace(int32_t start, - int32_t length, - const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLength); + int32_t length, + const UnicodeString& srcText, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; UnicodeString& doReplace(int32_t start, - int32_t length, - const char16_t *srcChars, - int32_t srcStart, - int32_t srcLength); - UnicodeString& doReplace(int32_t start, int32_t length, std::u16string_view src); + int32_t length, + const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; + UnicodeString& doReplace(int32_t start, int32_t length, std::u16string_view src) U_LIFETIME_BOUND; - UnicodeString& doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcLength); - UnicodeString& doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcLength); - UnicodeString& doAppend(std::u16string_view src); + UnicodeString& doAppend(const UnicodeString& src, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; + UnicodeString& doAppend(const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND; + UnicodeString& doAppend(std::u16string_view src) U_LIFETIME_BOUND; - UnicodeString& doReverse(int32_t start, - int32_t length); + UnicodeString& doReverse(int32_t start, int32_t length) U_LIFETIME_BOUND; // calculate hash code int32_t doHashCode() const; // get pointer to start of array // these do not check for kOpenGetBuffer, unlike the public getBuffer() function - inline char16_t* getArrayStart(); - inline const char16_t* getArrayStart() const; + inline char16_t* getArrayStart() U_LIFETIME_BOUND; + inline const char16_t* getArrayStart() const U_LIFETIME_BOUND; inline UBool hasShortLength() const; inline int32_t getShortLength() const; @@ -3977,7 +3971,7 @@ class U_COMMON_API UnicodeString : public Replaceable void unBogus(); // implements assignment operator, copy constructor, and fastCopyFrom() - UnicodeString ©From(const UnicodeString &src, UBool fastCopy=false); + UnicodeString& copyFrom(const UnicodeString& src, UBool fastCopy = false) U_LIFETIME_BOUND; // Copies just the fields without memory management. void copyFieldsFrom(UnicodeString &src, UBool setSrcToBogus) noexcept; @@ -4043,12 +4037,12 @@ class U_COMMON_API UnicodeString : public Replaceable * The stringCaseMapper has the same type UStringCaseMapper * as in ustr_imp.h for ustrcase_map(). */ - UnicodeString & - caseMap(int32_t caseLocale, uint32_t options, + UnicodeString& caseMap(int32_t caseLocale, + uint32_t options, #if !UCONFIG_NO_BREAK_ITERATION - BreakIterator *iter, + BreakIterator* iter, #endif - UStringCaseMapper *stringCaseMapper); + UStringCaseMapper* stringCaseMapper) U_LIFETIME_BOUND; // ref counting void addRef(); @@ -4224,13 +4218,13 @@ UnicodeString::pinIndices(int32_t& start, } inline char16_t* -UnicodeString::getArrayStart() { +UnicodeString::getArrayStart() U_LIFETIME_BOUND { return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ? fUnion.fStackFields.fBuffer : fUnion.fFields.fArray; } inline const char16_t* -UnicodeString::getArrayStart() const { +UnicodeString::getArrayStart() const U_LIFETIME_BOUND { return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ? fUnion.fStackFields.fBuffer : fUnion.fFields.fArray; } @@ -4303,7 +4297,7 @@ UnicodeString::isBufferWritable() const } inline const char16_t * -UnicodeString::getBuffer() const { +UnicodeString::getBuffer() const U_LIFETIME_BOUND { if(fUnion.fFields.fLengthAndFlags&(kIsBogus|kOpenGetBuffer)) { return nullptr; } else if(fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) { @@ -4789,64 +4783,64 @@ UnicodeString::endsWith(const char16_t *srcChars, //======================================== inline UnicodeString& UnicodeString::replace(int32_t start, - int32_t _length, - const UnicodeString& srcText) + int32_t _length, + const UnicodeString& srcText) U_LIFETIME_BOUND { return doReplace(start, _length, srcText, 0, srcText.length()); } inline UnicodeString& UnicodeString::replace(int32_t start, - int32_t _length, - const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLength) + int32_t _length, + const UnicodeString& srcText, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { return doReplace(start, _length, srcText, srcStart, srcLength); } inline UnicodeString& UnicodeString::replace(int32_t start, - int32_t _length, - ConstChar16Ptr srcChars, - int32_t srcLength) + int32_t _length, + ConstChar16Ptr srcChars, + int32_t srcLength) U_LIFETIME_BOUND { return doReplace(start, _length, srcChars, 0, srcLength); } inline UnicodeString& UnicodeString::replace(int32_t start, - int32_t _length, - const char16_t *srcChars, - int32_t srcStart, - int32_t srcLength) + int32_t _length, + const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { return doReplace(start, _length, srcChars, srcStart, srcLength); } inline UnicodeString& UnicodeString::replace(int32_t start, - int32_t _length, - char16_t srcChar) + int32_t _length, + char16_t srcChar) U_LIFETIME_BOUND { return doReplace(start, _length, &srcChar, 0, 1); } inline UnicodeString& UnicodeString::replaceBetween(int32_t start, - int32_t limit, - const UnicodeString& srcText) + int32_t limit, + const UnicodeString& srcText) U_LIFETIME_BOUND { return doReplace(start, limit - start, srcText, 0, srcText.length()); } inline UnicodeString& UnicodeString::replaceBetween(int32_t start, - int32_t limit, - const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLimit) + int32_t limit, + const UnicodeString& srcText, + int32_t srcStart, + int32_t srcLimit) U_LIFETIME_BOUND { return doReplace(start, limit - start, srcText, srcStart, srcLimit - srcStart); } inline UnicodeString& UnicodeString::findAndReplace(const UnicodeString& oldText, - const UnicodeString& newText) + const UnicodeString& newText) U_LIFETIME_BOUND { return findAndReplace(0, length(), oldText, 0, oldText.length(), newText, 0, newText.length()); } inline UnicodeString& UnicodeString::findAndReplace(int32_t start, - int32_t _length, - const UnicodeString& oldText, - const UnicodeString& newText) + int32_t _length, + const UnicodeString& oldText, + const UnicodeString& newText) U_LIFETIME_BOUND { return findAndReplace(start, _length, oldText, 0, oldText.length(), newText, 0, newText.length()); } @@ -4898,7 +4892,7 @@ UnicodeString::extractBetween(int32_t start, } inline UnicodeString -UnicodeString::tempSubStringBetween(int32_t start, int32_t limit) const { +UnicodeString::tempSubStringBetween(int32_t start, int32_t limit) const U_LIFETIME_BOUND { return tempSubString(start, limit - start); } @@ -4964,17 +4958,17 @@ UnicodeString::setArray(char16_t *array, int32_t len, int32_t capacity) { } inline UnicodeString& -UnicodeString::operator= (char16_t ch) +UnicodeString::operator=(char16_t ch) U_LIFETIME_BOUND { return doReplace(0, length(), &ch, 0, 1); } inline UnicodeString& -UnicodeString::operator= (UChar32 ch) +UnicodeString::operator=(UChar32 ch) U_LIFETIME_BOUND { return replace(0, length(), ch); } inline UnicodeString& UnicodeString::setTo(const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLength) + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { unBogus(); return doReplace(0, length(), srcText, srcStart, srcLength); @@ -4982,7 +4976,7 @@ UnicodeString::setTo(const UnicodeString& srcText, inline UnicodeString& UnicodeString::setTo(const UnicodeString& srcText, - int32_t srcStart) + int32_t srcStart) U_LIFETIME_BOUND { unBogus(); srcText.pinIndex(srcStart); @@ -4990,28 +4984,28 @@ UnicodeString::setTo(const UnicodeString& srcText, } inline UnicodeString& -UnicodeString::setTo(const UnicodeString& srcText) +UnicodeString::setTo(const UnicodeString& srcText) U_LIFETIME_BOUND { return copyFrom(srcText); } inline UnicodeString& -UnicodeString::setTo(const char16_t *srcChars, - int32_t srcLength) +UnicodeString::setTo(const char16_t* srcChars, + int32_t srcLength) U_LIFETIME_BOUND { unBogus(); return doReplace(0, length(), srcChars, 0, srcLength); } inline UnicodeString& -UnicodeString::setTo(char16_t srcChar) +UnicodeString::setTo(char16_t srcChar) U_LIFETIME_BOUND { unBogus(); return doReplace(0, length(), &srcChar, 0, 1); } inline UnicodeString& -UnicodeString::setTo(UChar32 srcChar) +UnicodeString::setTo(UChar32 srcChar) U_LIFETIME_BOUND { unBogus(); return replace(0, length(), srcChar); @@ -5019,80 +5013,80 @@ UnicodeString::setTo(UChar32 srcChar) inline UnicodeString& UnicodeString::append(const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLength) + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { return doAppend(srcText, srcStart, srcLength); } inline UnicodeString& -UnicodeString::append(const UnicodeString& srcText) +UnicodeString::append(const UnicodeString& srcText) U_LIFETIME_BOUND { return doAppend(srcText, 0, srcText.length()); } inline UnicodeString& -UnicodeString::append(const char16_t *srcChars, - int32_t srcStart, - int32_t srcLength) +UnicodeString::append(const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { return doAppend(srcChars, srcStart, srcLength); } inline UnicodeString& UnicodeString::append(ConstChar16Ptr srcChars, - int32_t srcLength) + int32_t srcLength) U_LIFETIME_BOUND { return doAppend(srcChars, 0, srcLength); } inline UnicodeString& -UnicodeString::append(char16_t srcChar) +UnicodeString::append(char16_t srcChar) U_LIFETIME_BOUND { return doAppend(&srcChar, 0, 1); } inline UnicodeString& -UnicodeString::operator+= (char16_t ch) +UnicodeString::operator+=(char16_t ch) U_LIFETIME_BOUND { return doAppend(&ch, 0, 1); } inline UnicodeString& -UnicodeString::operator+= (UChar32 ch) { +UnicodeString::operator+=(UChar32 ch) U_LIFETIME_BOUND { return append(ch); } inline UnicodeString& -UnicodeString::operator+= (const UnicodeString& srcText) +UnicodeString::operator+=(const UnicodeString& srcText) U_LIFETIME_BOUND { return doAppend(srcText, 0, srcText.length()); } inline UnicodeString& UnicodeString::insert(int32_t start, - const UnicodeString& srcText, - int32_t srcStart, - int32_t srcLength) + const UnicodeString& srcText, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { return doReplace(start, 0, srcText, srcStart, srcLength); } inline UnicodeString& UnicodeString::insert(int32_t start, - const UnicodeString& srcText) + const UnicodeString& srcText) U_LIFETIME_BOUND { return doReplace(start, 0, srcText, 0, srcText.length()); } inline UnicodeString& UnicodeString::insert(int32_t start, - const char16_t *srcChars, - int32_t srcStart, - int32_t srcLength) + const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { return doReplace(start, 0, srcChars, srcStart, srcLength); } inline UnicodeString& UnicodeString::insert(int32_t start, - ConstChar16Ptr srcChars, - int32_t srcLength) + ConstChar16Ptr srcChars, + int32_t srcLength) U_LIFETIME_BOUND { return doReplace(start, 0, srcChars, 0, srcLength); } inline UnicodeString& UnicodeString::insert(int32_t start, - char16_t srcChar) + char16_t srcChar) U_LIFETIME_BOUND { return doReplace(start, 0, &srcChar, 0, 1); } inline UnicodeString& UnicodeString::insert(int32_t start, - UChar32 srcChar) + UChar32 srcChar) U_LIFETIME_BOUND { return replace(start, 0, srcChar); } inline UnicodeString& -UnicodeString::remove() +UnicodeString::remove() U_LIFETIME_BOUND { // remove() of a bogus string makes the string empty and non-bogus if(isBogus()) { @@ -5105,7 +5099,7 @@ UnicodeString::remove() inline UnicodeString& UnicodeString::remove(int32_t start, - int32_t _length) + int32_t _length) U_LIFETIME_BOUND { if(start <= 0 && _length == INT32_MAX) { // remove(guaranteed everything) of a bogus string makes the string empty and non-bogus @@ -5116,11 +5110,11 @@ UnicodeString::remove(int32_t start, inline UnicodeString& UnicodeString::removeBetween(int32_t start, - int32_t limit) + int32_t limit) U_LIFETIME_BOUND { return doReplace(start, limit - start, nullptr, 0, 0); } -inline UnicodeString & -UnicodeString::retainBetween(int32_t start, int32_t limit) { +inline UnicodeString& +UnicodeString::retainBetween(int32_t start, int32_t limit) U_LIFETIME_BOUND { truncate(limit); return doReplace(0, start, nullptr, 0, 0); } @@ -5141,12 +5135,12 @@ UnicodeString::truncate(int32_t targetLength) } inline UnicodeString& -UnicodeString::reverse() +UnicodeString::reverse() U_LIFETIME_BOUND { return doReverse(0, length()); } inline UnicodeString& UnicodeString::reverse(int32_t start, - int32_t _length) + int32_t _length) U_LIFETIME_BOUND { return doReverse(start, _length); } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/unorm2.h b/deps/icu-small/source/common/unicode/unorm2.h index 48f614d74fbf..b36dbedf1d00 100644 --- a/deps/icu-small/source/common/unicode/unorm2.h +++ b/deps/icu-small/source/common/unicode/unorm2.h @@ -256,8 +256,10 @@ unorm2_getInstance(const char *packageName, * @return the requested UNormalizer2, if successful * @stable ICU 4.4 */ -U_CAPI UNormalizer2 * U_EXPORT2 -unorm2_openFiltered(const UNormalizer2 *norm2, const USet *filterSet, UErrorCode *pErrorCode); +U_CAPI UNormalizer2* U_EXPORT2 +unorm2_openFiltered(const UNormalizer2* norm2 U_LIFETIME_BOUND, + const USet* filterSet U_LIFETIME_BOUND, + UErrorCode* pErrorCode); /** * Closes a UNormalizer2 instance from unorm2_openFiltered(). diff --git a/deps/icu-small/source/common/unicode/urename.h b/deps/icu-small/source/common/unicode/urename.h index af4a18ec83d6..1c89429f3b07 100644 --- a/deps/icu-small/source/common/unicode/urename.h +++ b/deps/icu-small/source/common/unicode/urename.h @@ -450,6 +450,7 @@ #define ubidi_getLogicalIndex U_ICU_ENTRY_POINT_RENAME(ubidi_getLogicalIndex) #define ubidi_getLogicalMap U_ICU_ENTRY_POINT_RENAME(ubidi_getLogicalMap) #define ubidi_getLogicalRun U_ICU_ENTRY_POINT_RENAME(ubidi_getLogicalRun) +#define ubidi_getMFOption U_ICU_ENTRY_POINT_RENAME(ubidi_getMFOption) #define ubidi_getMaxValue U_ICU_ENTRY_POINT_RENAME(ubidi_getMaxValue) #define ubidi_getMemory U_ICU_ENTRY_POINT_RENAME(ubidi_getMemory) #define ubidi_getMirror U_ICU_ENTRY_POINT_RENAME(ubidi_getMirror) @@ -474,6 +475,7 @@ #define ubidi_isJoinControl U_ICU_ENTRY_POINT_RENAME(ubidi_isJoinControl) #define ubidi_isMirrored U_ICU_ENTRY_POINT_RENAME(ubidi_isMirrored) #define ubidi_isOrderParagraphsLTR U_ICU_ENTRY_POINT_RENAME(ubidi_isOrderParagraphsLTR) +#define ubidi_isolate U_ICU_ENTRY_POINT_RENAME(ubidi_isolate) #define ubidi_open U_ICU_ENTRY_POINT_RENAME(ubidi_open) #define ubidi_openSized U_ICU_ENTRY_POINT_RENAME(ubidi_openSized) #define ubidi_orderParagraphsLTR U_ICU_ENTRY_POINT_RENAME(ubidi_orderParagraphsLTR) diff --git a/deps/icu-small/source/common/unicode/ures.h b/deps/icu-small/source/common/unicode/ures.h index babc01d426a6..6cb938ffa240 100644 --- a/deps/icu-small/source/common/unicode/ures.h +++ b/deps/icu-small/source/common/unicode/ures.h @@ -283,7 +283,7 @@ U_NAMESPACE_END * @deprecated ICU 2.8 Use ures_getVersion instead. */ U_DEPRECATED const char* U_EXPORT2 -ures_getVersionNumber(const UResourceBundle* resourceBundle); +ures_getVersionNumber(const UResourceBundle* resourceBundle U_LIFETIME_BOUND); #endif /* U_HIDE_DEPRECATED_API */ /** @@ -313,8 +313,7 @@ ures_getVersion(const UResourceBundle* resB, * @deprecated ICU 2.8 Use ures_getLocaleByType instead. */ U_DEPRECATED const char* U_EXPORT2 -ures_getLocale(const UResourceBundle* resourceBundle, - UErrorCode* status); +ures_getLocale(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, UErrorCode* status); #endif /* U_HIDE_DEPRECATED_API */ /** @@ -330,7 +329,7 @@ ures_getLocale(const UResourceBundle* resourceBundle, * @stable ICU 2.8 */ U_CAPI const char* U_EXPORT2 -ures_getLocaleByType(const UResourceBundle* resourceBundle, +ures_getLocaleByType(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, ULocDataLocaleType type, UErrorCode* status); @@ -377,7 +376,7 @@ ures_openFillIn(UResourceBundle *r, * @stable ICU 2.0 */ U_CAPI const UChar* U_EXPORT2 -ures_getString(const UResourceBundle* resourceBundle, +ures_getString(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, int32_t* len, UErrorCode* status); @@ -428,11 +427,12 @@ ures_getString(const UResourceBundle* resourceBundle, * @see u_strToUTF8 * @stable ICU 3.6 */ -U_CAPI const char * U_EXPORT2 -ures_getUTF8String(const UResourceBundle *resB, - char *dest, int32_t *length, +U_CAPI const char* U_EXPORT2 +ures_getUTF8String(const UResourceBundle* resB, + char* dest U_LIFETIME_BOUND, + int32_t* length, UBool forceCopy, - UErrorCode *status); + UErrorCode* status); /** * Returns a binary data from a binary resource. @@ -452,7 +452,7 @@ ures_getUTF8String(const UResourceBundle *resB, * @stable ICU 2.0 */ U_CAPI const uint8_t* U_EXPORT2 -ures_getBinary(const UResourceBundle* resourceBundle, +ures_getBinary(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, int32_t* len, UErrorCode* status); @@ -474,7 +474,7 @@ ures_getBinary(const UResourceBundle* resourceBundle, * @stable ICU 2.0 */ U_CAPI const int32_t* U_EXPORT2 -ures_getIntVector(const UResourceBundle* resourceBundle, +ures_getIntVector(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, int32_t* len, UErrorCode* status); @@ -550,8 +550,8 @@ ures_getType(const UResourceBundle *resourceBundle); * @return a key associated to this resource, or NULL if it doesn't have a key * @stable ICU 2.0 */ -U_CAPI const char * U_EXPORT2 -ures_getKey(const UResourceBundle *resourceBundle); +U_CAPI const char* U_EXPORT2 +ures_getKey(const UResourceBundle* resourceBundle U_LIFETIME_BOUND); /* ITERATION API This API provides means for iterating through a resource @@ -589,9 +589,9 @@ ures_hasNext(const UResourceBundle *resourceBundle); * @stable ICU 2.0 */ U_CAPI UResourceBundle* U_EXPORT2 -ures_getNextResource(UResourceBundle *resourceBundle, - UResourceBundle *fillIn, - UErrorCode *status); +ures_getNextResource(UResourceBundle* resourceBundle, + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status); /** * Returns the next string in a given resource or NULL if there are no more resources @@ -606,10 +606,10 @@ ures_getNextResource(UResourceBundle *resourceBundle, * @stable ICU 2.0 */ U_CAPI const UChar* U_EXPORT2 -ures_getNextString(UResourceBundle *resourceBundle, +ures_getNextString(UResourceBundle* resourceBundle U_LIFETIME_BOUND, int32_t* len, - const char ** key, - UErrorCode *status); + const char** key, + UErrorCode* status); /** * Returns the resource in a given resource at the specified index. Features a fill-in parameter. @@ -624,10 +624,10 @@ ures_getNextString(UResourceBundle *resourceBundle, * @stable ICU 2.0 */ U_CAPI UResourceBundle* U_EXPORT2 -ures_getByIndex(const UResourceBundle *resourceBundle, +ures_getByIndex(const UResourceBundle* resourceBundle, int32_t indexR, - UResourceBundle *fillIn, - UErrorCode *status); + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status); /** * Returns the string in a given resource at the specified index. @@ -641,10 +641,10 @@ ures_getByIndex(const UResourceBundle *resourceBundle, * @stable ICU 2.0 */ U_CAPI const UChar* U_EXPORT2 -ures_getStringByIndex(const UResourceBundle *resourceBundle, +ures_getStringByIndex(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, int32_t indexS, int32_t* len, - UErrorCode *status); + UErrorCode* status); /** * Returns a UTF-8 string from a resource at the specified index. @@ -694,12 +694,13 @@ ures_getStringByIndex(const UResourceBundle *resourceBundle, * @see u_strToUTF8 * @stable ICU 3.6 */ -U_CAPI const char * U_EXPORT2 -ures_getUTF8StringByIndex(const UResourceBundle *resB, +U_CAPI const char* U_EXPORT2 +ures_getUTF8StringByIndex(const UResourceBundle* resB, int32_t stringIndex, - char *dest, int32_t *pLength, + char* dest U_LIFETIME_BOUND, + int32_t* pLength, UBool forceCopy, - UErrorCode *status); + UErrorCode* status); /** * Returns a resource in a given resource that has a given key. This procedure works only with table @@ -714,10 +715,10 @@ ures_getUTF8StringByIndex(const UResourceBundle *resB, * @stable ICU 2.0 */ U_CAPI UResourceBundle* U_EXPORT2 -ures_getByKey(const UResourceBundle *resourceBundle, +ures_getByKey(const UResourceBundle* resourceBundle, const char* key, - UResourceBundle *fillIn, - UErrorCode *status); + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status); /** * Returns a string in a given resource that has a given key. This procedure works only with table @@ -732,10 +733,10 @@ ures_getByKey(const UResourceBundle *resourceBundle, * @stable ICU 2.0 */ U_CAPI const UChar* U_EXPORT2 -ures_getStringByKey(const UResourceBundle *resB, +ures_getStringByKey(const UResourceBundle* resB U_LIFETIME_BOUND, const char* key, int32_t* len, - UErrorCode *status); + UErrorCode* status); /** * Returns a UTF-8 string from a resource and a key. @@ -787,12 +788,13 @@ ures_getStringByKey(const UResourceBundle *resB, * @see u_strToUTF8 * @stable ICU 3.6 */ -U_CAPI const char * U_EXPORT2 -ures_getUTF8StringByKey(const UResourceBundle *resB, - const char *key, - char *dest, int32_t *pLength, +U_CAPI const char* U_EXPORT2 +ures_getUTF8StringByKey(const UResourceBundle* resB, + const char* key, + char* dest U_LIFETIME_BOUND, + int32_t* pLength, UBool forceCopy, - UErrorCode *status); + UErrorCode* status); #if U_SHOW_CPLUSPLUS_API #include "unicode/unistr.h" @@ -810,7 +812,7 @@ U_NAMESPACE_BEGIN * @stable ICU 2.0 */ inline UnicodeString -ures_getUnicodeString(const UResourceBundle *resB, UErrorCode* status) { +ures_getUnicodeString(const UResourceBundle* resB U_LIFETIME_BOUND, UErrorCode* status) { UnicodeString result; int32_t len = 0; const char16_t *r = ConstChar16Ptr(ures_getString(resB, &len, status)); @@ -835,7 +837,9 @@ ures_getUnicodeString(const UResourceBundle *resB, UErrorCode* status) { * @stable ICU 2.0 */ inline UnicodeString -ures_getNextUnicodeString(UResourceBundle *resB, const char ** key, UErrorCode* status) { +ures_getNextUnicodeString(UResourceBundle* resB U_LIFETIME_BOUND, + const char** key, + UErrorCode* status) { UnicodeString result; int32_t len = 0; const char16_t* r = ConstChar16Ptr(ures_getNextString(resB, &len, key, status)); @@ -857,7 +861,9 @@ ures_getNextUnicodeString(UResourceBundle *resB, const char ** key, UErrorCode* * @stable ICU 2.0 */ inline UnicodeString -ures_getUnicodeStringByIndex(const UResourceBundle *resB, int32_t indexS, UErrorCode* status) { +ures_getUnicodeStringByIndex(const UResourceBundle* resB U_LIFETIME_BOUND, + int32_t indexS, + UErrorCode* status) { UnicodeString result; int32_t len = 0; const char16_t* r = ConstChar16Ptr(ures_getStringByIndex(resB, indexS, &len, status)); @@ -880,7 +886,9 @@ ures_getUnicodeStringByIndex(const UResourceBundle *resB, int32_t indexS, UError * @stable ICU 2.0 */ inline UnicodeString -ures_getUnicodeStringByKey(const UResourceBundle *resB, const char* key, UErrorCode* status) { +ures_getUnicodeStringByKey(const UResourceBundle* resB U_LIFETIME_BOUND, + const char* key, + UErrorCode* status) { UnicodeString result; int32_t len = 0; const char16_t* r = ConstChar16Ptr(ures_getStringByKey(resB, key, &len, status)); diff --git a/deps/icu-small/source/common/unicode/uscript.h b/deps/icu-small/source/common/unicode/uscript.h index e5101ed0134e..dda5266f322b 100644 --- a/deps/icu-small/source/common/unicode/uscript.h +++ b/deps/icu-small/source/common/unicode/uscript.h @@ -529,6 +529,11 @@ typedef enum UScriptCode { /** @stable ICU 78 */ USCRIPT_TRADITIONAL_HAN_WITH_LATIN = 212, /* Hntl */ + /** @stable ICU 79 */ + USCRIPT_PROTO_CUNEIFORM = 213, /* Pcun */ + /** @stable ICU 79 */ + USCRIPT_SEAL = 214, /* Seal */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UScriptCode value. @@ -536,7 +541,7 @@ typedef enum UScriptCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - USCRIPT_CODE_LIMIT = 213 + USCRIPT_CODE_LIMIT = 215 #endif // U_HIDE_DEPRECATED_API } UScriptCode; diff --git a/deps/icu-small/source/common/unicode/uset.h b/deps/icu-small/source/common/unicode/uset.h index 4817f7115a70..c44d5ada5625 100644 --- a/deps/icu-small/source/common/unicode/uset.h +++ b/deps/icu-small/source/common/unicode/uset.h @@ -398,7 +398,6 @@ uset_isFrozen(const USet *set); * uset_contains() and uset_span(). * A frozen set will not be modified. (It remains frozen.) * @param set the set - * @return the same set, now frozen * @see uset_isFrozen * @see uset_cloneAsThawed * @stable ICU 3.8 @@ -1011,7 +1010,7 @@ uset_getStringCount(const USet *set); * @see uset_getStringCount */ U_CAPI const UChar* U_EXPORT2 -uset_getString(const USet *set, int32_t index, int32_t *pLength); +uset_getString(const USet* set U_LIFETIME_BOUND, int32_t index, int32_t* pLength); /** * Returns the number of items in this set. An item is either a range @@ -1358,7 +1357,7 @@ class USetCodePointIterator { * Pre-increment. * @stable ICU 76 */ - USetCodePointIterator &operator++() { + USetCodePointIterator& operator++() U_LIFETIME_BOUND { if (c < end) { ++c; } else if (rangeIndex < rangeCount) { @@ -1388,7 +1387,9 @@ class USetCodePointIterator { private: friend class USetCodePoints; - USetCodePointIterator(const USet *pUset, int32_t nRangeIndex, int32_t nRangeCount) + USetCodePointIterator(const USet* pUset U_LIFETIME_BOUND, + int32_t nRangeIndex, + int32_t nRangeCount) : uset(pUset), rangeIndex(nRangeIndex), rangeCount(nRangeCount), c(U_SENTINEL), end(U_SENTINEL) { // Fetch the first range. @@ -1425,7 +1426,8 @@ class USetCodePoints { * Constructs a C++ "range" object over the code points of the USet. * @stable ICU 76 */ - USetCodePoints(const USet *pUset) : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {} + USetCodePoints(const USet* pUset U_LIFETIME_BOUND) + : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {} /** @stable ICU 76 */ USetCodePoints(const USetCodePoints &other) = default; @@ -1470,7 +1472,7 @@ struct CodePointRange { * Pre-increment. * @stable ICU 76 */ - iterator &operator++() { + iterator& operator++() U_LIFETIME_BOUND { ++c; return *this; } @@ -1551,7 +1553,7 @@ class USetRangeIterator { * Pre-increment. * @stable ICU 76 */ - USetRangeIterator &operator++() { + USetRangeIterator& operator++() U_LIFETIME_BOUND { ++rangeIndex; return *this; } @@ -1569,7 +1571,7 @@ class USetRangeIterator { private: friend class USetRanges; - USetRangeIterator(const USet *pUset, int32_t nRangeIndex, int32_t nRangeCount) + USetRangeIterator(const USet* pUset U_LIFETIME_BOUND, int32_t nRangeIndex, int32_t nRangeCount) : uset(pUset), rangeIndex(nRangeIndex), rangeCount(nRangeCount) {} const USet *uset; @@ -1606,7 +1608,8 @@ class USetRanges { * Constructs a C++ "range" object over the code point ranges of the USet. * @stable ICU 76 */ - USetRanges(const USet *pUset) : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {} + USetRanges(const USet* pUset U_LIFETIME_BOUND) + : uset(pUset), rangeCount(uset_getRangeCount(pUset)) {} /** @stable ICU 76 */ USetRanges(const USetRanges &other) = default; @@ -1662,7 +1665,7 @@ class USetStringIterator { * Pre-increment. * @stable ICU 76 */ - USetStringIterator &operator++() { + USetStringIterator& operator++() U_LIFETIME_BOUND { ++index; return *this; } @@ -1680,7 +1683,7 @@ class USetStringIterator { private: friend class USetStrings; - USetStringIterator(const USet *pUset, int32_t nIndex, int32_t nCount) + USetStringIterator(const USet* pUset U_LIFETIME_BOUND, int32_t nIndex, int32_t nCount) : uset(pUset), index(nIndex), count(nCount) {} const USet *uset; @@ -1716,7 +1719,8 @@ class USetStrings { * Constructs a C++ "range" object over the strings of the USet. * @stable ICU 76 */ - USetStrings(const USet *pUset) : uset(pUset), count(uset_getStringCount(pUset)) {} + USetStrings(const USet* pUset U_LIFETIME_BOUND) + : uset(pUset), count(uset_getStringCount(pUset)) {} /** @stable ICU 76 */ USetStrings(const USetStrings &other) = default; @@ -1736,17 +1740,16 @@ class USetStrings { int32_t count; }; -#ifndef U_HIDE_DRAFT_API /** * Iterator returned by USetElements. - * @draft ICU 77 + * @stable ICU 77 */ class USetElementIterator { public: - /** @draft ICU 77 */ + /** @stable ICU 77 */ USetElementIterator(const USetElementIterator &other) = default; - /** @draft ICU 77 */ + /** @stable ICU 77 */ bool operator==(const USetElementIterator &other) const { // No need to compare rangeCount & end given private constructor // and assuming we don't compare iterators across the set being modified. @@ -1755,10 +1758,10 @@ class USetElementIterator { return uset == other.uset && c == other.c && index == other.index; } - /** @draft ICU 77 */ + /** @stable ICU 77 */ bool operator!=(const USetElementIterator &other) const { return !operator==(other); } - /** @draft ICU 77 */ + /** @stable ICU 77 */ std::u16string operator*() const { if (c >= 0) { return c <= 0xffff ? @@ -1776,9 +1779,9 @@ class USetElementIterator { /** * Pre-increment. - * @draft ICU 77 + * @stable ICU 77 */ - USetElementIterator &operator++() { + USetElementIterator& operator++() U_LIFETIME_BOUND { if (c < end) { ++c; } else if (index < rangeCount) { @@ -1801,7 +1804,7 @@ class USetElementIterator { /** * Post-increment. - * @draft ICU 77 + * @stable ICU 77 */ USetElementIterator operator++(int) { USetElementIterator result(*this); @@ -1812,7 +1815,10 @@ class USetElementIterator { private: friend class USetElements; - USetElementIterator(const USet *pUset, int32_t nIndex, int32_t nRangeCount, int32_t nTotalCount) + USetElementIterator(const USet* pUset U_LIFETIME_BOUND, + int32_t nIndex, + int32_t nRangeCount, + int32_t nTotalCount) : uset(pUset), index(nIndex), rangeCount(nRangeCount), totalCount(nTotalCount), c(U_SENTINEL), end(U_SENTINEL) { if (index < rangeCount) { @@ -1861,7 +1867,7 @@ class USetElementIterator { * C++ UnicodeSet has member functions for iteration, including begin() and end(). * * @return an all-elements iterator. - * @draft ICU 77 + * @stable ICU 77 * @see USetCodePoints * @see USetRanges * @see USetStrings @@ -1870,21 +1876,21 @@ class USetElements { public: /** * Constructs a C++ "range" object over all of the elements of the USet. - * @draft ICU 77 + * @stable ICU 77 */ - USetElements(const USet *pUset) + USetElements(const USet* pUset U_LIFETIME_BOUND) : uset(pUset), rangeCount(uset_getRangeCount(pUset)), stringCount(uset_getStringCount(pUset)) {} - /** @draft ICU 77 */ + /** @stable ICU 77 */ USetElements(const USetElements &other) = default; - /** @draft ICU 77 */ + /** @stable ICU 77 */ USetElementIterator begin() const { return USetElementIterator(uset, 0, rangeCount, rangeCount + stringCount); } - /** @draft ICU 77 */ + /** @stable ICU 77 */ USetElementIterator end() const { return USetElementIterator(uset, rangeCount + stringCount, rangeCount, rangeCount + stringCount); } @@ -1894,8 +1900,6 @@ class USetElements { int32_t rangeCount, stringCount; }; -#endif // U_HIDE_DRAFT_API - } // namespace U_HEADER_ONLY_NAMESPACE #endif // U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API diff --git a/deps/icu-small/source/common/unicode/usetiter.h b/deps/icu-small/source/common/unicode/usetiter.h index 3168d3b0f6b8..90fe06a3e8a7 100644 --- a/deps/icu-small/source/common/unicode/usetiter.h +++ b/deps/icu-small/source/common/unicode/usetiter.h @@ -103,7 +103,7 @@ class U_COMMON_API UnicodeSetIterator final : public UObject { * @param set set to iterate over * @stable ICU 2.4 */ - UnicodeSetIterator(const UnicodeSet& set); + UnicodeSetIterator(const UnicodeSet& set U_LIFETIME_BOUND); /** * Create an iterator over nothing. next() and @@ -162,7 +162,7 @@ class U_COMMON_API UnicodeSetIterator final : public UObject { * * @stable ICU 2.4 */ - const UnicodeString& getString(); + const UnicodeString& getString() U_LIFETIME_BOUND; /** * Skips over the remaining code points/ranges, if any. @@ -173,7 +173,7 @@ class U_COMMON_API UnicodeSetIterator final : public UObject { * @stable ICU 70 * @see UnicodeSet#strings() */ - inline UnicodeSetIterator &skipToStrings() { + inline UnicodeSetIterator& skipToStrings() U_LIFETIME_BOUND { // Finish code point/range iteration. range = endRange; endElement = -1; diff --git a/deps/icu-small/source/common/unicode/ustring.h b/deps/icu-small/source/common/unicode/ustring.h index a3d08254d695..98883a4e725f 100644 --- a/deps/icu-small/source/common/unicode/ustring.h +++ b/deps/icu-small/source/common/unicode/ustring.h @@ -79,7 +79,6 @@ /** * \defgroup ustring_ustrlen String Length - * \ingroup ustring_strlen */ /*@{*/ /** @@ -141,8 +140,7 @@ u_strHasMoreChar32Than(const UChar *s, int32_t length, int32_t number); * @stable ICU 2.0 */ U_CAPI UChar* U_EXPORT2 -u_strcat(UChar *dst, - const UChar *src); +u_strcat(UChar* dst U_LIFETIME_BOUND, const UChar* src); /** * Concatenate two ustrings. @@ -159,9 +157,7 @@ u_strcat(UChar *dst, * @stable ICU 2.0 */ U_CAPI UChar* U_EXPORT2 -u_strncat(UChar *dst, - const UChar *src, - int32_t n); +u_strncat(UChar* dst U_LIFETIME_BOUND, const UChar* src, int32_t n); /** * Find the first occurrence of a substring in a string. @@ -183,8 +179,8 @@ u_strncat(UChar *dst, * @see u_strFindFirst * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 -u_strstr(const UChar *s, const UChar *substring); +U_CAPI UChar* U_EXPORT2 +u_strstr(const UChar* s U_LIFETIME_BOUND, const UChar* substring); /** * Find the first occurrence of a substring in a string. @@ -207,8 +203,11 @@ u_strstr(const UChar *s, const UChar *substring); * @see u_strstr * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 -u_strFindFirst(const UChar *s, int32_t length, const UChar *substring, int32_t subLength); +U_CAPI UChar* U_EXPORT2 +u_strFindFirst(const UChar* s U_LIFETIME_BOUND, + int32_t length, + const UChar* substring, + int32_t subLength); /** * Find the first occurrence of a BMP code point in a string. @@ -227,8 +226,8 @@ u_strFindFirst(const UChar *s, int32_t length, const UChar *substring, int32_t s * @see u_strstr * @see u_strFindFirst */ -U_CAPI UChar * U_EXPORT2 -u_strchr(const UChar *s, UChar c); +U_CAPI UChar* U_EXPORT2 +u_strchr(const UChar* s U_LIFETIME_BOUND, UChar c); /** * Find the first occurrence of a code point in a string. @@ -247,8 +246,8 @@ u_strchr(const UChar *s, UChar c); * @see u_strstr * @see u_strFindFirst */ -U_CAPI UChar * U_EXPORT2 -u_strchr32(const UChar *s, UChar32 c); +U_CAPI UChar* U_EXPORT2 +u_strchr32(const UChar* s U_LIFETIME_BOUND, UChar32 c); /** * Find the last occurrence of a substring in a string. @@ -270,8 +269,8 @@ u_strchr32(const UChar *s, UChar32 c); * @see u_strFindFirst * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 -u_strrstr(const UChar *s, const UChar *substring); +U_CAPI UChar* U_EXPORT2 +u_strrstr(const UChar* s U_LIFETIME_BOUND, const UChar* substring); /** * Find the last occurrence of a substring in a string. @@ -294,8 +293,11 @@ u_strrstr(const UChar *s, const UChar *substring); * @see u_strstr * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 -u_strFindLast(const UChar *s, int32_t length, const UChar *substring, int32_t subLength); +U_CAPI UChar* U_EXPORT2 +u_strFindLast(const UChar* s U_LIFETIME_BOUND, + int32_t length, + const UChar* substring, + int32_t subLength); /** * Find the last occurrence of a BMP code point in a string. @@ -314,8 +316,8 @@ u_strFindLast(const UChar *s, int32_t length, const UChar *substring, int32_t su * @see u_strrstr * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 -u_strrchr(const UChar *s, UChar c); +U_CAPI UChar* U_EXPORT2 +u_strrchr(const UChar* s U_LIFETIME_BOUND, UChar c); /** * Find the last occurrence of a code point in a string. @@ -334,8 +336,8 @@ u_strrchr(const UChar *s, UChar c); * @see u_strrstr * @see u_strFindLast */ -U_CAPI UChar * U_EXPORT2 -u_strrchr32(const UChar *s, UChar32 c); +U_CAPI UChar* U_EXPORT2 +u_strrchr32(const UChar* s U_LIFETIME_BOUND, UChar32 c); /** * Locates the first occurrence in the string string of any of the characters @@ -349,8 +351,8 @@ u_strrchr32(const UChar *s, UChar32 c); * characters in matchSet, or NULL if no such character is found. * @stable ICU 2.0 */ -U_CAPI UChar * U_EXPORT2 -u_strpbrk(const UChar *string, const UChar *matchSet); +U_CAPI UChar* U_EXPORT2 +u_strpbrk(const UChar* string U_LIFETIME_BOUND, const UChar* matchSet); /** * Returns the number of consecutive characters in string, @@ -409,10 +411,8 @@ u_strspn(const UChar *string, const UChar *matchSet); * when there are no more tokens. * @stable ICU 2.0 */ -U_CAPI UChar * U_EXPORT2 -u_strtok_r(UChar *src, - const UChar *delim, - UChar **saveState); +U_CAPI UChar* U_EXPORT2 +u_strtok_r(UChar* src U_LIFETIME_BOUND, const UChar* delim, UChar** saveState); /** * Compare two Unicode strings for bitwise equality (code unit order). @@ -655,8 +655,7 @@ u_memcasecmp(const UChar *s1, const UChar *s2, int32_t length, uint32_t options) * @stable ICU 2.0 */ U_CAPI UChar* U_EXPORT2 -u_strcpy(UChar *dst, - const UChar *src); +u_strcpy(UChar* dst U_LIFETIME_BOUND, const UChar* src); /** * Copy a ustring. @@ -670,9 +669,7 @@ u_strcpy(UChar *dst, * @stable ICU 2.0 */ U_CAPI UChar* U_EXPORT2 -u_strncpy(UChar *dst, - const UChar *src, - int32_t n); +u_strncpy(UChar* dst U_LIFETIME_BOUND, const UChar* src, int32_t n); #if !UCONFIG_NO_CONVERSION @@ -686,8 +683,7 @@ u_strncpy(UChar *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 u_uastrcpy(UChar *dst, - const char *src ); +U_CAPI UChar* U_EXPORT2 u_uastrcpy(UChar* dst U_LIFETIME_BOUND, const char* src); /** * Copy a byte string encoded in the default codepage to a ustring. @@ -701,9 +697,7 @@ U_CAPI UChar* U_EXPORT2 u_uastrcpy(UChar *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 u_uastrncpy(UChar *dst, - const char *src, - int32_t n); +U_CAPI UChar* U_EXPORT2 u_uastrncpy(UChar* dst U_LIFETIME_BOUND, const char* src, int32_t n); /** * Copy ustring to a byte string encoded in the default codepage. @@ -715,8 +709,7 @@ U_CAPI UChar* U_EXPORT2 u_uastrncpy(UChar *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI char* U_EXPORT2 u_austrcpy(char *dst, - const UChar *src ); +U_CAPI char* U_EXPORT2 u_austrcpy(char* dst U_LIFETIME_BOUND, const UChar* src); /** * Copy ustring to a byte string encoded in the default codepage. @@ -730,9 +723,7 @@ U_CAPI char* U_EXPORT2 u_austrcpy(char *dst, * @return A pointer to dst. * @stable ICU 2.0 */ -U_CAPI char* U_EXPORT2 u_austrncpy(char *dst, - const UChar *src, - int32_t n ); +U_CAPI char* U_EXPORT2 u_austrncpy(char* dst U_LIFETIME_BOUND, const UChar* src, int32_t n); #endif @@ -745,7 +736,7 @@ U_CAPI char* U_EXPORT2 u_austrncpy(char *dst, * @stable ICU 2.0 */ U_CAPI UChar* U_EXPORT2 -u_memcpy(UChar *dest, const UChar *src, int32_t count); +u_memcpy(UChar* dest U_LIFETIME_BOUND, const UChar* src, int32_t count); /** * Synonym for memmove(), but with UChars only. @@ -756,7 +747,7 @@ u_memcpy(UChar *dest, const UChar *src, int32_t count); * @stable ICU 2.0 */ U_CAPI UChar* U_EXPORT2 -u_memmove(UChar *dest, const UChar *src, int32_t count); +u_memmove(UChar* dest U_LIFETIME_BOUND, const UChar* src, int32_t count); /** * Initialize count characters of dest to c. @@ -768,7 +759,7 @@ u_memmove(UChar *dest, const UChar *src, int32_t count); * @stable ICU 2.0 */ U_CAPI UChar* U_EXPORT2 -u_memset(UChar *dest, UChar c, int32_t count); +u_memset(UChar* dest U_LIFETIME_BOUND, UChar c, int32_t count); /** * Compare the first count UChars of each buffer. @@ -818,7 +809,7 @@ u_memcmpCodePointOrder(const UChar *s1, const UChar *s2, int32_t count); * @see u_strFindFirst */ U_CAPI UChar* U_EXPORT2 -u_memchr(const UChar *s, UChar c, int32_t count); +u_memchr(const UChar* s U_LIFETIME_BOUND, UChar c, int32_t count); /** * Find the first occurrence of a code point in a string. @@ -838,7 +829,7 @@ u_memchr(const UChar *s, UChar c, int32_t count); * @see u_strFindFirst */ U_CAPI UChar* U_EXPORT2 -u_memchr32(const UChar *s, UChar32 c, int32_t count); +u_memchr32(const UChar* s U_LIFETIME_BOUND, UChar32 c, int32_t count); /** * Find the last occurrence of a BMP code point in a string. @@ -858,7 +849,7 @@ u_memchr32(const UChar *s, UChar32 c, int32_t count); * @see u_strFindLast */ U_CAPI UChar* U_EXPORT2 -u_memrchr(const UChar *s, UChar c, int32_t count); +u_memrchr(const UChar* s U_LIFETIME_BOUND, UChar c, int32_t count); /** * Find the last occurrence of a code point in a string. @@ -878,7 +869,7 @@ u_memrchr(const UChar *s, UChar c, int32_t count); * @see u_strFindLast */ U_CAPI UChar* U_EXPORT2 -u_memrchr32(const UChar *s, UChar32 c, int32_t count); +u_memrchr32(const UChar* s U_LIFETIME_BOUND, UChar32 c, int32_t count); /** * Unicode String literals in C. @@ -1197,12 +1188,12 @@ u_strFoldCase(UChar *dest, int32_t destCapacity, * @stable ICU 2.0 */ U_CAPI wchar_t* U_EXPORT2 -u_strToWCS(wchar_t *dest, +u_strToWCS(wchar_t* dest U_LIFETIME_BOUND, int32_t destCapacity, - int32_t *pDestLength, - const UChar *src, + int32_t* pDestLength, + const UChar* src, int32_t srcLength, - UErrorCode *pErrorCode); + UErrorCode* pErrorCode); /** * Convert a wchar_t string to UTF-16. * If it is known at compile time that wchar_t strings are in UTF-16 or UTF-32, then @@ -1226,12 +1217,12 @@ u_strToWCS(wchar_t *dest, * @stable ICU 2.0 */ U_CAPI UChar* U_EXPORT2 -u_strFromWCS(UChar *dest, - int32_t destCapacity, - int32_t *pDestLength, - const wchar_t *src, +u_strFromWCS(UChar* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const wchar_t* src, int32_t srcLength, - UErrorCode *pErrorCode); + UErrorCode* pErrorCode); #endif /* defined(U_WCHAR_IS_UTF16) || defined(U_WCHAR_IS_UTF32) || !UCONFIG_NO_CONVERSION */ /** @@ -1256,13 +1247,13 @@ u_strFromWCS(UChar *dest, * @see u_strToUTF8WithSub * @see u_strFromUTF8 */ -U_CAPI char* U_EXPORT2 -u_strToUTF8(char *dest, +U_CAPI char* U_EXPORT2 +u_strToUTF8(char* dest U_LIFETIME_BOUND, int32_t destCapacity, - int32_t *pDestLength, - const UChar *src, + int32_t* pDestLength, + const UChar* src, int32_t srcLength, - UErrorCode *pErrorCode); + UErrorCode* pErrorCode); /** * Convert a UTF-8 string to UTF-16. @@ -1287,12 +1278,12 @@ u_strToUTF8(char *dest, * @see u_strFromUTF8Lenient */ U_CAPI UChar* U_EXPORT2 -u_strFromUTF8(UChar *dest, +u_strFromUTF8(UChar* dest U_LIFETIME_BOUND, int32_t destCapacity, - int32_t *pDestLength, - const char *src, + int32_t* pDestLength, + const char* src, int32_t srcLength, - UErrorCode *pErrorCode); + UErrorCode* pErrorCode); /** * Convert a UTF-16 string to UTF-8. @@ -1330,13 +1321,14 @@ u_strFromUTF8(UChar *dest, * @stable ICU 3.6 */ U_CAPI char* U_EXPORT2 -u_strToUTF8WithSub(char *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar *src, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode); +u_strToUTF8WithSub(char* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const UChar* src, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode); /** * Convert a UTF-8 string to UTF-16. @@ -1375,13 +1367,14 @@ u_strToUTF8WithSub(char *dest, * @stable ICU 3.6 */ U_CAPI UChar* U_EXPORT2 -u_strFromUTF8WithSub(UChar *dest, - int32_t destCapacity, - int32_t *pDestLength, - const char *src, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode); +u_strFromUTF8WithSub(UChar* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const char* src, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode); /** * Convert a UTF-8 string to UTF-16. @@ -1434,13 +1427,13 @@ u_strFromUTF8WithSub(UChar *dest, * @see u_strToUTF8WithSub * @stable ICU 3.6 */ -U_CAPI UChar * U_EXPORT2 -u_strFromUTF8Lenient(UChar *dest, +U_CAPI UChar* U_EXPORT2 +u_strFromUTF8Lenient(UChar* dest U_LIFETIME_BOUND, int32_t destCapacity, - int32_t *pDestLength, - const char *src, + int32_t* pDestLength, + const char* src, int32_t srcLength, - UErrorCode *pErrorCode); + UErrorCode* pErrorCode); /** * Convert a UTF-16 string to UTF-32. @@ -1464,13 +1457,13 @@ u_strFromUTF8Lenient(UChar *dest, * @see u_strFromUTF32 * @stable ICU 2.0 */ -U_CAPI UChar32* U_EXPORT2 -u_strToUTF32(UChar32 *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar *src, - int32_t srcLength, - UErrorCode *pErrorCode); +U_CAPI UChar32* U_EXPORT2 +u_strToUTF32(UChar32* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const UChar* src, + int32_t srcLength, + UErrorCode* pErrorCode); /** * Convert a UTF-32 string to UTF-16. @@ -1494,13 +1487,13 @@ u_strToUTF32(UChar32 *dest, * @see u_strToUTF32 * @stable ICU 2.0 */ -U_CAPI UChar* U_EXPORT2 -u_strFromUTF32(UChar *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar32 *src, +U_CAPI UChar* U_EXPORT2 +u_strFromUTF32(UChar* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const UChar32* src, int32_t srcLength, - UErrorCode *pErrorCode); + UErrorCode* pErrorCode); /** * Convert a UTF-16 string to UTF-32. @@ -1538,13 +1531,14 @@ u_strFromUTF32(UChar *dest, * @stable ICU 4.2 */ U_CAPI UChar32* U_EXPORT2 -u_strToUTF32WithSub(UChar32 *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar *src, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode); +u_strToUTF32WithSub(UChar32* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const UChar* src, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode); /** * Convert a UTF-32 string to UTF-16. @@ -1582,13 +1576,14 @@ u_strToUTF32WithSub(UChar32 *dest, * @stable ICU 4.2 */ U_CAPI UChar* U_EXPORT2 -u_strFromUTF32WithSub(UChar *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar32 *src, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode); +u_strFromUTF32WithSub(UChar* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const UChar32* src, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode); /** * Convert a 16-bit Unicode string to Java Modified UTF-8. @@ -1622,14 +1617,13 @@ u_strFromUTF32WithSub(UChar *dest, * @see u_strToUTF8WithSub * @see u_strFromJavaModifiedUTF8WithSub */ -U_CAPI char* U_EXPORT2 -u_strToJavaModifiedUTF8( - char *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar *src, - int32_t srcLength, - UErrorCode *pErrorCode); +U_CAPI char* U_EXPORT2 +u_strToJavaModifiedUTF8(char* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const UChar* src, + int32_t srcLength, + UErrorCode* pErrorCode); /** * Convert a Java Modified UTF-8 string to a 16-bit Unicode string. @@ -1673,13 +1667,13 @@ u_strToJavaModifiedUTF8( * @stable ICU 4.4 */ U_CAPI UChar* U_EXPORT2 -u_strFromJavaModifiedUTF8WithSub( - UChar *dest, - int32_t destCapacity, - int32_t *pDestLength, - const char *src, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode); +u_strFromJavaModifiedUTF8WithSub(UChar* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const char* src, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode); #endif diff --git a/deps/icu-small/source/common/unicode/utext.h b/deps/icu-small/source/common/unicode/utext.h index 423b281631db..0b104a30ccb4 100644 --- a/deps/icu-small/source/common/unicode/utext.h +++ b/deps/icu-small/source/common/unicode/utext.h @@ -180,8 +180,8 @@ typedef struct UText UText; /**< C typedef for struct UText. @stable ICU 3.6 */ * * @stable ICU 3.4 */ -U_CAPI UText * U_EXPORT2 -utext_close(UText *ut); +U_CAPI UText* U_EXPORT2 +utext_close(UText* ut U_LIFETIME_BOUND); /** * Open a read-only UText implementation for UTF-8 strings. @@ -204,9 +204,11 @@ utext_close(UText *ut); * will always be used and returned. * @stable ICU 3.4 */ -U_CAPI UText * U_EXPORT2 -utext_openUTF8(UText *ut, const char *s, int64_t length, UErrorCode *status); - +U_CAPI UText* U_EXPORT2 +utext_openUTF8(UText* ut U_LIFETIME_BOUND, + const char* s U_LIFETIME_BOUND, + int64_t length, + UErrorCode* status); /** * Open a read-only UText for UChar * string. @@ -222,9 +224,11 @@ utext_openUTF8(UText *ut, const char *s, int64_t length, UErrorCode *status); * will always be used and returned. * @stable ICU 3.4 */ -U_CAPI UText * U_EXPORT2 -utext_openUChars(UText *ut, const UChar *s, int64_t length, UErrorCode *status); - +U_CAPI UText* U_EXPORT2 +utext_openUChars(UText* ut U_LIFETIME_BOUND, + const UChar* s U_LIFETIME_BOUND, + int64_t length, + UErrorCode* status); #if U_SHOW_CPLUSPLUS_API /** @@ -239,9 +243,10 @@ utext_openUChars(UText *ut, const UChar *s, int64_t length, UErrorCode *status); * will always be used and returned. * @stable ICU 3.4 */ -U_CAPI UText * U_EXPORT2 -utext_openUnicodeString(UText *ut, icu::UnicodeString *s, UErrorCode *status); - +U_CAPI UText* U_EXPORT2 +utext_openUnicodeString(UText* ut U_LIFETIME_BOUND, + icu::UnicodeString* s U_LIFETIME_BOUND, + UErrorCode* status); /** * Open a UText for a const UnicodeString. The resulting UText will not be writable. @@ -255,8 +260,10 @@ utext_openUnicodeString(UText *ut, icu::UnicodeString *s, UErrorCode *status); * will always be used and returned. * @stable ICU 3.4 */ -U_CAPI UText * U_EXPORT2 -utext_openConstUnicodeString(UText *ut, const icu::UnicodeString *s, UErrorCode *status); +U_CAPI UText* U_EXPORT2 +utext_openConstUnicodeString(UText* ut U_LIFETIME_BOUND, + const icu::UnicodeString* s U_LIFETIME_BOUND, + UErrorCode* status); /** @@ -271,8 +278,10 @@ utext_openConstUnicodeString(UText *ut, const icu::UnicodeString *s, UErrorCode * @see Replaceable * @stable ICU 3.4 */ -U_CAPI UText * U_EXPORT2 -utext_openReplaceable(UText *ut, icu::Replaceable *rep, UErrorCode *status); +U_CAPI UText* U_EXPORT2 +utext_openReplaceable(UText* ut U_LIFETIME_BOUND, + icu::Replaceable* rep U_LIFETIME_BOUND, + UErrorCode* status); /** * Open a UText implementation over an ICU CharacterIterator. @@ -286,8 +295,10 @@ utext_openReplaceable(UText *ut, icu::Replaceable *rep, UErrorCode *status); * @see Replaceable * @stable ICU 3.4 */ -U_CAPI UText * U_EXPORT2 -utext_openCharacterIterator(UText *ut, icu::CharacterIterator *ci, UErrorCode *status); +U_CAPI UText* U_EXPORT2 +utext_openCharacterIterator(UText* ut U_LIFETIME_BOUND, + icu::CharacterIterator* ci U_LIFETIME_BOUND, + UErrorCode* status); #endif @@ -349,9 +360,12 @@ utext_openCharacterIterator(UText *ut, icu::CharacterIterator *ci, UErrorCode *s * @return The newly created clone, or NULL if the clone operation failed. * @stable ICU 3.4 */ -U_CAPI UText * U_EXPORT2 -utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCode *status); - +U_CAPI UText* U_EXPORT2 +utext_clone(UText* dest U_LIFETIME_BOUND, + const UText* src, + UBool deep, + UBool readOnly, + UErrorCode* status); /** * Compare two UText objects for equality. @@ -1535,8 +1549,8 @@ struct UText { * @return pointer to the UText, allocated if necessary, with extra space set up if requested. * @stable ICU 3.4 */ -U_CAPI UText * U_EXPORT2 -utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status); +U_CAPI UText* U_EXPORT2 +utext_setup(UText* ut U_LIFETIME_BOUND, int32_t extraSpace, UErrorCode* status); // do not use #ifndef U_HIDE_INTERNAL_API around the following! /** diff --git a/deps/icu-small/source/common/unicode/utfiterator.h b/deps/icu-small/source/common/unicode/utfiterator.h index 6e79a4403057..2f5e7f847862 100644 --- a/deps/icu-small/source/common/unicode/utfiterator.h +++ b/deps/icu-small/source/common/unicode/utfiterator.h @@ -12,6 +12,9 @@ #if U_SHOW_CPLUSPLUS_API || U_SHOW_CPLUSPLUS_HEADER_API || !defined(UTYPES_H) #include +#if __has_include() +#include +#endif #if defined(__cpp_lib_ranges) #include #endif @@ -26,6 +29,9 @@ * \file * \brief C++ header-only API: C++ iterators over Unicode strings (=UTF-8/16/32 if well-formed). * + * See the User Guide chapter about + * C++ Code Point Iterators. + * * Sample code: * \code * #include @@ -268,7 +274,7 @@ class CodePointsIterator { /** @internal */ inline CP32 operator*() const { return c_; } /** @internal */ - inline CodePointsIterator &operator++() { // pre-increment + inline CodePointsIterator& operator++() U_LIFETIME_BOUND { // pre-increment ++c_; if (skipSurrogates && c_ == 0xd800) { c_ = 0xe000; @@ -1108,8 +1114,8 @@ class UTFIterator { class Proxy { public: explicit Proxy(CodeUnits &units) : units_(units) {} - CodeUnits &operator*() { return units_; } - CodeUnits *operator->() { return &units_; } + CodeUnits& operator*() U_LIFETIME_BOUND { return units_; } + CodeUnits* operator->() U_LIFETIME_BOUND { return &units_; } private: CodeUnits units_; }; @@ -1192,7 +1198,7 @@ class UTFIterator { * @draft ICU 78 */ U_FORCE_INLINE bool operator==(const UTFIterator &other) const { - return getLogicalPosition() == other.getLogicalPosition(); + return base() == other.base(); } /** * @param other Another iterator @@ -1214,7 +1220,7 @@ class UTFIterator { !std::is_same_v && !std::is_same_v, bool> operator==(const UTFIterator &iter, const Sentinel &s) { - return iter.getLogicalPosition() == s; + return iter.base() == s; } #if U_CPLUSPLUS_VERSION < 20 @@ -1233,7 +1239,7 @@ class UTFIterator { !std::is_same_v && !std::is_same_v, bool> operator==(const Sentinel &s, const UTFIterator &iter) { - return iter.getLogicalPosition() == s; + return iter.base() == s; } /** * @param iter A UTFIterator @@ -1259,6 +1265,18 @@ class UTFIterator { operator!=(const Sentinel &s, const UTFIterator &iter) { return !(iter == s); } #endif // C++17 + /** + * Returns the current position as a code unit iterator. + * Similar to iter->begin() but also works at the exclusive end(). + * + * @return current position as a code unit iterator + * @draft ICU 79 + */ + U_FORCE_INLINE UnitIter base() const { + // Return the logical position. + return state_ <= 0 ? p_ : units_.begin(); + } + /** * Decodes the code unit sequence at the current position. * @@ -1297,7 +1315,7 @@ class UTFIterator { * @return this iterator * @draft ICU 78 */ - U_FORCE_INLINE UTFIterator &operator++() { // pre-increment + U_FORCE_INLINE UTFIterator& operator++() U_LIFETIME_BOUND { // pre-increment if (state_ > 0) { // operator*() called readAndInc() so p_ is already ahead. state_ = 0; @@ -1348,10 +1366,10 @@ class UTFIterator { * @return this iterator * @draft ICU 78 */ - template + template U_FORCE_INLINE - std::enable_if_t, UTFIterator &> - operator--() { // pre-decrement + std::enable_if_t, UTFIterator&> + operator--() U_LIFETIME_BOUND { // pre-decrement if (state_ > 0) { // operator*() called readAndInc() so p_ is ahead of the logical position. p_ = units_.begin(); @@ -1380,10 +1398,6 @@ class UTFIterator { private: friend class std::reverse_iterator>; - U_FORCE_INLINE UnitIter getLogicalPosition() const { - return state_ <= 0 ? p_ : units_.begin(); - } - // operator*() etc. are logically const. mutable UnitIter p_; // In a validating iterator, we need start_ & limit_ so that when we read a code point @@ -1416,8 +1430,8 @@ class UTFIterator< class Proxy { public: explicit Proxy(CodeUnits &units) : units_(units) {} - CodeUnits &operator*() { return units_; } - CodeUnits *operator->() { return &units_; } + CodeUnits& operator*() U_LIFETIME_BOUND { return units_; } + CodeUnits* operator->() U_LIFETIME_BOUND { return &units_; } private: CodeUnits units_; }; @@ -1494,7 +1508,7 @@ class UTFIterator< return Proxy(units_); } - U_FORCE_INLINE UTFIterator &operator++() { // pre-increment + U_FORCE_INLINE UTFIterator& operator++() U_LIFETIME_BOUND { // pre-increment if (ahead_) { // operator*() called readAndInc() so p_ is already ahead. ahead_ = false; @@ -1548,8 +1562,8 @@ class std::reverse_iterator() { return &units_; } + CodeUnits_& operator*() U_LIFETIME_BOUND { return units_; } + CodeUnits_* operator->() U_LIFETIME_BOUND { return &units_; } private: CodeUnits_ units_; }; @@ -1562,7 +1576,7 @@ class std::reverse_iterator iter) : - p_(iter.getLogicalPosition()), start_(iter.start_), limit_(iter.limit_), + p_(iter.base()), start_(iter.start_), limit_(iter.limit_), units_(0, 0, false, p_, p_) {} U_FORCE_INLINE reverse_iterator() : p_{}, start_{}, limit_{}, units_(0, 0, false, p_, p_) {} @@ -1577,6 +1591,11 @@ class std::reverse_iterator base() const { + return U_HEADER_ONLY_NAMESPACE::UTFIterator( + start_, getLogicalPosition(), limit_); + } + U_FORCE_INLINE CodeUnits_ operator*() const { if (state_ == 0) { units_ = Impl::decAndRead(start_, p_); @@ -1593,7 +1612,7 @@ class std::reverse_iterator +#if defined(__cpp_lib_ranges) + requires std::ranges::range +#endif class UTFStringCodePoints { static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); public: @@ -1807,7 +1829,7 @@ class UTFStringCodePoints { * @draft ICU 78 */ template>, typename = void> - explicit UTFStringCodePoints(Range unitRange) : unitRange(unitRange) {} + explicit UTFStringCodePoints(Range unitRange U_LIFETIME_BOUND) : unitRange(unitRange) {} /** Copy constructor. @draft ICU 78 */ UTFStringCodePoints(const UTFStringCodePoints &other) = default; @@ -1885,6 +1907,28 @@ class UTFStringCodePoints { return std::make_reverse_iterator(begin()); } + /** + * Returns the CodeUnits for the first character/code point. + * Requires that the range is not empty. + * + * @return the CodeUnits for the first character/code point. + * @draft ICU 79 + */ + auto front() const { + return *begin(); + } + + /** + * Returns the CodeUnits for the last character/code point. + * Requires that the range is not empty. + * + * @return the CodeUnits for the last character/code point. + * @draft ICU 79 + */ + auto back() const { + return *(--end()); + } + private: Range unitRange; }; @@ -1966,8 +2010,8 @@ class UnsafeUTFIterator { class Proxy { public: explicit Proxy(UnsafeCodeUnits &units) : units_(units) {} - UnsafeCodeUnits &operator*() { return units_; } - UnsafeCodeUnits *operator->() { return &units_; } + UnsafeCodeUnits& operator*() U_LIFETIME_BOUND { return units_; } + UnsafeCodeUnits* operator->() U_LIFETIME_BOUND { return &units_; } private: UnsafeCodeUnits units_; }; @@ -2020,7 +2064,7 @@ class UnsafeUTFIterator { * @draft ICU 78 */ U_FORCE_INLINE bool operator==(const UnsafeUTFIterator &other) const { - return getLogicalPosition() == other.getLogicalPosition(); + return base() == other.base(); } /** * @param other Another iterator @@ -2040,7 +2084,7 @@ class UnsafeUTFIterator { !std::is_same_v && !std::is_same_v, bool> operator==(const UnsafeUTFIterator &iter, const Sentinel &s) { - return iter.getLogicalPosition() == s; + return iter.base() == s; } #if U_CPLUSPLUS_VERSION < 20 @@ -2055,7 +2099,7 @@ class UnsafeUTFIterator { !std::is_same_v && !std::is_same_v, bool> operator==(const Sentinel &s, const UnsafeUTFIterator &iter) { - return iter.getLogicalPosition() == s; + return iter.base() == s; } /** * @param iter An UnsafeUTFIterator @@ -2081,6 +2125,18 @@ class UnsafeUTFIterator { operator!=(const Sentinel &s, const UnsafeUTFIterator &iter) { return !(iter == s); } #endif // C++17 + /** + * Returns the current position as a code unit iterator. + * Similar to iter->begin() but also works at the exclusive end(). + * + * @return current position as a code unit iterator + * @draft ICU 79 + */ + U_FORCE_INLINE UnitIter base() const { + // Return the logical position. + return state_ <= 0 ? p_ : units_.begin(); + } + /** * Decodes the code unit sequence at the current position. * @@ -2119,7 +2175,7 @@ class UnsafeUTFIterator { * @return this iterator * @draft ICU 78 */ - U_FORCE_INLINE UnsafeUTFIterator &operator++() { // pre-increment + U_FORCE_INLINE UnsafeUTFIterator& operator++() U_LIFETIME_BOUND { // pre-increment if (state_ > 0) { // operator*() called readAndInc() so p_ is already ahead. state_ = 0; @@ -2170,10 +2226,10 @@ class UnsafeUTFIterator { * @return this iterator * @draft ICU 78 */ - template + template U_FORCE_INLINE - std::enable_if_t, UnsafeUTFIterator &> - operator--() { // pre-decrement + std::enable_if_t, UnsafeUTFIterator&> + operator--() U_LIFETIME_BOUND { // pre-decrement if (state_ > 0) { // operator*() called readAndInc() so p_ is ahead of the logical position. p_ = units_.begin(); @@ -2202,10 +2258,6 @@ class UnsafeUTFIterator { private: friend class std::reverse_iterator>; - U_FORCE_INLINE UnitIter getLogicalPosition() const { - return state_ <= 0 ? p_ : units_.begin(); - } - // operator*() etc. are logically const. mutable UnitIter p_; // Keep state so that we call readAndInc() only once for both operator*() and ++ @@ -2234,8 +2286,8 @@ class UnsafeUTFIterator< class Proxy { public: explicit Proxy(UnsafeCodeUnits &units) : units_(units) {} - UnsafeCodeUnits &operator*() { return units_; } - UnsafeCodeUnits *operator->() { return &units_; } + UnsafeCodeUnits& operator*() U_LIFETIME_BOUND { return units_; } + UnsafeCodeUnits* operator->() U_LIFETIME_BOUND { return &units_; } private: UnsafeCodeUnits units_; }; @@ -2308,7 +2360,7 @@ class UnsafeUTFIterator< return Proxy(units_); } - U_FORCE_INLINE UnsafeUTFIterator &operator++() { // pre-increment + U_FORCE_INLINE UnsafeUTFIterator& operator++() U_LIFETIME_BOUND { // pre-increment if (ahead_) { // operator*() called readAndInc() so p_ is already ahead. ahead_ = false; @@ -2359,8 +2411,8 @@ class std::reverse_iterator() { return &units_; } + UnsafeCodeUnits_& operator*() U_LIFETIME_BOUND { return units_; } + UnsafeCodeUnits_* operator->() U_LIFETIME_BOUND { return &units_; } private: UnsafeCodeUnits_ units_; }; @@ -2373,7 +2425,7 @@ class std::reverse_iterator iter) : - p_(iter.getLogicalPosition()), units_(0, 0, p_, p_) {} + p_(iter.base()), units_(0, 0, p_, p_) {} U_FORCE_INLINE reverse_iterator() : p_{}, units_(0, 0, p_, p_) {} U_FORCE_INLINE reverse_iterator(reverse_iterator &&src) noexcept = default; @@ -2387,6 +2439,11 @@ class std::reverse_iterator base() const { + return U_HEADER_ONLY_NAMESPACE::UnsafeUTFIterator( + getLogicalPosition()); + } + U_FORCE_INLINE UnsafeCodeUnits_ operator*() const { if (state_ == 0) { units_ = Impl::decAndRead(p_); @@ -2403,7 +2460,7 @@ class std::reverse_iterator +#if defined(__cpp_lib_ranges) + requires std::ranges::range +#endif class UnsafeUTFStringCodePoints { static_assert(sizeof(CP32) == 4, "CP32 must be a 32-bit type to hold a code point"); public: @@ -2548,7 +2608,7 @@ class UnsafeUTFStringCodePoints { * @draft ICU 78 */ template>, typename = void> - explicit UnsafeUTFStringCodePoints(Range unitRange) : unitRange(unitRange) {} + explicit UnsafeUTFStringCodePoints(Range unitRange U_LIFETIME_BOUND) : unitRange(unitRange) {} /** Copy constructor. @draft ICU 78 */ UnsafeUTFStringCodePoints(const UnsafeUTFStringCodePoints &other) = default; @@ -2620,6 +2680,28 @@ class UnsafeUTFStringCodePoints { return std::make_reverse_iterator(begin()); } + /** + * Returns the CodeUnits for the first character/code point. + * Requires that the range is not empty. + * + * @return the CodeUnits for the first character/code point. + * @draft ICU 79 + */ + auto front() const { + return *begin(); + } + + /** + * Returns the CodeUnits for the last character/code point. + * Requires that the range is not empty. + * + * @return the CodeUnits for the last character/code point. + * @draft ICU 79 + */ + auto back() const { + return *(--end()); + } + private: Range unitRange; }; diff --git a/deps/icu-small/source/common/unicode/utfstring.h b/deps/icu-small/source/common/unicode/utfstring.h index f596d56a6573..e6654be4eb6c 100644 --- a/deps/icu-small/source/common/unicode/utfstring.h +++ b/deps/icu-small/source/common/unicode/utfstring.h @@ -31,8 +31,8 @@ namespace prv { // This function, and the public wrappers, // want to be U_FORCE_INLINE but the gcc-debug-build-and-test CI check failed with // error: ‘always_inline’ function might not be inlinable [-Werror=attributes] -template -inline StringClass &appendCodePoint(StringClass &s, uint32_t c) { +template +inline StringClass& appendCodePoint(StringClass& s U_LIFETIME_BOUND, uint32_t c) { using Unit = typename StringClass::value_type; if constexpr (sizeof(Unit) == 1) { // UTF-8: Similar to U8_APPEND(). @@ -94,8 +94,8 @@ inline StringClass &appendCodePoint(StringClass &s, uint32_t c) { * @draft ICU 78 * @see U_IS_SCALAR_VALUE */ -template -inline StringClass &appendOrFFFD(StringClass &s, UChar32 c) { +template +inline StringClass& appendOrFFFD(StringClass& s U_LIFETIME_BOUND, UChar32 c) { return prv::appendCodePoint(s, c); } @@ -111,8 +111,8 @@ inline StringClass &appendOrFFFD(StringClass &s, UChar32 c) { * @draft ICU 78 * @see U_IS_SCALAR_VALUE */ -template -inline StringClass &appendUnsafe(StringClass &s, UChar32 c) { +template +inline StringClass& appendUnsafe(StringClass& s U_LIFETIME_BOUND, UChar32 c) { return prv::appendCodePoint(s, c); } diff --git a/deps/icu-small/source/common/unicode/utypes.h b/deps/icu-small/source/common/unicode/utypes.h index f53b7536f200..3a46a55009c6 100644 --- a/deps/icu-small/source/common/unicode/utypes.h +++ b/deps/icu-small/source/common/unicode/utypes.h @@ -827,6 +827,34 @@ typedef enum UErrorCode { # define U_FAILURE(x) ((x)>U_ZERO_ERROR) #endif +/* Distinguishing MessageFormat recoverable errors */ +#ifdef __cplusplus + /** + * Does the error code indicate a MessageFormat recoverable error? + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + static + inline UBool U_MF_RECOVERABLE_ERROR(UErrorCode code) { + return (code == U_MF_OPERAND_MISMATCH_ERROR) + || (code == U_MF_FORMATTING_ERROR) + || (code == U_MF_BAD_OPTION); + } +#else + /** + * Does the error code indicate success? + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ +# define U_MF_RECOVERABLE_ERROR(x) ((code == U_MF_OPERAND_MISMATCH_ERROR) \ + || (code == U_MF_FORMATTING_ERROR) \ + || (code == U_MF_BAD_OPTION)) +#endif + + + /** * Return a string for a UErrorCode value. * The string will be the same as the name of the error code constant diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index 75acd4f0052a..fd3100dda1cd 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -53,13 +53,13 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 78 +#define U_ICU_VERSION_MAJOR_NUM 79 /** 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 3 +#define U_ICU_VERSION_MINOR_NUM 1 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -79,7 +79,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _78 +#define U_ICU_VERSION_SUFFIX _79 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -132,7 +132,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "78.3" +#define U_ICU_VERSION "79.1" /** * The current ICU library major version number as a string, for library name suffixes. @@ -145,13 +145,13 @@ * * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "78" +#define U_ICU_VERSION_SHORT "79" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "78.3" +#define U_ICU_DATA_VERSION "79.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/common/unicode/uversion.h b/deps/icu-small/source/common/unicode/uversion.h index 450794ac1bae..58703cd7414d 100644 --- a/deps/icu-small/source/common/unicode/uversion.h +++ b/deps/icu-small/source/common/unicode/uversion.h @@ -149,7 +149,6 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH]; * @stable ICU 76 */ -#ifndef U_FORCE_HIDE_DRAFT_API /** * \def U_ICU_NAMESPACE_OR_INTERNAL * Namespace used for header-only APIs that used to be regular C++ APIs. @@ -157,9 +156,8 @@ typedef uint8_t UVersionInfo[U_MAX_VERSION_LENGTH]; * Similar to U_HEADER_ONLY_NAMESPACE, but the public definition is the same as U_ICU_NAMESPACE. * "U_ICU_NAMESPACE" or "U_ICU_NAMESPACE::internal". * - * @draft ICU 77 + * @stable ICU 77 */ -#endif // U_FORCE_HIDE_DRAFT_API // The first test is the same as for defining U_EXPORT for Windows. #if defined(_MSC_VER) || (UPRV_HAS_DECLSPEC_ATTRIBUTE(__dllexport__) && \ diff --git a/deps/icu-small/source/common/unifilt.cpp b/deps/icu-small/source/common/unifilt.cpp index 4ab0d9b5f934..b30b1d596b06 100644 --- a/deps/icu-small/source/common/unifilt.cpp +++ b/deps/icu-small/source/common/unifilt.cpp @@ -28,7 +28,7 @@ UnicodeFilter::~UnicodeFilter() {} * UnicodeFunctor API. * Note that UnicodeMatcher is a base class of UnicodeFilter. */ -UnicodeMatcher* UnicodeFilter::toMatcher() const { +UnicodeMatcher* UnicodeFilter::toMatcher() const U_LIFETIME_BOUND { return const_cast(this); } diff --git a/deps/icu-small/source/common/unifunct.cpp b/deps/icu-small/source/common/unifunct.cpp index 5e939cb67e3f..9f56c2565120 100644 --- a/deps/icu-small/source/common/unifunct.cpp +++ b/deps/icu-small/source/common/unifunct.cpp @@ -15,11 +15,11 @@ UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFunctor) UnicodeFunctor::~UnicodeFunctor() {} -UnicodeMatcher* UnicodeFunctor::toMatcher() const { +UnicodeMatcher* UnicodeFunctor::toMatcher() const U_LIFETIME_BOUND { return nullptr; } -UnicodeReplacer* UnicodeFunctor::toReplacer() const { +UnicodeReplacer* UnicodeFunctor::toReplacer() const U_LIFETIME_BOUND { return nullptr; } diff --git a/deps/icu-small/source/common/uniset.cpp b/deps/icu-small/source/common/uniset.cpp index 0a63dad9dd0f..719fd072d290 100644 --- a/deps/icu-small/source/common/uniset.cpp +++ b/deps/icu-small/source/common/uniset.cpp @@ -203,11 +203,11 @@ UnicodeSet::~UnicodeSet() { /** * Assigns this object to be a copy of another. */ -UnicodeSet& UnicodeSet::operator=(const UnicodeSet& o) { +UnicodeSet& UnicodeSet::operator=(const UnicodeSet& o) U_LIFETIME_BOUND { return copyFrom(o, false); } -UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) { +UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) U_LIFETIME_BOUND { if (this == &o) { return *this; } @@ -241,7 +241,7 @@ UnicodeSet& UnicodeSet::copyFrom(const UnicodeSet& o, UBool asThawed) { } else if (hasStrings()) { strings_->removeAllElements(); } - if (o.stringSpan != nullptr && !asThawed) { + if (o.stringSpan != nullptr && strings_ != nullptr && !asThawed) { stringSpan = new UnicodeSetStringSpan(*o.stringSpan, *strings_); if (stringSpan == nullptr) { // Check for memory allocation error. setToBogus(); @@ -745,7 +745,7 @@ UChar32 UnicodeSet::charAt(int32_t index) const { * @param start first character in the set, inclusive * @rparam end last character in the set, inclusive */ -UnicodeSet& UnicodeSet::set(UChar32 start, UChar32 end) { +UnicodeSet& UnicodeSet::set(UChar32 start, UChar32 end) U_LIFETIME_BOUND { clear(); complement(start, end); return *this; @@ -762,7 +762,7 @@ UnicodeSet& UnicodeSet::set(UChar32 start, UChar32 end) { * @param end last character, inclusive, of range to be added * to this set. */ -UnicodeSet& UnicodeSet::add(UChar32 start, UChar32 end) { +UnicodeSet& UnicodeSet::add(UChar32 start, UChar32 end) U_LIFETIME_BOUND { if (pinCodePoint(start) < pinCodePoint(end)) { UChar32 limit = end + 1; // Fast path for adding a new range after the last one. @@ -830,7 +830,7 @@ void dump(const UChar32* list, int32_t len) { * present. If this set already contains the specified character, * the call leaves this set unchanged. */ -UnicodeSet& UnicodeSet::add(UChar32 c) { +UnicodeSet& UnicodeSet::add(UChar32 c) U_LIFETIME_BOUND { // find smallest i such that c < list[i] // if odd, then it is IN the set // if even, then it is OUT of the set @@ -947,7 +947,7 @@ UnicodeSet& UnicodeSet::add(UChar32 c) { * @param s the source string * @return the modified set, for chaining */ -UnicodeSet& UnicodeSet::add(const UnicodeString& s) { +UnicodeSet& UnicodeSet::add(const UnicodeString& s) U_LIFETIME_BOUND { if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { @@ -1008,7 +1008,7 @@ int32_t UnicodeSet::getSingleCP(const UnicodeString& s) { * @param the source string * @return the modified set, for chaining */ -UnicodeSet& UnicodeSet::addAll(const UnicodeString& s) { +UnicodeSet& UnicodeSet::addAll(const UnicodeString& s) U_LIFETIME_BOUND { UChar32 cp; for (int32_t i = 0; i < s.length(); i += U16_LENGTH(cp)) { cp = s.char32At(i); @@ -1023,7 +1023,7 @@ UnicodeSet& UnicodeSet::addAll(const UnicodeString& s) { * @param the source string * @return the modified set, for chaining */ -UnicodeSet& UnicodeSet::retainAll(const UnicodeString& s) { +UnicodeSet& UnicodeSet::retainAll(const UnicodeString& s) U_LIFETIME_BOUND { UnicodeSet set; set.addAll(s); retainAll(set); @@ -1036,7 +1036,7 @@ UnicodeSet& UnicodeSet::retainAll(const UnicodeString& s) { * @param the source string * @return the modified set, for chaining */ -UnicodeSet& UnicodeSet::complementAll(const UnicodeString& s) { +UnicodeSet& UnicodeSet::complementAll(const UnicodeString& s) U_LIFETIME_BOUND { UnicodeSet set; set.addAll(s); complementAll(set); @@ -1049,14 +1049,14 @@ UnicodeSet& UnicodeSet::complementAll(const UnicodeString& s) { * @param the source string * @return the modified set, for chaining */ -UnicodeSet& UnicodeSet::removeAll(const UnicodeString& s) { +UnicodeSet& UnicodeSet::removeAll(const UnicodeString& s) U_LIFETIME_BOUND { UnicodeSet set; set.addAll(s); removeAll(set); return *this; } -UnicodeSet& UnicodeSet::removeAllStrings() { +UnicodeSet& UnicodeSet::removeAllStrings() U_LIFETIME_BOUND { if (!isFrozen() && hasStrings()) { strings_->removeAllElements(); releasePattern(); @@ -1103,7 +1103,7 @@ UnicodeSet* U_EXPORT2 UnicodeSet::createFromAll(const UnicodeString& s) { * @param end last character, inclusive, of range to be retained * to this set. */ -UnicodeSet& UnicodeSet::retain(UChar32 start, UChar32 end) { +UnicodeSet& UnicodeSet::retain(UChar32 start, UChar32 end) U_LIFETIME_BOUND { if (pinCodePoint(start) <= pinCodePoint(end)) { UChar32 range[3] = { start, end+1, UNICODESET_HIGH }; retain(range, 2, 0); @@ -1113,11 +1113,11 @@ UnicodeSet& UnicodeSet::retain(UChar32 start, UChar32 end) { return *this; } -UnicodeSet& UnicodeSet::retain(UChar32 c) { +UnicodeSet& UnicodeSet::retain(UChar32 c) U_LIFETIME_BOUND { return retain(c, c); } -UnicodeSet& UnicodeSet::retain(const UnicodeString &s) { +UnicodeSet& UnicodeSet::retain(const UnicodeString &s) U_LIFETIME_BOUND { if (isFrozen() || isBogus()) { return *this; } UChar32 cp = getSingleCP(s); if (cp < 0) { @@ -1148,7 +1148,7 @@ UnicodeSet& UnicodeSet::retain(const UnicodeString &s) { * @param end last character, inclusive, of range to be removed * from this set. */ -UnicodeSet& UnicodeSet::remove(UChar32 start, UChar32 end) { +UnicodeSet& UnicodeSet::remove(UChar32 start, UChar32 end) U_LIFETIME_BOUND { if (pinCodePoint(start) <= pinCodePoint(end)) { UChar32 range[3] = { start, end+1, UNICODESET_HIGH }; retain(range, 2, 2); @@ -1161,7 +1161,7 @@ UnicodeSet& UnicodeSet::remove(UChar32 start, UChar32 end) { * The set will not contain the specified range once the call * returns. */ -UnicodeSet& UnicodeSet::remove(UChar32 c) { +UnicodeSet& UnicodeSet::remove(UChar32 c) U_LIFETIME_BOUND { return remove(c, c); } @@ -1172,7 +1172,7 @@ UnicodeSet& UnicodeSet::remove(UChar32 c) { * @param the source string * @return the modified set, for chaining */ -UnicodeSet& UnicodeSet::remove(const UnicodeString& s) { +UnicodeSet& UnicodeSet::remove(const UnicodeString& s) U_LIFETIME_BOUND { if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { @@ -1196,7 +1196,7 @@ UnicodeSet& UnicodeSet::remove(const UnicodeString& s) { * @param end last character, inclusive, of range to be removed * from this set. */ -UnicodeSet& UnicodeSet::complement(UChar32 start, UChar32 end) { +UnicodeSet& UnicodeSet::complement(UChar32 start, UChar32 end) U_LIFETIME_BOUND { if (isFrozen() || isBogus()) { return *this; } @@ -1208,7 +1208,7 @@ UnicodeSet& UnicodeSet::complement(UChar32 start, UChar32 end) { return *this; } -UnicodeSet& UnicodeSet::complement(UChar32 c) { +UnicodeSet& UnicodeSet::complement(UChar32 c) U_LIFETIME_BOUND { return complement(c, c); } @@ -1216,7 +1216,7 @@ UnicodeSet& UnicodeSet::complement(UChar32 c) { * This is equivalent to * complement(MIN_VALUE, MAX_VALUE). */ -UnicodeSet& UnicodeSet::complement() { +UnicodeSet& UnicodeSet::complement() U_LIFETIME_BOUND { if (isFrozen() || isBogus()) { return *this; } @@ -1243,7 +1243,7 @@ UnicodeSet& UnicodeSet::complement() { * @param s the string to complement * @return this object, for chaining */ -UnicodeSet& UnicodeSet::complement(const UnicodeString& s) { +UnicodeSet& UnicodeSet::complement(const UnicodeString& s) U_LIFETIME_BOUND { if (isFrozen() || isBogus()) return *this; int32_t cp = getSingleCP(s); if (cp < 0) { @@ -1269,7 +1269,7 @@ UnicodeSet& UnicodeSet::complement(const UnicodeString& s) { * @param c set whose elements are to be added to this set. * @see #add(char, char) */ -UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) { +UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) U_LIFETIME_BOUND { if ( c.len>0 && c.list!=nullptr ) { add(c.list, c.len, 0); } @@ -1295,7 +1295,7 @@ UnicodeSet& UnicodeSet::addAll(const UnicodeSet& c) { * * @param c set that defines which elements this set will retain. */ -UnicodeSet& UnicodeSet::retainAll(const UnicodeSet& c) { +UnicodeSet& UnicodeSet::retainAll(const UnicodeSet& c) U_LIFETIME_BOUND { if (isFrozen() || isBogus()) { return *this; } @@ -1319,7 +1319,7 @@ UnicodeSet& UnicodeSet::retainAll(const UnicodeSet& c) { * @param c set that defines which elements will be removed from * this set. */ -UnicodeSet& UnicodeSet::removeAll(const UnicodeSet& c) { +UnicodeSet& UnicodeSet::removeAll(const UnicodeSet& c) U_LIFETIME_BOUND { if (isFrozen() || isBogus()) { return *this; } @@ -1338,7 +1338,7 @@ UnicodeSet& UnicodeSet::removeAll(const UnicodeSet& c) { * @param c set that defines which elements will be xor'ed from * this set. */ -UnicodeSet& UnicodeSet::complementAll(const UnicodeSet& c) { +UnicodeSet& UnicodeSet::complementAll(const UnicodeSet& c) U_LIFETIME_BOUND { if (isFrozen() || isBogus()) { return *this; } @@ -1359,7 +1359,7 @@ UnicodeSet& UnicodeSet::complementAll(const UnicodeSet& c) { * Removes all of the elements from this set. This set will be * empty after this call returns. */ -UnicodeSet& UnicodeSet::clear() { +UnicodeSet& UnicodeSet::clear() U_LIFETIME_BOUND { if (isFrozen()) { return *this; } @@ -1404,7 +1404,7 @@ UChar32 UnicodeSet::getRangeEnd(int32_t index) const { return list[index*2 + 1] - 1; } -const UnicodeString* UnicodeSet::getString(int32_t index) const { +const UnicodeString* UnicodeSet::getString(int32_t index) const U_LIFETIME_BOUND { return static_cast(strings_->elementAt(index)); } @@ -1412,7 +1412,7 @@ const UnicodeString* UnicodeSet::getString(int32_t index) const { * Reallocate this objects internal structures to take up the least * possible space, without changing this object's value. */ -UnicodeSet& UnicodeSet::compact() { +UnicodeSet& UnicodeSet::compact() U_LIFETIME_BOUND { if (isFrozen() || isBogus()) { return *this; } @@ -2025,7 +2025,7 @@ void UnicodeSet::_appendToPat(UnicodeString &result, UChar32 start, UChar32 end, * a cleaned version of the string passed to applyPattern(), if there * is one. Otherwise it will be generated. */ -UnicodeString& UnicodeSet::_toPattern(UnicodeString& result, +UnicodeString& UnicodeSet::_toPattern(UnicodeString& result U_LIFETIME_BOUND, UBool escapeUnprintable) const { if (pat != nullptr) { @@ -2065,7 +2065,7 @@ UnicodeString& UnicodeSet::_toPattern(UnicodeString& result, * calling this function is passed to a UnicodeSet constructor, it * will produce another set that is equal to this one. */ -UnicodeString& UnicodeSet::toPattern(UnicodeString& result, +UnicodeString& UnicodeSet::toPattern(UnicodeString& result U_LIFETIME_BOUND, UBool escapeUnprintable) const { result.truncate(0); @@ -2077,7 +2077,7 @@ UnicodeString& UnicodeSet::toPattern(UnicodeString& result, * This does not use this.pat, the cleaned up copy of the string * passed to applyPattern(). */ -UnicodeString& UnicodeSet::_generatePattern(UnicodeString& result, +UnicodeString& UnicodeSet::_generatePattern(UnicodeString& result U_LIFETIME_BOUND, UBool escapeUnprintable) const { result.append(u'['); @@ -2169,7 +2169,7 @@ void UnicodeSet::setPattern(const char16_t *newPat, int32_t newPatLen) { // We can regenerate an equivalent pattern later when requested. } -UnicodeSet *UnicodeSet::freeze() { +UnicodeSet* UnicodeSet::freeze() U_LIFETIME_BOUND { if(!isFrozen() && !isBogus()) { compact(); diff --git a/deps/icu-small/source/common/uniset_closure.cpp b/deps/icu-small/source/common/uniset_closure.cpp index ae777c5facdf..8f8f8a740f9e 100644 --- a/deps/icu-small/source/common/uniset_closure.cpp +++ b/deps/icu-small/source/common/uniset_closure.cpp @@ -67,7 +67,7 @@ UnicodeSet::UnicodeSet(const UnicodeString& pattern, ParsePosition& pos, UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, uint32_t options, const SymbolTable* symbols, - UErrorCode& status) { + UErrorCode& status) U_LIFETIME_BOUND { ParsePosition pos(0); applyPattern(pattern, pos, options, symbols, status); if (U_FAILURE(status)) return *this; @@ -86,10 +86,10 @@ UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, } UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, - ParsePosition& pos, - uint32_t options, - const SymbolTable* symbols, - UErrorCode& status) { + ParsePosition& pos, + uint32_t options, + const SymbolTable* symbols, + UErrorCode& status) U_LIFETIME_BOUND { if (U_FAILURE(status)) { return *this; } @@ -101,7 +101,7 @@ UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, // _applyPattern calls add() etc., which set pat to empty. UnicodeString rebuiltPat; RuleCharacterIterator chars(pattern, symbols, pos); - applyPattern(chars, symbols, rebuiltPat, options, &UnicodeSet::closeOver, 0, status); + applyPattern(pattern, pos, chars, symbols, rebuiltPat, options, &UnicodeSet::closeOver, status); if (U_FAILURE(status)) return *this; if (chars.inVariable()) { // syntaxError(chars, "Extra chars in variable value"); @@ -154,7 +154,8 @@ addCaseMapping(UnicodeSet &set, int32_t result, const char16_t *full, UnicodeStr namespace { /** For case closure on a large set, look only at code points with relevant properties. */ -const UnicodeSet &maybeOnlyCaseSensitive(const UnicodeSet &src, UnicodeSet &subset) { +const UnicodeSet &maybeOnlyCaseSensitive(const UnicodeSet &src U_LIFETIME_BOUND, + UnicodeSet &subset U_LIFETIME_BOUND) { // The subset must have been constructed with all code points, // so that the retainAll() intersection effectively copies all single code points from src. U_ASSERT(subset.contains(0, 0x10ffff)); @@ -211,7 +212,7 @@ bool scfString(const UnicodeString &s, UnicodeString &scf) { } // namespace -UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { +UnicodeSet& UnicodeSet::closeOver(int32_t attribute) U_LIFETIME_BOUND { if (isFrozen() || isBogus()) { return *this; } diff --git a/deps/icu-small/source/common/uniset_props.cpp b/deps/icu-small/source/common/uniset_props.cpp index 532b17f5063f..35ba7995b943 100644 --- a/deps/icu-small/source/common/uniset_props.cpp +++ b/deps/icu-small/source/common/uniset_props.cpp @@ -18,6 +18,9 @@ * Character property dependent functions moved here from uniset.cpp */ +#include +#include + #include "unicode/utypes.h" #include "unicode/uniset.h" #include "unicode/parsepos.h" @@ -27,6 +30,7 @@ #include "unicode/uset.h" #include "unicode/locid.h" #include "unicode/brkiter.h" +#include "unicode/utfiterator.h" #include "uset_imp.h" #include "ruleiter.h" #include "cmemory.h" @@ -34,6 +38,7 @@ #include "util.h" #include "uvector.h" #include "uprops.h" +#include "patternprops.h" #include "propname.h" #include "normalizer2impl.h" #include "uinvchar.h" @@ -54,9 +59,6 @@ constexpr char ANY[] = "ANY"; // [\u0000-\U0010FFFF] constexpr char ASCII[] = "ASCII"; // [\u0000-\u007F] constexpr char ASSIGNED[] = "Assigned"; // [:^Cn:] -// Unicode name property alias -constexpr char16_t NAME_PROP[] = u"na"; - } // namespace // Cached sets ------------------------------------------------------------- *** @@ -81,6 +83,8 @@ U_CDECL_END U_NAMESPACE_BEGIN +using U_HEADER_ONLY_NAMESPACE::utfStringCodePoints; + namespace { // Cache some sets for other services -------------------------------------- *** @@ -140,6 +144,19 @@ isPOSIXClose(const UnicodeString &pattern, int32_t pos) { // memory leak checker tools #define _dbgct(me) +// Returns the character with the given name or name alias, or U_SENTINEL if no such character +// exists. +UChar32 getCharacterByName(const CharString& name) { + for (const UCharNameChoice nameChoice : std::array{U_EXTENDED_CHAR_NAME, U_CHAR_NAME_ALIAS}) { + UErrorCode ec = U_ZERO_ERROR; + UChar32 ch = u_charFromName(nameChoice, name.data(), &ec); + if (U_SUCCESS(ec)) { + return ch; + } + } + return U_SENTINEL; +} + } // namespace //---------------------------------------------------------------- @@ -163,7 +180,7 @@ UnicodeSet::UnicodeSet(const UnicodeString& pattern, //---------------------------------------------------------------- UnicodeSet& UnicodeSet::applyPattern(const UnicodeString& pattern, - UErrorCode& status) { + UErrorCode& status) U_LIFETIME_BOUND { // Equivalent to // return applyPattern(pattern, USET_IGNORE_SPACE, nullptr, status); // but without dependency on closeOver(). @@ -196,7 +213,7 @@ UnicodeSet::applyPatternIgnoreSpace(const UnicodeString& pattern, // _applyPattern calls add() etc., which set pat to empty. UnicodeString rebuiltPat; RuleCharacterIterator chars(pattern, symbols, pos); - applyPattern(chars, symbols, rebuiltPat, USET_IGNORE_SPACE, nullptr, 0, status); + applyPattern(pattern, pos, chars, symbols, rebuiltPat, USET_IGNORE_SPACE, nullptr, status); if (U_FAILURE(status)) return; if (chars.inVariable()) { // syntaxError(chars, "Extra chars in variable value"); @@ -220,438 +237,1140 @@ UBool UnicodeSet::resemblesPattern(const UnicodeString& pattern, int32_t pos) { // Implementation: Pattern parsing //---------------------------------------------------------------- -namespace { +#define U_DEBUGGING_UNICODESET_PARSING 0 + +class UnicodeSet::Lexer { + public: + Lexer(const UnicodeString &pattern, + const ParsePosition &parsePosition, + RuleCharacterIterator &chars, + uint32_t unicodeSetOptions, + const SymbolTable *const symbols, + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute)) + : pattern_(pattern), parsePosition_(parsePosition), chars_(chars), + unicodeSetOptions_(unicodeSetOptions), + charsOptions_(RuleCharacterIterator::PARSE_ESCAPES | + ((unicodeSetOptions & USET_IGNORE_SPACE) != 0 + ? RuleCharacterIterator::SKIP_WHITESPACE + : 0)), + symbols_(symbols), + caseClosure_(caseClosure) {} + + class LexicalElement { + public: + bool isSetOperator(const char16_t op) const { + return U_SUCCESS(errorCode_) && category_ == SET_OPERATOR && string_[0] == op; + } -/** - * A small all-inline class to manage a UnicodeSet pointer. Add - * operator->() etc. as needed. - */ -class UnicodeSetPointer { - UnicodeSet* p; -public: - inline UnicodeSetPointer() : p(nullptr) {} - inline ~UnicodeSetPointer() { delete p; } - inline UnicodeSet* pointer() { return p; } - inline UBool allocate() { - if (p == nullptr) { - p = new UnicodeSet(); + bool isStringLiteral() const { + return U_SUCCESS(errorCode_) && category_ == STRING_LITERAL; } - return p != nullptr; - } -}; -constexpr int32_t MAX_DEPTH = 100; + bool isNamedElement() const { + return U_SUCCESS(errorCode_) && category_ == NAMED_ELEMENT; + } -} // namespace + bool isBracketedElement() const { + return U_SUCCESS(errorCode_) && category_ == BRACKETED_ELEMENT; + } -/** - * Parse the pattern from the given RuleCharacterIterator. The - * iterator is advanced over the parsed pattern. - * @param chars iterator over the pattern characters. Upon return - * it will be advanced to the first character after the parsed - * pattern, or the end of the iteration if all characters are - * parsed. - * @param symbols symbol table to use to parse and dereference - * variables, or null if none. - * @param rebuiltPat the pattern that was parsed, rebuilt or - * copied from the input pattern, as appropriate. - * @param options a bit mask of zero or more of the following: - * IGNORE_SPACE, CASE. - */ -void UnicodeSet::applyPattern(RuleCharacterIterator& chars, - const SymbolTable* symbols, - UnicodeString& rebuiltPat, - uint32_t options, - UnicodeSet& (UnicodeSet::*caseClosure)(int32_t attribute), - int32_t depth, - UErrorCode& ec) { - if (U_FAILURE(ec)) return; - if (depth > MAX_DEPTH) { - ec = U_ILLEGAL_ARGUMENT_ERROR; - return; - } + std::optional element() const { + if (U_SUCCESS(errorCode_) && + (category_ == LITERAL_ELEMENT || category_ == ESCAPED_ELEMENT || + category_ == BRACKETED_ELEMENT || category_ == STRING_LITERAL)) { + return string_; + } + return std::nullopt; + } - // Syntax characters: [ ] ^ - & { } + std::optional codePoint() const { + if (U_SUCCESS(errorCode_) && (category_ == LITERAL_ELEMENT || category_ == ESCAPED_ELEMENT || + category_ == BRACKETED_ELEMENT || category_ == NAMED_ELEMENT)) { + return string_.char32At(0); + } + return std::nullopt; + } - // Recognized special forms for chars, sets: c-c s-s s&s + // If `*this` is a valid property-query or set-valued-variable, returns the set represented + // by this lexical element, which lives at least as long as `*this`. Null otherwise. + const UnicodeSet *set() const { + if (U_FAILURE(errorCode_)) { + return nullptr; + } + if (category_ == PROPERTY_QUERY || category_ == VARIABLE) { + if (precomputedSet_ != nullptr) { + return precomputedSet_; + } else { + return &set_; + } + } + return nullptr; + } - int32_t opts = RuleCharacterIterator::PARSE_VARIABLES | - RuleCharacterIterator::PARSE_ESCAPES; - if ((options & USET_IGNORE_SPACE) != 0) { - opts |= RuleCharacterIterator::SKIP_WHITESPACE; - } + const UErrorCode& errorCode() const{ + return errorCode_; + } - UnicodeString patLocal, buf; - UBool usePat = false; - UnicodeSetPointer scratch; - RuleCharacterIterator::Pos backup; +#if U_DEBUGGING_UNICODESET_PARSING + UnicodeString debugString() const { + UnicodeString result; + if (U_FAILURE(errorCode_)) { + result.append(u"Ill-formed token (") + .append(UnicodeString::fromUTF8(u_errorName(errorCode_))) + .append(u"), possibly "); + } + return result.append(category_names_[category_]) + .append(u" '") + .append(sourceText_) + .append(u"'"); + } +#endif + + private: + // See https://unicode.org/reports/tr61#Lexical-Elements. + enum Category : std::uint8_t { + SET_OPERATOR, + LITERAL_ELEMENT, + ESCAPED_ELEMENT, + NAMED_ELEMENT, + BRACKETED_ELEMENT, + STRING_LITERAL, + PROPERTY_QUERY, + // Used for ill-formed variables and set-valued variables that are not directly a + // property-query, e.g., $basicLatinLetters=[A-Za-z]. Variables that expand to a single + // lexical element instead have the category of that lexical element, e.g., $Ll=\p{Ll} has + // the category PROPERTY_QUERY, $a=a has the category LITERAL_ELEMENT, and $s={Zeichenkette} + // has the category STRING_LITERAL. + VARIABLE, + END_OF_TEXT, + }; + static constexpr std::array category_names_{{ + u"set-operator", + u"literal-element", + u"escaped-element", + u"named-element", + u"bracketed-element", + u"string-literal", + u"property-query", + u"variable", + u"(end of text)", + }}; + LexicalElement(Category category, UnicodeString string, RuleCharacterIterator::Pos after, + const UErrorCode errorCode, const UnicodeSet *precomputedSet, UnicodeSet set, + std::u16string_view sourceText, bool separated, + std::optional const &preceding) + : category_(category), string_(std::move(string)), after_(after), errorCode_(errorCode), + precomputedSet_(precomputedSet), set_(set), sourceText_(sourceText) { + if (U_FAILURE(errorCode_) || separated || !preceding.has_value()) { + return; + } + if (preceding->isSetOperator(u'[') && category == LITERAL_ELEMENT && + *codePoint() == u':') { + errorCode_ = U_MALFORMED_SET; + } else if (preceding->category_ == ESCAPED_ELEMENT) { + if (U_IS_LEAD(*preceding->codePoint()) && category_ == ESCAPED_ELEMENT && + U_IS_TRAIL(*codePoint())) { + errorCode_ = U_MALFORMED_SET; + } else if (preceding->sourceText_.length() <= 3 && category == LITERAL_ELEMENT) { + UChar32 cp = *codePoint(); + if (preceding->sourceText_[1] == u'x') { + if ((cp >= u'0' && cp <= u'9') || (cp >= u'A' && cp <= u'F') || + (cp >= u'a' && cp <= u'f')) { + errorCode_ = U_MALFORMED_SET; + } + } else if (preceding->sourceText_[1] >= u'0' && + preceding->sourceText_[1] <= u'7') { + if (cp >= u'0' && cp <= u'7') { + errorCode_ = U_MALFORMED_SET; + } + } + } + } + } + Category category_; + UnicodeString string_; + RuleCharacterIterator::Pos after_; + UErrorCode errorCode_; + const UnicodeSet *precomputedSet_; + UnicodeSet set_; + std::u16string_view sourceText_; + + friend class Lexer; + }; + + UnicodeString getPositionForDebugging() const { + return pattern_.tempSubString(0, parsePosition_.getIndex()) + u"☞" + + pattern_.tempSubString(parsePosition_.getIndex(), 60); + } - // mode: 0=before [, 1=between [...], 2=after ] - // lastItem: 0=none, 1=char, 2=set - int8_t lastItem = 0, mode = 0; - UChar32 lastChar = 0; - char16_t op = 0; + bool acceptSetOperator(char16_t op) { + if (lookahead().isSetOperator(op)) { + advance(); + return true; + } + return false; + } - UBool invert = false; + const LexicalElement &lookahead() { + if (!ahead_.has_value()) { + const RuleCharacterIterator::Pos before = getPos(); + ahead_.emplace(nextToken(behind_)); + chars_.setPos(before); + } + return *ahead_; + } - clear(); + const LexicalElement &lookahead2() { + if (!ahead2_.has_value()) { + // Note that if someone has called `getCharacterIterator` and played with the result, + // `before` may not actually be before `ahead_`, but we do not actually depend on this here, + // since we start from ahead_.after_. + const RuleCharacterIterator::Pos before = getPos(); + chars_.setPos(lookahead().after_); + ahead2_.emplace(nextToken(ahead_)); + chars_.setPos(before); + } + return *ahead2_; + } - while (mode != 2 && !chars.atEnd()) { - U_ASSERT((lastItem == 0 && op == 0) || - (lastItem == 1 && (op == 0 || op == u'-')) || - (lastItem == 2 && (op == 0 || op == u'-' || op == u'&'))); + // For use in older functions that take the `RuleCharacterIterator` directly. + // Any advancement of the resulting `RuleCharacterIterator` has no effect on the result of subsequent + // calls to `lookahead`, `lookahead2`, `advance`, or `acceptSetOperator`. + // Once `advance` or `acceptSetOperator` has been called, the result of a call to + // `getCharacterIterator` preceding the call to `advance` or `acceptSetOperator` must no longer be + // used. + RuleCharacterIterator &getCharacterIterator() { + // Make sure we compute a correct `ahead_.after_` so we do not depend on the current value of + // `getPos()` for lexing. + lookahead(); + return chars_; + } - UChar32 c = 0; - UBool literal = false; - UnicodeSet* nested = nullptr; // alias - do not delete + int32_t charsOptions() { + return charsOptions_; + } - // -------- Check for property pattern + bool atEnd() const { + return chars_.atEnd(); + } - // setMode: 0=none, 1=unicodeset, 2=propertypat, 3=preparsed - int8_t setMode = 0; - if (resemblesPropertyPattern(chars, opts)) { - setMode = 2; - } + void advance() { + // If someone called `getCharacterIterator`, we are now changing the character iterator under + // their feet; further, we may not have an `ahead_`, so if they keep playing with it we would be + // working on incorrect values of `getPos`. This is why the result of `getCharacterIterator` + // must no longer be used. + chars_.setPos(lookahead().after_); + behind_ = ahead_; + ahead_ = ahead2_; + ahead2_.reset(); + } - // -------- Parse '[' of opening delimiter OR nested set. - // If there is a nested set, use `setMode' to define how - // the set should be parsed. If the '[' is part of the - // opening delimiter for this pattern, parse special - // strings "[", "[^", "[-", and "[^-". Check for stand-in - // characters representing a nested set in the symbol - // table. + private: + // A version of getPos that returns its position instead of taking it as at out parameter, so we + // can have const positions. + RuleCharacterIterator::Pos getPos() const { + RuleCharacterIterator::Pos result; + chars_.getPos(result); + return result; + } - else { - // Prepare to backup if necessary - chars.getPos(backup); - c = chars.next(opts, literal, ec); - if (U_FAILURE(ec)) return; - - if (c == u'[' && !literal) { - if (mode == 1) { - chars.setPos(backup); // backup - setMode = 1; + LexicalElement nextToken(std::optional const& preceding) { + UErrorCode errorCode = U_ZERO_ERROR; + bool separated = false; + if (charsOptions_ & RuleCharacterIterator::SKIP_WHITESPACE) { + UChar32 s; + RuleCharacterIterator::Pos pos; + for (;;) { + UBool unusedEscaped; + chars_.getPos(pos); + s = chars_.next(charsOptions_ & ~(RuleCharacterIterator::PARSE_ESCAPES | + RuleCharacterIterator::SKIP_WHITESPACE), + unusedEscaped, errorCode); + if (!PatternProps::isWhiteSpace(s)) { + chars_.setPos(pos); + break; + } + if (s != u'\u200E' && s != u'\u200F') { + separated = true; + } + } + } + chars_.skipIgnored(charsOptions_); + if (chars_.atEnd()) { + return LexicalElement(LexicalElement::END_OF_TEXT, {}, getPos(), errorCode, + /*precomputedSet=*/nullptr, + /*set=*/{}, + u"", separated, preceding); + } + const int32_t start = parsePosition_.getIndex(); + const RuleCharacterIterator::Pos before = getPos(); + // First try to get the next character without parsing escapes. + UBool unusedEscaped; + const UChar32 first = + chars_.next(charsOptions_ & ~RuleCharacterIterator::PARSE_ESCAPES, unusedEscaped, errorCode); + if (first == u'[' || first == u'\\') { + const RuleCharacterIterator::Pos afterFirst = getPos(); + // This could be a property-query or named-element. + const UChar32 second = chars_.next(charsOptions_ & ~(RuleCharacterIterator::PARSE_ESCAPES | + RuleCharacterIterator::SKIP_WHITESPACE), + unusedEscaped, errorCode); + if ((first == u'[' && second == u':') || + (first == u'\\' && (second == u'p' || second == u'P' || second == u'N'))) { + if (second == u'N') { + UChar32 const queryResult = scanNamedElementBrackets(errorCode); + return LexicalElement( + LexicalElement::NAMED_ELEMENT, UnicodeString(queryResult), getPos(), errorCode, + /*precomputedSet=*/nullptr, + /*set=*/{}, + std::u16string_view(pattern_).substr(start, parsePosition_.getIndex() - start), + separated, preceding); } else { - // Handle opening '[' delimiter - mode = 1; - patLocal.append(u'['); - chars.getPos(backup); // prepare to backup - c = chars.next(opts, literal, ec); - if (U_FAILURE(ec)) return; - if (c == u'^' && !literal) { - invert = true; - patLocal.append(u'^'); - chars.getPos(backup); // prepare to backup - c = chars.next(opts, literal, ec); - if (U_FAILURE(ec)) return; - } - // Fall through to handle special leading '-'; - // otherwise restart loop for nested [], \p{}, etc. - if (c == u'-') { - literal = true; - // Fall through to handle literal '-' below + UnicodeSet queryResult = scanPropertyQueryAfterStart(first, second, start, errorCode); + return LexicalElement( + LexicalElement::PROPERTY_QUERY, {}, getPos(), errorCode, + /*precomputedSet=*/nullptr, /*set=*/std::move(queryResult), + std::u16string_view(pattern_).substr(start, parsePosition_.getIndex() - start), + separated, preceding); + } + } + // Not a property-query. + chars_.setPos(afterFirst); + } + if (first == u'$' && symbols_ != nullptr) { + auto nameEnd = parsePosition_; + // The SymbolTable defines the lexing of variable names past the $. + if (UnicodeString name = symbols_->parseReference(pattern_, nameEnd, pattern_.length()); + // LexicalElements returned here and from evaluateVariable are always constructed + // with separated=true, preceding=nullopt: the separation constraints are lexical, + // and variables are their own lexical elements; their values are not affected by + // lexical constraints. + !name.isEmpty()) { + chars_.jumpahead(nameEnd.getIndex() - (start + 1)); + const std::u16string_view source = + std::u16string_view(pattern_).substr(start, parsePosition_.getIndex() - start); + const UnicodeSet *precomputedSet = symbols_->lookupSet(name); + if (precomputedSet != nullptr) { + return LexicalElement(LexicalElement::VARIABLE, {}, getPos(), U_ZERO_ERROR, + precomputedSet, /*set=*/{}, source, /*separated=*/true, + /*preceding=*/std::nullopt); + } + // The variable was not a precomputed set. Use the old-fashioned `lookup`, which + // should give us its source text; if that parses as a single set or element, use + // it. Note that variables are not allowed in that expansion. + // Implementers of higher-level syntaxes that pre-parse UnicodeSet-valued variables + // can use variables in their variable definitions, but those that simply use the + // source text substitution API cannot. + const UnicodeString *const expression = symbols_->lookup(name); + if (expression == nullptr) { + return LexicalElement( + LexicalElement::VARIABLE, {}, getPos(), U_UNDEFINED_VARIABLE, + /*precomputedSet=*/nullptr, + /*set=*/{}, + source, + /*separated=*/true, + /*preceding=*/std::nullopt); + } + return evaluateVariable(*expression, source); + } + } + switch (first) { + case u'[': + return LexicalElement( + LexicalElement::SET_OPERATOR, UnicodeString(u'['), getPos(), errorCode, + /*precomputedSet=*/nullptr, + /*set=*/{}, + std::u16string_view(pattern_).substr(start, parsePosition_.getIndex() - start), + separated, preceding); + case u'\\': { + // Now try to parse the escape. + chars_.setPos(before); + UChar32 codePoint = chars_.next(charsOptions_, unusedEscaped, errorCode); + return LexicalElement( + LexicalElement::ESCAPED_ELEMENT, + UnicodeString(codePoint), getPos(), errorCode, + nullptr, + /*set=*/{}, + std::u16string_view(pattern_).substr(start, parsePosition_.getIndex() - start), + separated, preceding); + } + case u'&': + case u'-': + case u']': + case u'^': + case u'$': + // We make $ a set-operator to handle the ICU extensions involving $. + return LexicalElement( + LexicalElement::SET_OPERATOR, UnicodeString(first), getPos(), errorCode, + /*precomputedSet=*/nullptr, + /*set=*/{}, + std::u16string_view(pattern_).substr(start, parsePosition_.getIndex() - start), + separated, preceding); + case u'{': { + UnicodeString string; + UBool escaped; + UChar32 next; + int32_t codePointCount = 0; + while (!chars_.atEnd() && U_SUCCESS(errorCode)) { + const RuleCharacterIterator::Pos beforeNext = getPos(); + next = chars_.next(charsOptions_ & ~(RuleCharacterIterator::PARSE_ESCAPES | + RuleCharacterIterator::SKIP_WHITESPACE), + unusedEscaped, errorCode); + if (next == u'\\') { + const UChar32 afterBackslash = + chars_.next(charsOptions_ & ~(RuleCharacterIterator::PARSE_ESCAPES | + RuleCharacterIterator::SKIP_WHITESPACE), + unusedEscaped, errorCode); + if (afterBackslash == u'N') { + next = scanNamedElementBrackets(errorCode); + escaped = true; + } else if (afterBackslash == u'p' || afterBackslash == u'P') { + return LexicalElement(LexicalElement::STRING_LITERAL, {}, getPos(), + U_MALFORMED_SET, + /*precomputedSet=*/nullptr, + /*set=*/{}, + std::u16string_view(pattern_).substr( + start, parsePosition_.getIndex() - start), + separated, preceding); } else { - chars.setPos(backup); // backup - continue; + chars_.setPos(beforeNext); + // Parse the escape. + next = chars_.next(charsOptions_, escaped, errorCode); } - } - } else if (symbols != nullptr) { - const UnicodeFunctor *m = symbols->lookupMatcher(c); - if (m != nullptr) { - const UnicodeSet *ms = dynamic_cast(m); - if (ms == nullptr) { - ec = U_MALFORMED_SET; - return; + } else { +#if U_ICU_VERSION_MAJOR_NUM < 81 + if (U_SUCCESS(errorCode) && PatternProps::isWhiteSpace(next)) { + // Transitional prohibition of unescaped spaces in string literals (in + // ICU 78 and earlier, these were ignored; in ICU 81 they will mean + // themselves). + errorCode = UErrorCode::U_ILLEGAL_ARGUMENT_ERROR; } - // casting away const, but `nested' won't be modified - // (important not to modify stored set) - nested = const_cast(ms); - setMode = 3; +#else +#error Remove this transitional check, see ICU-23307 and ICU-TC minutes of 2026-01-16. +#endif + escaped = false; + } + if (!escaped && next == u'}') { + return LexicalElement( + codePointCount == 1 ? LexicalElement::BRACKETED_ELEMENT + : LexicalElement::STRING_LITERAL, + std::move(string), getPos(), errorCode, + /*precomputedSet=*/nullptr, + /*set=*/{}, + std::u16string_view(pattern_).substr(start, parsePosition_.getIndex() - start), + separated, preceding); } + string.append(next); + codePointCount += 1; } + return LexicalElement( + LexicalElement::STRING_LITERAL, {}, getPos(), U_MALFORMED_SET, + /*precomputedSet=*/nullptr, + /*set=*/{}, + std::u16string_view(pattern_).substr(start, parsePosition_.getIndex() - start), + separated, preceding); } + default: + return LexicalElement( + LexicalElement::LITERAL_ELEMENT, UnicodeString(first), getPos(), errorCode, nullptr, + /*set=*/{}, + std::u16string_view(pattern_).substr(start, parsePosition_.getIndex() - start), + separated, preceding); + } + } - // -------- Handle a nested set. This either is inline in - // the pattern or represented by a stand-in that has - // previously been parsed and was looked up in the symbol - // table. - - if (setMode != 0) { - if (lastItem == 1) { - if (op != 0) { - // syntaxError(chars, "Char expected after operator"); - ec = U_MALFORMED_SET; - return; + UChar32 scanNamedElementBrackets(UErrorCode &errorCode) { + UBool unusedEscaped; + const UChar32 open = chars_.next(charsOptions_ & ~(RuleCharacterIterator::PARSE_ESCAPES | + RuleCharacterIterator::SKIP_WHITESPACE), + unusedEscaped, errorCode); + if (open == u'{') { + int32_t start = parsePosition_.getIndex(); + std::optional hex; + std::optional literal; + while (!chars_.atEnd() && U_SUCCESS(errorCode)) { + UChar32 last = chars_.next(charsOptions_ & ~(RuleCharacterIterator::PARSE_ESCAPES | + RuleCharacterIterator::SKIP_WHITESPACE), + unusedEscaped, errorCode); + if (last == u':') { + if (!hex.has_value()) { + hex.emplace(); + if (start == parsePosition_.getIndex() - 1) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + for (char16_t digit : std::u16string_view(pattern_).substr( + start, parsePosition_.getIndex() - 1 - start)) { + uint8_t nibble; + if (digit >= u'0' && digit <= u'9') { + nibble = digit - '0'; + } else { + digit = digit & ~0x20; + if (digit >= u'A' && digit <= u'F') { + nibble = digit - u'A' + 0xA; + } else { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + } + *hex = (*hex << 4) + nibble; + if (hex > 0x10FFFF) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + } + } else if (!literal.has_value()) { + const auto literalCodePoints = utfStringCodePoints( + std::u16string_view(pattern_).substr(start, + parsePosition_.getIndex() - 1 - start)); + auto it = literalCodePoints.begin(); + if (it == literalCodePoints.end() || !it->wellFormed() || + (literal = it->codePoint(), ++it) != literalCodePoints.end()) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + } else { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + start = parsePosition_.getIndex(); + } else if (last == u'}') { + const std::u16string_view u16name = std::u16string_view(pattern_).substr( + start, parsePosition_.getIndex() - 1 - start); + const UChar32 result = getCharacterByName(CharString().appendInvariantChars( + u16name.data(), static_cast(u16name.length()), errorCode)); + if (!U_SUCCESS(errorCode)) { + // Convert U_INVARIANT_CONVERSION_ERROR to U_ILLEGAL_ARGUMENT_ERROR. + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + if (result < 0 || (hex.has_value() && result != hex) || + (literal.has_value() && result != literal)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } + return result; } - add(lastChar, lastChar); - _appendToPat(patLocal, lastChar, false); - lastItem = 0; - op = 0; } + } + if (U_SUCCESS(errorCode)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return {}; + } - if (op == u'-' || op == u'&') { - patLocal.append(op); + LexicalElement evaluateVariable(const UnicodeString &expression, + const std::u16string_view source) { + UErrorCode errorCode = U_ZERO_ERROR; + ParsePosition expressionPosition; + RuleCharacterIterator expressionIterator(expression, symbols_, expressionPosition); + // Do not pass the symbols: we do not support recursive expansion of variables. + Lexer expressionLexer(expression, expressionPosition, expressionIterator, unicodeSetOptions_, + /*symbols=*/nullptr, caseClosure_); + auto variableToken = expressionLexer.lookahead(); + if (variableToken.isSetOperator(u'[')) { + UnicodeString rebuiltPattern; + UnicodeSet expressionValue = + parseUnicodeSet(expressionLexer, rebuiltPattern, unicodeSetOptions_, caseClosure_, + /*depth=*/0, errorCode); + expressionValue.setPattern(rebuiltPattern); + if (!expressionLexer.atEnd()) { + return LexicalElement( + LexicalElement::VARIABLE, {}, getPos(), U_MALFORMED_VARIABLE_DEFINITION, + /*precomputedSet=*/nullptr, + /*set=*/{}, + source, + /*separated=*/true, + /*preceding=*/std::nullopt); } - - if (nested == nullptr) { - // lazy allocation - if (!scratch.allocate()) { - ec = U_MEMORY_ALLOCATION_ERROR; - return; - } - nested = scratch.pointer(); + return LexicalElement( + LexicalElement::VARIABLE, {}, getPos(), errorCode, + /*precomputedSet=*/nullptr, + /*set=*/std::move(expressionValue), + source, + /*separated=*/true, + /*preceding=*/std::nullopt); + } else { + expressionLexer.advance(); + if (!expressionLexer.atEnd()) { + return LexicalElement( + LexicalElement::VARIABLE, {}, getPos(), U_MALFORMED_VARIABLE_DEFINITION, + /*precomputedSet=*/nullptr, + /*set=*/{}, + source, + /*separated=*/true, + /*preceding=*/std::nullopt); } - switch (setMode) { - case 1: - nested->applyPattern(chars, symbols, patLocal, options, caseClosure, depth + 1, ec); - break; - case 2: - chars.skipIgnored(opts); - nested->applyPropertyPattern(chars, patLocal, ec); - if (U_FAILURE(ec)) return; - break; - case 3: // `nested' already parsed - nested->_toPattern(patLocal, false); - break; + switch (variableToken.category_) { + case LexicalElement::LITERAL_ELEMENT: + case LexicalElement::ESCAPED_ELEMENT: + case LexicalElement::NAMED_ELEMENT: + case LexicalElement::BRACKETED_ELEMENT: + case LexicalElement::STRING_LITERAL: + case LexicalElement::PROPERTY_QUERY: + // Return the same lexical element that we found while parsing the variable contents, + // except the source position corresponds to the position of the variable rather than 0 + // in its expansion, and the source is the name of the variable rather than its + // expansion. + return LexicalElement( + variableToken.category_, std::move(variableToken.string_), getPos(), + variableToken.errorCode_, variableToken.precomputedSet_, std::move(variableToken.set_), source, + /*separated=*/true, + /*preceding=*/std::nullopt); + default: + return LexicalElement(LexicalElement::VARIABLE, {}, getPos(), + U_MALFORMED_VARIABLE_DEFINITION, + /*precomputedSet=*/nullptr, + /*set=*/{}, source, + /*separated=*/true, + /*preceding=*/std::nullopt); } + } + } - usePat = true; - - if (mode == 0) { - // Entire pattern is a category; leave parse loop - *this = *nested; - mode = 2; - break; + UnicodeSet scanPropertyQueryAfterStart(UChar32 first, UChar32 second, int32_t queryStart, UErrorCode &errorCode) { + std::optional queryOperatorPosition; + int32_t queryExpressionStart = parsePosition_.getIndex(); + bool exteriorlyNegated = false; + bool interiorlyNegated = false; + UBool unusedEscaped; + // Do not skip whitespace so we can recognize unspaced :]. Lex escapes and + // named-element: while ICU does not support string-valued properties and thus has no + // use for escapes, we still want to lex through escapes to allow downstream + // implementations (mostly unicodetools) to implement string-valued properties. + const UChar32 third = chars_.next(charsOptions_ & ~(RuleCharacterIterator::PARSE_ESCAPES | + RuleCharacterIterator::SKIP_WHITESPACE), + unusedEscaped, errorCode); + if (first == u'\\') { + if (third != u'{') { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; } - - switch (op) { - case u'-': - removeAll(*nested); - break; - case u'&': - retainAll(*nested); - break; - case 0: - addAll(*nested); - break; + exteriorlyNegated = second == u'P'; + queryExpressionStart = parsePosition_.getIndex(); + } else { + if (third == u'^') { + exteriorlyNegated = true; + queryExpressionStart = parsePosition_.getIndex(); } - - op = 0; - lastItem = 2; - - continue; - } - - if (mode == 0) { - // syntaxError(chars, "Missing '['"); - ec = U_MALFORMED_SET; - return; } - - // -------- Parse special (syntax) characters. If the - // current character is not special, or if it is escaped, - // then fall through and handle it below. - - if (!literal) { - switch (c) { - case u']': - if (lastItem == 1) { - add(lastChar, lastChar); - _appendToPat(patLocal, lastChar, false); - } - // Treat final trailing '-' as a literal - if (op == u'-') { - add(op, op); - patLocal.append(op); - } else if (op == u'&') { - // syntaxError(chars, "Trailing '&'"); - ec = U_MALFORMED_SET; - return; - } - patLocal.append(u']'); - mode = 2; - continue; - case u'-': - if (op == 0) { - if (lastItem != 0) { - op = static_cast(c); - continue; - } else { - // Treat final trailing '-' as a literal - add(c, c); - c = chars.next(opts, literal, ec); - if (U_FAILURE(ec)) return; - if (c == u']' && !literal) { - patLocal.append(u"-]", 2); - mode = 2; - continue; - } + RuleCharacterIterator::Pos beforePenultimate = getPos(); + UChar32 penultimateUnescaped = + chars_.next(charsOptions_ & ~(RuleCharacterIterator::PARSE_ESCAPES | + RuleCharacterIterator::SKIP_WHITESPACE), + unusedEscaped, errorCode); + + while (!chars_.atEnd() && U_SUCCESS(errorCode)) { + const RuleCharacterIterator::Pos beforeLast = getPos(); + UChar32 lastUnescaped = + chars_.next(charsOptions_ & ~(RuleCharacterIterator::PARSE_ESCAPES | + RuleCharacterIterator::SKIP_WHITESPACE), + unusedEscaped, errorCode); + if (penultimateUnescaped == u'\\') { + if (lastUnescaped == 'N') { + scanNamedElementBrackets(errorCode); + if (!U_SUCCESS(errorCode)) { + return {}; } + } else { + // There must be an escaped-element starting at beforePenultimate. Go + // back there and advance through it. + chars_.setPos(beforePenultimate); + chars_.next(charsOptions_ & ~RuleCharacterIterator::SKIP_WHITESPACE, unusedEscaped, + errorCode); } - // syntaxError(chars, "'-' not after char or set"); - ec = U_MALFORMED_SET; - return; - case u'&': - if (lastItem == 2 && op == 0) { - op = static_cast(c); - continue; - } - // syntaxError(chars, "'&' not after set"); - ec = U_MALFORMED_SET; - return; - case u'^': - // syntaxError(chars, "'^' not after '['"); - ec = U_MALFORMED_SET; - return; - case u'{': - if (op != 0) { - // syntaxError(chars, "Missing operand after operator"); - ec = U_MALFORMED_SET; - return; - } - if (lastItem == 1) { - add(lastChar, lastChar); - _appendToPat(patLocal, lastChar, false); + // Neither a named-element nor an escaped-element can be part of a closing :]. + lastUnescaped = -1; + } else if (!queryOperatorPosition.has_value() && lastUnescaped == u'=') { + queryOperatorPosition = parsePosition_.getIndex() - 1; + } else if (!queryOperatorPosition.has_value() && lastUnescaped == u'≠') { + if (exteriorlyNegated) { + // Reject doubly negated property queries. + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; } - lastItem = 0; - buf.truncate(0); - { - UBool ok = false; - while (!chars.atEnd()) { - c = chars.next(opts, literal, ec); - if (U_FAILURE(ec)) return; - if (c == u'}' && !literal) { - ok = true; - break; - } - buf.append(c); - } - if (!ok) { - // syntaxError(chars, "Invalid multicharacter string"); - ec = U_MALFORMED_SET; - return; + interiorlyNegated = true; + queryOperatorPosition = parsePosition_.getIndex() - 1; + } else if ((first == u'[' && penultimateUnescaped == u':' && lastUnescaped == u']') || + (first == u'\\' && lastUnescaped == u'}')) { + // Note that no unescaping is performed here, as ICU does not support string-valued or + // or miscellaneous properties. + const int32_t queryExpressionLimit = + first == u'[' ? parsePosition_.getIndex() - 2 : parsePosition_.getIndex() - 1; + // Contrary to Java, applyPropertyAlias does not support a null property-predicate in + // C++; instead "" indicates the absence of a property-predicate. This is OK with the + // properties supported by ICU, but not with string-valued or miscellaneous properties; + // see https://github.com/unicode-org/icu/pull/3456. + UnicodeString propertyPredicate; + if (queryOperatorPosition.has_value()) { + propertyPredicate = + pattern_.tempSubStringBetween(*queryOperatorPosition + 1, queryExpressionLimit); + if (propertyPredicate.isEmpty()) { + // \p{X=} is valid if X is a string-valued or miscellaneous property, but + // ICU does not support those. Thus, it is invalid for ICU purposes, and + // passing an empty propertyPredicate to applyPropertyAlias can be valid + // (this is how we represent \p{X}), so we need to return the error here. + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; } } - // We have new string. Add it to set and continue; - // we don't need to drop through to the further - // processing - add(buf); - patLocal.append(u'{'); - _appendToPat(patLocal, buf, false); - patLocal.append(u'}'); - continue; - case SymbolTable::SYMBOL_REF: - // symbols nosymbols - // [a-$] error error (ambiguous) - // [a$] anchor anchor - // [a-$x] var "x"* literal '$' - // [a-$.] error literal '$' - // *We won't get here in the case of var "x" - { - chars.getPos(backup); - c = chars.next(opts, literal, ec); - if (U_FAILURE(ec)) return; - UBool anchor = (c == u']' && !literal); - if (symbols == nullptr && !anchor) { - c = SymbolTable::SYMBOL_REF; - chars.setPos(backup); - break; // literal '$' - } - if (anchor && op == 0) { - if (lastItem == 1) { - add(lastChar, lastChar); - _appendToPat(patLocal, lastChar, false); - } - add(U_ETHER); - usePat = true; - patLocal.append(static_cast(SymbolTable::SYMBOL_REF)); - patLocal.append(u']'); - mode = 2; - continue; - } - // syntaxError(chars, "Unquoted '$'"); - ec = U_MALFORMED_SET; - return; + UnicodeSet result; + result.applyPropertyAlias( + pattern_.tempSubStringBetween(queryExpressionStart, + queryOperatorPosition.value_or(queryExpressionLimit)), + propertyPredicate, errorCode); + if (exteriorlyNegated != interiorlyNegated) { + result.complement().removeAllStrings(); } - default: - break; + result.setPattern(pattern_.tempSubStringBetween(queryStart, parsePosition_.getIndex())); + return result; } + beforePenultimate = beforeLast; + penultimateUnescaped = lastUnescaped; } + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return {}; + } - // -------- Parse literal characters. This includes both - // escaped chars ("\u4E01") and non-syntax characters - // ("a"). - - switch (lastItem) { - case 0: - lastItem = 1; - lastChar = c; - break; - case 1: - if (op == u'-') { - if (lastChar >= c) { - // Don't allow redundant (a-a) or empty (b-a) ranges; - // these are most likely typos. - // syntaxError(chars, "Invalid range"); - ec = U_MALFORMED_SET; - return; - } - add(lastChar, c); - _appendToPat(patLocal, lastChar, false); - patLocal.append(op); - _appendToPat(patLocal, c, false); - lastItem = 0; - op = 0; - } else { - add(lastChar, lastChar); - _appendToPat(patLocal, lastChar, false); - lastChar = c; + const UnicodeString &pattern_; + const ParsePosition &parsePosition_; + RuleCharacterIterator &chars_; + const uint32_t unicodeSetOptions_; + const int32_t charsOptions_; + const SymbolTable *const symbols_; + UnicodeSet &(UnicodeSet::* const caseClosure_)(int32_t attribute); + std::optional behind_; + std::optional ahead_; + std::optional ahead2_; +}; + +namespace { + +constexpr int32_t MAX_DEPTH = 100; + +#if U_DEBUGGING_UNICODESET_PARSING + +#define U_UNICODESET_RETURN_IF_ERROR(result, ec) \ + do { \ + constexpr std::string_view functionName = __func__; \ + static_assert(functionName.substr(0, 5) == "parse"); \ + if (U_FAILURE(ec)) { \ + if (depth < 5) { \ + printf("--- in %s l. %d\n", __func__ + 5, __LINE__); \ + } else if (depth == 5 && std::string_view(__func__ + 5) == "UnicodeSet") { \ + printf("--- [...]\n"); \ + } \ + return result; \ + } \ + } while (false) +#define U_UNICODESET_RETURN_WITH_PARSE_ERROR(result, expected, actual, lexer, ec) \ + do { \ + constexpr std::string_view functionName = __func__; \ + static_assert(functionName.substr(0, 5) == "parse"); \ + std::string actualUTF8; \ + std::string contextUTF8; \ + printf("*** Expected %s, got %s %s\n", (expected), \ + UnicodeString(actual).toUTF8String(actualUTF8).c_str(), \ + lexer.getPositionForDebugging().toUTF8String(contextUTF8).c_str()); \ + printf("--- in %s l. %d\n", __func__ + 5, __LINE__); \ + if (U_FAILURE(lexer.lookahead().errorCode())) { \ + (ec) = lexer.lookahead().errorCode(); \ + } else { \ + (ec) = U_MALFORMED_SET; \ + } \ + return result; \ + } while (false) + +#else + +#define U_UNICODESET_RETURN_IF_ERROR(result, ec) \ + do { \ + if (U_FAILURE(ec)) { \ + return result; \ + } \ + } while (false) +#define U_UNICODESET_RETURN_WITH_PARSE_ERROR(result, expected, actual, lexer, ec) \ + do { \ + if (U_FAILURE(lexer.lookahead().errorCode())) { \ + (ec) = lexer.lookahead().errorCode(); \ + } else { \ + (ec) = U_MALFORMED_SET; \ + } \ + return result; \ + } while (false) + +#endif + +} // namespace + +/** + * Parse the pattern from the given RuleCharacterIterator. The + * iterator is advanced over the parsed pattern. + * @param pattern The pattern, only used by debug traces. + * @param parsePosition The ParsePosition underlying chars, only used by debug traces. + * @param chars iterator over the pattern characters. Upon return + * it will be advanced to the first character after the parsed + * pattern, or the end of the iteration if all characters are + * parsed. + * @param symbols symbol table to use to parse and dereference + * variables, or null if none. + * @param rebuiltPat the pattern that was parsed, rebuilt or + * copied from the input pattern, as appropriate. + * @param options a bit mask of zero or more of the following: + * IGNORE_SPACE, CASE. + */ + +void UnicodeSet::applyPattern(const UnicodeString &pattern, + const ParsePosition &parsePosition, + RuleCharacterIterator &chars, + const SymbolTable *symbols, + UnicodeString &rebuiltPat, + uint32_t options, + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute), + UErrorCode &ec) { + if (U_FAILURE(ec)) return; + Lexer lexer(pattern, parsePosition, chars, options, symbols, caseClosure); + *this = parseUnicodeSet(lexer, rebuiltPat, options, caseClosure, /*depth=*/0, ec); +} + +UnicodeSet UnicodeSet::parseUnicodeSet(Lexer &lexer, + UnicodeString& rebuiltPat, + uint32_t options, + UnicodeSet& (UnicodeSet::*caseClosure)(int32_t attribute), + int32_t depth, + UErrorCode &ec) { + UnicodeSet result; + + if (depth > MAX_DEPTH) { + U_UNICODESET_RETURN_WITH_PARSE_ERROR({}, ("depth <= " + std::to_string(MAX_DEPTH)).c_str(), + ("depth = " + std::to_string(depth)).c_str(), lexer, + ec); + } + + bool isComplement = false; + // Whether to keep the syntax of the pattern at this level, only doing basic pretty-printing, e.g., + // turn [ c - z[a]a - b ] into [c-z[a]a-b], but not into [a-z]. + // This is true for a property query, or when there is a nested set. Note that since we recurse, + // innermost sets consisting only of ranges will get simplified. + bool preserveSyntaxInPattern = false; + // A pattern that preserves the original syntax but strips spaces, normalizes escaping, etc. + UnicodeString prettyPrintedPattern; + if (lexer.lookahead().set() != nullptr) { + // UnicodeSet ::= property-query + // Extension: + // | set-valued-variable + result = *lexer.lookahead().set(); + result._toPattern(prettyPrintedPattern, /*escapeUnprintable=*/false); + lexer.advance(); + preserveSyntaxInPattern = true; + } else { + // UnicodeSet ::= [ Content ] + // | Complement ::= [ ^ Content ] + if (lexer.acceptSetOperator(u'[')) { + prettyPrintedPattern.append(u'['); + if (lexer.acceptSetOperator(u'^')) { + prettyPrintedPattern.append(u'^'); + isComplement = true; } - break; - case 2: - if (op != 0) { - // syntaxError(chars, "Set expected after operator"); - ec = U_MALFORMED_SET; - return; + result = parseContent(lexer, prettyPrintedPattern, options, caseClosure, depth, + /*containsSetOperation=*/preserveSyntaxInPattern, ec); + U_UNICODESET_RETURN_IF_ERROR(result, ec); + if (!lexer.acceptSetOperator(u']')) { + U_UNICODESET_RETURN_WITH_PARSE_ERROR(result, "]", lexer.lookahead().debugString(), + lexer, ec); } - lastChar = c; - lastItem = 1; - break; + prettyPrintedPattern.append(u']'); + } else { + U_UNICODESET_RETURN_WITH_PARSE_ERROR(result, "property-query | [", + lexer.lookahead().debugString(), lexer, ec); } } - if (mode != 2) { - // syntaxError(chars, "Missing ']'"); - ec = U_MALFORMED_SET; - return; - } - - chars.skipIgnored(opts); - /** - * Handle global flags (invert, case insensitivity). If this + * Handle global flags (isComplement, case insensitivity). If this * pattern should be compiled case-insensitive, then we need * to close over case BEFORE COMPLEMENTING. This makes * patterns like /[^abc]/i work. */ if ((options & USET_CASE_MASK) != 0) { - (this->*caseClosure)(options); + (result.*caseClosure)(options); } - if (invert) { - complement().removeAllStrings(); // code point complement + if (isComplement) { + result.complement().removeAllStrings(); // code point complement + } + if (preserveSyntaxInPattern) { + rebuiltPat.append(prettyPrintedPattern); + } else { + result._generatePattern(rebuiltPat, /*escapeUnprintable=*/false); } + return result; +} - // Use the rebuilt pattern (patLocal) only if necessary. Prefer the - // generated pattern. - if (usePat) { - rebuiltPat.append(patLocal); +UnicodeSet UnicodeSet::parseContent(Lexer &lexer, + UnicodeString &rebuiltPat, + uint32_t options, + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute), + int32_t depth, + bool &containsSetOperation, + UErrorCode &ec) { + UnicodeSet result; + // Content ::= "" + // | ElementList + // | ElementList UnescapedHyphenMinus + // -- ICU extensions: + // | Æther + // | ElementList Æther + // | DollarElements UnescapedHyphenMinus + // | DollarElements Æther + // | ElementList DollarElements UnescapedHyphenMinus + // | ElementList DollarElements Æther + // Æther ::= $ -- ICU extension + // ElementList ::= UnescapedHyphenMinus + // | Elements + // | ElementList Elements + // | SetOperation + // | ElementList DollarElements Elements -- ICU extension + // SetOperation ::= Union + // | Intersection + // | Difference + // Union ::= UnicodeSet + // | ElementList UnicodeSet + // | ElementList DollarElements UnicodeSet -- ICU extension + // -- ICU extension: + // DollarElements ::= $ + // | RangeElement-$ + // But that is not LL (we cannot tell if we have a SetOperation or not by looking at the + // first Elements), so we parse it as described in the note, + // ElementList ::= Mutation Mutations | UnescapedHyphenMinus Mutations + // Mutations ::= "" | Mutation Mutations + // Mutation ::= Elements | SetOperations + // Where a Mutation is not a subexpression, but a modification of the enclosing ElementList, + // either adding or removing characters; this means that `result.parseMutation` adds to or + // removes from `result`, instead of being static returning a set. + // In parseSetOperations below, we will describe the logic both in terms of the LR + // expression grammar, and in terms of the LL grammar. + // With the DollarElements ICU extension, a non-final Mutation can be DollarElements, so this + // becomes + // ElementList ::= Mutations FinalMutation + // | UnescapedHyphenMinus Mutations FinalMutation + // | UnescapedHyphenMinus + // Mutation ::= Elements + // | SetOperations + // | DollarElements -- ICU extension + // FinalMutation ::= Elements + // | SetOperations + if (lexer.acceptSetOperator(u'-')) { + result.add(u'-'); + // When we otherwise preserve the syntax, we escape an initial UnescapedHyphenMinus, but not a + // final one, for consistency with older ICU behaviour. + rebuiltPat.append(u"\\-"); + } + while (!lexer.atEnd()) { + if (lexer.acceptSetOperator(u'-')) { + // We can be here on the first iteration: [--] is allowed by the + // grammar and by the old parser. + rebuiltPat.append(u'-'); + result.add(u'-'); + return result; + } else if (lexer.lookahead().isSetOperator(u'$')) { + if (lexer.lookahead2().isSetOperator(u']')) { + // ICU extensions: A $ is allowed in an ElementList if followed by Elements, or + // if followed by UnicodeSet (in a Union). + // A $ at the end of a Content is an Æther. + rebuiltPat.append(u'$'); + // Consume the dollar. + lexer.advance(); + result.add(U_ETHER); + containsSetOperation = true; + return result; + } + } + if (lexer.lookahead().isSetOperator(u']')) { + return result; + } + // Also handles FinalMutation. + result.parseMutation(lexer, rebuiltPat, options, caseClosure, depth, containsSetOperation, + ec); + U_UNICODESET_RETURN_IF_ERROR(result, ec); + } + return result; +} + +void UnicodeSet::parseMutation(Lexer &lexer, + UnicodeString &rebuiltPat, + uint32_t options, + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute), + int32_t depth, + bool &containsSetOperation, + UErrorCode &ec) { + // Mutation ::= Elements + // | SetOperations + // | DollarElements -- ICU extension + // FinalMutation ::= Elements + // | SetOperations + // SetOperations ::= UnicodeSet RightHandSides + // So if we see the beginning of a UnicodeSet, we have SetOperations. + if (lexer.lookahead().isSetOperator('[') || lexer.lookahead().set() != nullptr) { + containsSetOperation = true; + parseSetOperations(lexer, rebuiltPat, options, caseClosure, depth, ec); + U_UNICODESET_RETURN_IF_ERROR(, ec); } else { - _generatePattern(rebuiltPat, false); + // Also handles DollarElements. + addAll(parseElements(lexer, rebuiltPat, ec)); + U_UNICODESET_RETURN_IF_ERROR(, ec); } - if (isBogus() && U_SUCCESS(ec)) { - // We likely ran out of memory. AHHH! - ec = U_MEMORY_ALLOCATION_ERROR; +} + +void UnicodeSet::parseSetOperations(Lexer &lexer, + UnicodeString &rebuiltPat, + uint32_t options, + UnicodeSet &(UnicodeSet::*caseClosure)(int32_t attribute), + int32_t depth, + UErrorCode &ec) { + // When we return from this function, this object represents a + // https://www.unicode.org/reports/tr61/#SetOperation: + // SetOperation ::= Union + // | Intersection + // | Difference + // Union ::= UnicodeSet + // | ElementList UnicodeSet + // | ElementList DollarElements UnicodeSet -- ICU extension + // Intersection ::= SetOperation & UnicodeSet + // Difference ::= SetOperation - UnicodeSet + // since we parse top-down, we have already gone past any ElementList in the Union and added + // those to this object, and we end up with the UnicodeSet of the Union following by any + // right hand sides. In the LL grammar from the note, this is: + // SetOperations ::= UnicodeSet RightHandSides + // RightHandSides ::= "" + // | & UnicodeSet RightHandSides + // | - UnicodeSet RightHandSides + // but note that the tree resulting from this LL version is not an expression tree: the + // operations are left-associative. + // Start by parsing the first UnicodeSet. + const UnicodeSet leftHandSide = + parseUnicodeSet(lexer, rebuiltPat, options, caseClosure, depth + 1, ec); + addAll(leftHandSide); + U_UNICODESET_RETURN_IF_ERROR(, ec); + // In terms of the LR expression grammar, at this point this object is the Union, which is a + // SetOperation. + + // Keep looking for an operator that would continue the RightHandSides in the LL grammar. + // The loop terminates because when we run out of source text, the lookahead token will not be a + // set operator, so that we hit the else branch and return. + for (;;) { + // In terms of the LR expression grammar, at this point this object is a SetOperation; if & + // follows, we have an Intersection; if - follows, we have a Difference. + if (lexer.acceptSetOperator(u'&')) { + // Intersection ::= SetOperation & UnicodeSet + rebuiltPat.append(u'&'); + const UnicodeSet rightHandSide = + parseUnicodeSet(lexer, rebuiltPat, options, caseClosure, depth + 1, ec); + U_UNICODESET_RETURN_IF_ERROR(, ec); + retainAll(rightHandSide); + } else if (lexer.lookahead().isSetOperator(u'-')) { + // Here the grammar requires two tokens of lookahead to figure out whether the - is + // the operator of a Difference or an UnescapedHyphenMinus in the enclosing Union. + if (lexer.lookahead2().isSetOperator(u']')) { + // The operator is actually an UnescapedHyphenMinus; terminate the SetOperation + // before it. We return to parseMutation, which immediately returns to + // parseContent, which will accept the - and add it to *this. + return; + } + // Consume the hyphen-minus. + lexer.advance(); + // Difference ::= SetOperation - UnicodeSet + rebuiltPat.append(u'-'); + const UnicodeSet rightHandSide = + parseUnicodeSet(lexer, rebuiltPat, options, caseClosure, depth + 1, ec); + U_UNICODESET_RETURN_IF_ERROR(, ec); + removeAll(rightHandSide); + } else { + // Not an operator, end of the SetOperation (and of the SetOperations in the LL + // grammar). + return; + } + } +} + +UnicodeSet UnicodeSet::parseElements(Lexer &lexer, + UnicodeString &rebuiltPat, + UErrorCode &ec) { + // Elements ::= Element + // | Range + // Range ::= RangeElement - RangeElement + // | $ - RangeElement -- ICU extension + // RangeElement ::= literal-element + // | escaped-element + // | named-element + // | bracketed-element + // Element ::= RangeElement + // | string-literal + // In addition, this function handles the following ICU extension: + // DollarElements ::= $ + // | RangeElement - $ + // which cannot appear at the end of Content. + // A Content-final $ would already have been interpreted as an Æther by parseContent, so we + // only need to check that RangeElement - $ is not Content-final. + if (lexer.lookahead().isStringLiteral()) { + const UnicodeString element = *lexer.lookahead().element(); + rebuiltPat.append(u'{'); + _appendToPat(rebuiltPat, element, /*escapeUnprintable=*/false); + rebuiltPat.append(u'}'); + lexer.advance(); + return UnicodeSet().add(element); + } + UChar32 first; + if (lexer.lookahead().isSetOperator(u'$')) { + // Disallowed by UTS #61, but historically accepted by ICU. This is an extension. + first = u'$'; + } else if (lexer.lookahead().codePoint().has_value()) { + first = *lexer.lookahead().codePoint(); + } else { + U_UNICODESET_RETURN_WITH_PARSE_ERROR({}, "RangeElement | string-literal", + lexer.lookahead().debugString(), lexer, ec); } + lexer.advance(); + _appendToPat(rebuiltPat, first, /*escapeUnprintable=*/false); + if (!lexer.lookahead().isSetOperator(u'-')) { + // No operator, + // Elements ::= Element + return UnicodeSet(first, first); + } + // Here the grammar requires two tokens of lookahead to figure out whether the - is the operator + // of a Range or an UnescapedHyphenMinus in the enclosing Union. + if (lexer.lookahead2().isSetOperator(u']')) { + // The operator is actually an UnescapedHyphenMinus; terminate the Elements before it. + return UnicodeSet(first, first); + } + // Consume the hyphen-minus. + lexer.advance(); + // Elements ::= Range ::= RangeElement - RangeElement + rebuiltPat.append(u'-'); + UChar32 last; + if (lexer.lookahead().isSetOperator(u'$')) { + // Disallowed by UTS #61, but historically accepted by ICU except at the end of a Content. + // This is an extension. + last = u'$'; + if (lexer.lookahead2().isSetOperator(u']')) { + U_UNICODESET_RETURN_WITH_PARSE_ERROR( + {}, "Elements or UnicodeSet after Range ending in unescaped $", + lexer.lookahead().debugString() + u" followed by " + + lexer.lookahead2().debugString(), + lexer, ec); + } + } else if (lexer.lookahead().codePoint().has_value()) { + last = *lexer.lookahead().codePoint(); + } else { + U_UNICODESET_RETURN_WITH_PARSE_ERROR({}, "RangeElement", lexer.lookahead().debugString(), + lexer, ec); + } + if (last <= first) { + U_UNICODESET_RETURN_WITH_PARSE_ERROR({}, "first < last in Range", + UnicodeString(last) + u"-" + UnicodeString(first), + lexer, ec); + } + lexer.advance(); + _appendToPat(rebuiltPat, last, /*escapeUnprintable=*/false); + return UnicodeSet(first, last); } //---------------------------------------------------------------- @@ -751,23 +1470,6 @@ void UnicodeSet::applyFilter(UnicodeSet::Filter filter, namespace { -UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { - /* Note: we use ' ' in compiler code page */ - int32_t j = 0; - char ch; - --dstCapacity; /* make room for term. zero */ - while ((ch = *src++) != 0) { - if (ch == ' ' && (j==0 || (j>0 && dst[j-1]==' '))) { - continue; - } - if (j >= dstCapacity) return false; - dst[j++] = ch; - } - if (j > 0 && dst[j-1] == ' ') --j; - dst[j] = 0; - return true; -} - } // namespace //---------------------------------------------------------------- @@ -780,7 +1482,7 @@ UBool mungeCharName(char* dst, const char* src, int32_t dstCapacity) { } UPRV_BLOCK_MACRO_END UnicodeSet& -UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) { +UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) U_LIFETIME_BOUND { if (U_FAILURE(ec) || isFrozen()) { return *this; } if (prop == UCHAR_GENERAL_CATEGORY_MASK) { const UnicodeSet* inclusions = CharacterProperties::getInclusionsForProperty(prop, ec); @@ -817,7 +1519,7 @@ UnicodeSet::applyIntPropertyValue(UProperty prop, int32_t value, UErrorCode& ec) UnicodeSet& UnicodeSet::applyPropertyAlias(const UnicodeString& prop, const UnicodeString& value, - UErrorCode& ec) { + UErrorCode& ec) U_LIFETIME_BOUND { if (U_FAILURE(ec) || isFrozen()) return *this; // prop and value used to be converted to char * using the default @@ -891,30 +1593,21 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, } case UCHAR_NAME: { - // Must munge name, since u_charFromName() does not do - // 'loose' matching. - char buf[128]; // it suffices that this be > uprv_getMaxCharNameLength - if (!mungeCharName(buf, vname.data(), sizeof(buf))) FAIL(ec); - UChar32 ch = u_charFromName(U_EXTENDED_CHAR_NAME, buf, &ec); - if (U_SUCCESS(ec)) { - clear(); - add(ch); - return *this; - } else { + const UChar32 ch = getCharacterByName(vname); + if (ch < 0) { FAIL(ec); } + clear(); + add(ch); + return *this; } case UCHAR_UNICODE_1_NAME: // ICU 49 deprecates the Unicode_1_Name property APIs. FAIL(ec); case UCHAR_AGE: { - // Must munge name, since u_versionFromString() does not do - // 'loose' matching. - char buf[128]; - if (!mungeCharName(buf, vname.data(), sizeof(buf))) FAIL(ec); UVersionInfo version; - u_versionFromString(version, buf); + u_versionFromString(version, vname.data()); applyFilter(versionFilter, &version, CharacterProperties::getInclusionsForProperty(p, ec), ec); return *this; @@ -1002,156 +1695,4 @@ UBool UnicodeSet::resemblesPropertyPattern(const UnicodeString& pattern, return isPOSIXOpen(pattern, pos) || isPerlOpen(pattern, pos) || isNameOpen(pattern, pos); } -/** - * Return true if the given iterator appears to point at a - * property pattern. Regardless of the result, return with the - * iterator unchanged. - * @param chars iterator over the pattern characters. Upon return - * it will be unchanged. - * @param iterOpts RuleCharacterIterator options - */ -UBool UnicodeSet::resemblesPropertyPattern(RuleCharacterIterator& chars, - int32_t iterOpts) { - // NOTE: literal will always be false, because we don't parse escapes. - UBool result = false, literal; - UErrorCode ec = U_ZERO_ERROR; - iterOpts &= ~RuleCharacterIterator::PARSE_ESCAPES; - RuleCharacterIterator::Pos pos; - chars.getPos(pos); - UChar32 c = chars.next(iterOpts, literal, ec); - if (c == u'[' || c == u'\\') { - UChar32 d = chars.next(iterOpts & ~RuleCharacterIterator::SKIP_WHITESPACE, - literal, ec); - result = (c == u'[') ? (d == u':') : - (d == u'N' || d == u'p' || d == u'P'); - } - chars.setPos(pos); - return result && U_SUCCESS(ec); -} - -/** - * Parse the given property pattern at the given parse position. - */ -UnicodeSet& UnicodeSet::applyPropertyPattern(const UnicodeString& pattern, - ParsePosition& ppos, - UErrorCode &ec) { - int32_t pos = ppos.getIndex(); - - UBool posix = false; // true for [:pat:], false for \p{pat} \P{pat} \N{pat} - UBool isName = false; // true for \N{pat}, o/w false - UBool invert = false; - - if (U_FAILURE(ec)) return *this; - - // Minimum length is 5 characters, e.g. \p{L} - if ((pos+5) > pattern.length()) { - FAIL(ec); - } - - // On entry, ppos should point to one of the following locations: - // Look for an opening [:, [:^, \p, or \P - if (isPOSIXOpen(pattern, pos)) { - posix = true; - pos += 2; - pos = ICU_Utility::skipWhitespace(pattern, pos); - if (pos < pattern.length() && pattern.charAt(pos) == u'^') { - ++pos; - invert = true; - } - } else if (isPerlOpen(pattern, pos) || isNameOpen(pattern, pos)) { - char16_t c = pattern.charAt(pos+1); - invert = (c == u'P'); - isName = (c == u'N'); - pos += 2; - pos = ICU_Utility::skipWhitespace(pattern, pos); - if (pos == pattern.length() || pattern.charAt(pos++) != u'{') { - // Syntax error; "\p" or "\P" not followed by "{" - FAIL(ec); - } - } else { - // Open delimiter not seen - FAIL(ec); - } - - // Look for the matching close delimiter, either :] or } - int32_t close; - if (posix) { - close = pattern.indexOf(u":]", 2, pos); - } else { - close = pattern.indexOf(u'}', pos); - } - if (close < 0) { - // Syntax error; close delimiter missing - FAIL(ec); - } - - // Look for an '=' sign. If this is present, we will parse a - // medium \p{gc=Cf} or long \p{GeneralCategory=Format} - // pattern. - int32_t equals = pattern.indexOf(u'=', pos); - UnicodeString propName, valueName; - if (equals >= 0 && equals < close && !isName) { - // Equals seen; parse medium/long pattern - pattern.extractBetween(pos, equals, propName); - pattern.extractBetween(equals+1, close, valueName); - } - - else { - // Handle case where no '=' is seen, and \N{} - pattern.extractBetween(pos, close, propName); - - // Handle \N{name} - if (isName) { - // This is a little inefficient since it means we have to - // parse NAME_PROP back to UCHAR_NAME even though we already - // know it's UCHAR_NAME. If we refactor the API to - // support args of (UProperty, char*) then we can remove - // NAME_PROP and make this a little more efficient. - valueName = propName; - propName = NAME_PROP; - } - } - - applyPropertyAlias(propName, valueName, ec); - - if (U_SUCCESS(ec)) { - if (invert) { - complement().removeAllStrings(); // code point complement - } - - // Move to the limit position after the close delimiter if the - // parse succeeded. - ppos.setIndex(close + (posix ? 2 : 1)); - } - - return *this; -} - -/** - * Parse a property pattern. - * @param chars iterator over the pattern characters. Upon return - * it will be advanced to the first character after the parsed - * pattern, or the end of the iteration if all characters are - * parsed. - * @param rebuiltPat the pattern that was parsed, rebuilt or - * copied from the input pattern, as appropriate. - */ -void UnicodeSet::applyPropertyPattern(RuleCharacterIterator& chars, - UnicodeString& rebuiltPat, - UErrorCode& ec) { - if (U_FAILURE(ec)) return; - UnicodeString pattern; - chars.lookahead(pattern); - ParsePosition pos(0); - applyPropertyPattern(pattern, pos, ec); - if (U_FAILURE(ec)) return; - if (pos.getIndex() == 0) { - // syntaxError(chars, "Invalid property pattern"); - ec = U_MALFORMED_SET; - return; - } - chars.jumpahead(pos.getIndex()); - rebuiltPat.append(pattern, 0, pos.getIndex()); -} - U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unistr.cpp b/deps/icu-small/source/common/unistr.cpp index 4e29bad1d3b9..dbd6c9cd7894 100644 --- a/deps/icu-small/source/common/unistr.cpp +++ b/deps/icu-small/source/common/unistr.cpp @@ -237,7 +237,7 @@ UnicodeString::UnicodeString(const char16_t *text, } UnicodeString::UnicodeString(UBool isTerminated, - ConstChar16Ptr textPtr, + ConstChar16Ptr textPtr U_LIFETIME_BOUND, int32_t textLength) { fUnion.fFields.fLengthAndFlags = kReadonlyAlias; const char16_t *text = textPtr; @@ -259,7 +259,7 @@ UnicodeString::UnicodeString(UBool isTerminated, } } -UnicodeString::UnicodeString(char16_t *buff, +UnicodeString::UnicodeString(char16_t* buff U_LIFETIME_BOUND, int32_t buffLength, int32_t buffCapacity) { fUnion.fFields.fLengthAndFlags = kWritableAlias; @@ -298,7 +298,8 @@ UnicodeString::UnicodeString(const char *src, int32_t length, EInvariant) { } } -UnicodeString UnicodeString::readOnlyAliasFromU16StringView(std::u16string_view text) { +UnicodeString +UnicodeString::readOnlyAliasFromU16StringView(std::u16string_view text U_LIFETIME_BOUND) { UnicodeString result; if (text.length() <= INT32_MAX) { result.setTo(false, text.data(), static_cast(text.length())); @@ -308,7 +309,8 @@ UnicodeString UnicodeString::readOnlyAliasFromU16StringView(std::u16string_view return result; } -UnicodeString UnicodeString::readOnlyAliasFromUnicodeString(const UnicodeString &text) { +UnicodeString +UnicodeString::readOnlyAliasFromUnicodeString(const UnicodeString& text U_LIFETIME_BOUND) { UnicodeString result; if (text.isBogus()) { result.setToBogus(); @@ -523,18 +525,18 @@ UnicodeString UnicodeString::fromUTF32(const UChar32 *utf32, int32_t length) { // Assignment //======================================== -UnicodeString & -UnicodeString::operator=(const UnicodeString &src) { +UnicodeString& +UnicodeString::operator=(const UnicodeString& src) U_LIFETIME_BOUND { return copyFrom(src); } -UnicodeString & -UnicodeString::fastCopyFrom(const UnicodeString &src) { +UnicodeString& +UnicodeString::fastCopyFrom(const UnicodeString& src) U_LIFETIME_BOUND { return copyFrom(src, true); } -UnicodeString & -UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) { +UnicodeString& +UnicodeString::copyFrom(const UnicodeString& src, UBool fastCopy) U_LIFETIME_BOUND { // if assigning to ourselves, do nothing if(this == &src) { return *this; @@ -611,7 +613,7 @@ UnicodeString::copyFrom(const UnicodeString &src, UBool fastCopy) { return *this; } -UnicodeString &UnicodeString::operator=(UnicodeString &&src) noexcept { +UnicodeString& UnicodeString::operator=(UnicodeString&& src) noexcept U_LIFETIME_BOUND { // 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(); @@ -995,7 +997,7 @@ UnicodeString::extract(int32_t start, } UnicodeString -UnicodeString::tempSubString(int32_t start, int32_t len) const { +UnicodeString::tempSubString(int32_t start, int32_t len) const U_LIFETIME_BOUND { pinIndices(start, len); const char16_t *array = getBuffer(); // not getArrayStart() to check kIsBogus & kOpenGetBuffer if(array==nullptr) { @@ -1239,15 +1241,15 @@ UnicodeString::doLastIndexOf(UChar32 c, // Write implementation //======================================== -UnicodeString& +UnicodeString& UnicodeString::findAndReplace(int32_t start, - int32_t length, - const UnicodeString& oldText, - int32_t oldStart, - int32_t oldLength, - const UnicodeString& newText, - int32_t newStart, - int32_t newLength) + int32_t length, + const UnicodeString& oldText, + int32_t oldStart, + int32_t oldLength, + const UnicodeString& newText, + int32_t newStart, + int32_t newLength) U_LIFETIME_BOUND { if(isBogus() || oldText.isBogus() || newText.isBogus()) { return *this; @@ -1296,8 +1298,8 @@ UnicodeString::unBogus() { } } -const char16_t * -UnicodeString::getTerminatedBuffer() { +const char16_t* +UnicodeString::getTerminatedBuffer() U_LIFETIME_BOUND { if(!isWritable()) { return nullptr; } @@ -1335,10 +1337,10 @@ UnicodeString::getTerminatedBuffer() { } // setTo() analogous to the readonly-aliasing constructor with the same signature -UnicodeString & +UnicodeString& UnicodeString::setTo(UBool isTerminated, - ConstChar16Ptr textPtr, - int32_t textLength) + ConstChar16Ptr textPtr U_LIFETIME_BOUND, + int32_t textLength) U_LIFETIME_BOUND { if(fUnion.fFields.fLengthAndFlags & kOpenGetBuffer) { // do not modify a string that has an "open" getBuffer(minCapacity) @@ -1373,10 +1375,10 @@ UnicodeString::setTo(UBool isTerminated, } // setTo() analogous to the writable-aliasing constructor with the same signature -UnicodeString & -UnicodeString::setTo(char16_t *buffer, - int32_t buffLength, - int32_t buffCapacity) { +UnicodeString& +UnicodeString::setTo(char16_t* buffer, + int32_t buffLength U_LIFETIME_BOUND, + int32_t buffCapacity) U_LIFETIME_BOUND { if(fUnion.fFields.fLengthAndFlags & kOpenGetBuffer) { // do not modify a string that has an "open" getBuffer(minCapacity) return *this; @@ -1408,7 +1410,7 @@ UnicodeString::setTo(char16_t *buffer, return *this; } -UnicodeString &UnicodeString::setToUTF8(StringPiece utf8) { +UnicodeString& UnicodeString::setToUTF8(StringPiece utf8) U_LIFETIME_BOUND { unBogus(); int32_t length = utf8.length(); int32_t capacity; @@ -1434,8 +1436,7 @@ UnicodeString &UnicodeString::setToUTF8(StringPiece utf8) { } UnicodeString& -UnicodeString::setCharAt(int32_t offset, - char16_t c) +UnicodeString::setCharAt(int32_t offset, char16_t c) U_LIFETIME_BOUND { int32_t len = length(); if(cloneArrayIfNeeded() && len > 0) { @@ -1452,8 +1453,8 @@ UnicodeString::setCharAt(int32_t offset, UnicodeString& UnicodeString::replace(int32_t start, - int32_t _length, - UChar32 srcChar) { + int32_t _length, + UChar32 srcChar) U_LIFETIME_BOUND { char16_t buffer[U16_MAX_LENGTH]; int32_t count = 0; UBool isError = false; @@ -1465,7 +1466,7 @@ UnicodeString::replace(int32_t start, } UnicodeString& -UnicodeString::append(UChar32 srcChar) { +UnicodeString::append(UChar32 srcChar) U_LIFETIME_BOUND { char16_t buffer[U16_MAX_LENGTH]; int32_t _length = 0; UBool isError = false; @@ -1476,11 +1477,11 @@ UnicodeString::append(UChar32 srcChar) { } UnicodeString& -UnicodeString::doReplace( int32_t start, - int32_t length, - const UnicodeString& src, - int32_t srcStart, - int32_t srcLength) +UnicodeString::doReplace(int32_t start, + int32_t length, + const UnicodeString& src, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { // pin the indices to legal values src.pinIndices(srcStart, srcLength); @@ -1492,10 +1493,10 @@ UnicodeString::doReplace( int32_t start, UnicodeString& UnicodeString::doReplace(int32_t start, - int32_t length, - const char16_t *srcChars, - int32_t srcStart, - int32_t srcLength) + int32_t length, + const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { if(!isWritable()) { return *this; @@ -1614,7 +1615,7 @@ UnicodeString::doReplace(int32_t start, } UnicodeString& -UnicodeString::doReplace(int32_t start, int32_t length, std::u16string_view src) { +UnicodeString::doReplace(int32_t start, int32_t length, std::u16string_view src) U_LIFETIME_BOUND { if (!isWritable()) { return *this; } @@ -1629,7 +1630,9 @@ UnicodeString::doReplace(int32_t start, int32_t length, std::u16string_view src) // doReplace() and doAppend() optimize for different cases. UnicodeString& -UnicodeString::doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcLength) { +UnicodeString::doAppend(const UnicodeString& src, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { if(srcLength == 0) { return *this; } @@ -1640,7 +1643,9 @@ UnicodeString::doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcL } UnicodeString& -UnicodeString::doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) { +UnicodeString::doAppend(const char16_t* srcChars, + int32_t srcStart, + int32_t srcLength) U_LIFETIME_BOUND { if(!isWritable() || srcLength == 0 || srcChars == nullptr) { return *this; } @@ -1714,7 +1719,7 @@ UnicodeString::doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcL } UnicodeString& -UnicodeString::doAppend(std::u16string_view src) { +UnicodeString::doAppend(std::u16string_view src) U_LIFETIME_BOUND { if (!isWritable() || src.empty()) { return *this; } @@ -1770,7 +1775,7 @@ UBool UnicodeString::hasMetaData() const { } UnicodeString& -UnicodeString::doReverse(int32_t start, int32_t length) { +UnicodeString::doReverse(int32_t start, int32_t length) U_LIFETIME_BOUND { if(length <= 1 || !cloneArrayIfNeeded()) { return *this; } @@ -1875,8 +1880,8 @@ UnicodeString::doHashCode() const // External Buffer //======================================== -char16_t * -UnicodeString::getBuffer(int32_t minCapacity) { +char16_t* +UnicodeString::getBuffer(int32_t minCapacity) U_LIFETIME_BOUND { if(minCapacity>=-1 && cloneArrayIfNeeded(minCapacity)) { fUnion.fFields.fLengthAndFlags|=kOpenGetBuffer; setZeroLength(); @@ -2053,11 +2058,11 @@ UnicodeStringAppendable::reserveAppendCapacity(int32_t appendCapacity) { return str.cloneArrayIfNeeded(str.length() + appendCapacity); } -char16_t * -UnicodeStringAppendable::getAppendBuffer(int32_t minCapacity, - int32_t desiredCapacityHint, - char16_t *scratch, int32_t scratchCapacity, - int32_t *resultCapacity) { +char16_t* UnicodeStringAppendable::getAppendBuffer(int32_t minCapacity, + int32_t desiredCapacityHint, + char16_t* scratch U_LIFETIME_BOUND, + int32_t scratchCapacity, + int32_t* resultCapacity) U_LIFETIME_BOUND { if(minCapacity < 1 || scratchCapacity < minCapacity) { *resultCapacity = 0; return nullptr; diff --git a/deps/icu-small/source/common/unistr_case.cpp b/deps/icu-small/source/common/unistr_case.cpp index 40ea6b2f4d6e..f66d44e06f23 100644 --- a/deps/icu-small/source/common/unistr_case.cpp +++ b/deps/icu-small/source/common/unistr_case.cpp @@ -90,9 +90,11 @@ UnicodeString::doCaseCompare(int32_t start, // Write implementation //======================================== -UnicodeString & -UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM - UStringCaseMapper *stringCaseMapper) { +UnicodeString& +UnicodeString::caseMap( + int32_t caseLocale, + uint32_t options, + UCASEMAP_BREAK_ITERATOR_PARAM UStringCaseMapper* stringCaseMapper) U_LIFETIME_BOUND { if(isEmpty() || !isWritable()) { // nothing to do return *this; @@ -213,8 +215,8 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER return *this; } -UnicodeString & -UnicodeString::foldCase(uint32_t options) { +UnicodeString& +UnicodeString::foldCase(uint32_t options) U_LIFETIME_BOUND { return caseMap(UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalFold); } diff --git a/deps/icu-small/source/common/unistr_case_locale.cpp b/deps/icu-small/source/common/unistr_case_locale.cpp index 8b6a9ca0ca51..76bd183fa468 100644 --- a/deps/icu-small/source/common/unistr_case_locale.cpp +++ b/deps/icu-small/source/common/unistr_case_locale.cpp @@ -29,26 +29,26 @@ U_NAMESPACE_BEGIN // Write implementation //======================================== -UnicodeString & -UnicodeString::toLower() { +UnicodeString& +UnicodeString::toLower() U_LIFETIME_BOUND { return caseMap(ustrcase_getCaseLocale(nullptr), 0, UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToLower); } -UnicodeString & -UnicodeString::toLower(const Locale &locale) { +UnicodeString& +UnicodeString::toLower(const Locale& locale) U_LIFETIME_BOUND { return caseMap(ustrcase_getCaseLocale(locale.getBaseName()), 0, UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToLower); } -UnicodeString & -UnicodeString::toUpper() { +UnicodeString& +UnicodeString::toUpper() U_LIFETIME_BOUND { return caseMap(ustrcase_getCaseLocale(nullptr), 0, UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToUpper); } -UnicodeString & -UnicodeString::toUpper(const Locale &locale) { +UnicodeString& +UnicodeString::toUpper(const Locale& locale) U_LIFETIME_BOUND { return caseMap(ustrcase_getCaseLocale(locale.getBaseName()), 0, UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToUpper); } diff --git a/deps/icu-small/source/common/unistr_props.cpp b/deps/icu-small/source/common/unistr_props.cpp index e5bbb5386409..0d621fd49d58 100644 --- a/deps/icu-small/source/common/unistr_props.cpp +++ b/deps/icu-small/source/common/unistr_props.cpp @@ -26,7 +26,7 @@ U_NAMESPACE_BEGIN UnicodeString& -UnicodeString::trim() +UnicodeString::trim() U_LIFETIME_BOUND { if(isBogus()) { return *this; diff --git a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp index 4969884b0dc9..3ba61565b090 100644 --- a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp @@ -29,18 +29,20 @@ U_NAMESPACE_BEGIN -UnicodeString & -UnicodeString::toTitle(BreakIterator *iter) { +UnicodeString& +UnicodeString::toTitle(BreakIterator* iter) U_LIFETIME_BOUND { return toTitle(iter, Locale::getDefault(), 0); } -UnicodeString & -UnicodeString::toTitle(BreakIterator *iter, const Locale &locale) { +UnicodeString& +UnicodeString::toTitle(BreakIterator* iter, const Locale& locale) U_LIFETIME_BOUND { return toTitle(iter, locale, 0); } -UnicodeString & -UnicodeString::toTitle(BreakIterator *iter, const Locale &locale, uint32_t options) { +UnicodeString& +UnicodeString::toTitle(BreakIterator* iter, + const Locale& locale, + uint32_t options) U_LIFETIME_BOUND { LocalPointer ownedIter; UErrorCode errorCode = U_ZERO_ERROR; iter = ustrcase_getTitleBreakIterator(&locale, "", options, iter, ownedIter, errorCode); diff --git a/deps/icu-small/source/common/uprops.cpp b/deps/icu-small/source/common/uprops.cpp index 817a1fac0c01..15ce47bd39e5 100644 --- a/deps/icu-small/source/common/uprops.cpp +++ b/deps/icu-small/source/common/uprops.cpp @@ -359,7 +359,7 @@ static constexpr UChar32 ID_COMPAT_MATH_START[] = { 0x1D7C3 }; -/** Ranges (start/limit pairs) of Modifier_Combining_mark (only), from UCD PropList.txt. */ +/** Ranges (start/limit pairs) of Modifier_Combining_Mark (only), from UCD PropList.txt. */ static constexpr UChar32 MODIFIER_COMBINING_MARK[] = { 0x0654, 0x0655 + 1, 0x0658, 0x0658 + 1, // U+0658 @@ -369,7 +369,10 @@ static constexpr UChar32 MODIFIER_COMBINING_MARK[] = { 0x08CA, 0x08CB + 1, 0x08CD, 0x08CF + 1, 0x08D3, 0x08D3 + 1, // U+08D3 - 0x08F3, 0x08F3 + 1 // U+08F3 + 0x08F3, 0x08F3 + 1, // U+08F3 + 0x10EF4, 0x10EF4 + 1, + 0x10EF6, 0x10EF6 + 1, + 0x10EF9, 0x10EF9 + 1, }; static UBool isIDCompatMathStart(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) { diff --git a/deps/icu-small/source/common/uresbund.cpp b/deps/icu-small/source/common/uresbund.cpp index afda2770fd3f..dfac21604675 100644 --- a/deps/icu-small/source/common/uresbund.cpp +++ b/deps/icu-small/source/common/uresbund.cpp @@ -113,7 +113,7 @@ static UBool hasVariant(const char* localeID) { static const char* performFallbackLookup(const char* key, const char* keyStrs, - const char* valueStrs, + const char* valueStrs U_LIFETIME_BOUND, const int32_t* lookupTable, int32_t lookupTableLength) { const int32_t* bottom = lookupTable; @@ -1150,20 +1150,29 @@ ures_close(UResourceBundle* resB) namespace { -UResourceBundle *init_resb_result( - UResourceDataEntry *dataEntry, Resource r, const char *key, int32_t idx, - UResourceDataEntry *validLocaleDataEntry, const char *containerResPath, - int32_t recursionDepth, - UResourceBundle *resB, UErrorCode *status); +UResourceBundle* init_resb_result(UResourceDataEntry* dataEntry, + Resource r, + const char* key, + int32_t idx, + UResourceDataEntry* validLocaleDataEntry, + const char* containerResPath, + int32_t recursionDepth, + UResourceBundle* resB U_LIFETIME_BOUND, + UErrorCode* status); // TODO: Try to refactor further, so that we output a dataEntry + Resource + (optionally) resPath, // rather than a UResourceBundle. // May need to entryIncrease() the resulting dataEntry. -UResourceBundle *getAliasTargetAsResourceBundle( - const ResourceData &resData, Resource r, const char *key, int32_t idx, - UResourceDataEntry *validLocaleDataEntry, const char *containerResPath, - int32_t recursionDepth, - UResourceBundle *resB, UErrorCode *status) { +UResourceBundle* +getAliasTargetAsResourceBundle(const ResourceData& resData, + Resource r, + const char* key, + int32_t idx, + UResourceDataEntry* validLocaleDataEntry, + const char* containerResPath, + int32_t recursionDepth, + UResourceBundle* resB U_LIFETIME_BOUND, + UErrorCode* status) { // TODO: When an error occurs: Should we return nullptr vs. resB? if (U_FAILURE(*status)) { return resB; } U_ASSERT(RES_GET_TYPE(r) == URES_ALIAS); @@ -1382,11 +1391,15 @@ UResourceBundle *getAliasTargetAsResourceBundle( // Recursive function, should be called only by itself, by its simpler wrapper, // or by getAliasTargetAsResourceBundle(). -UResourceBundle *init_resb_result( - UResourceDataEntry *dataEntry, Resource r, const char *key, int32_t idx, - UResourceDataEntry *validLocaleDataEntry, const char *containerResPath, - int32_t recursionDepth, - UResourceBundle *resB, UErrorCode *status) { +UResourceBundle* init_resb_result(UResourceDataEntry* dataEntry, + Resource r, + const char* key, + int32_t idx, + UResourceDataEntry* validLocaleDataEntry, + const char* containerResPath, + int32_t recursionDepth, + UResourceBundle* resB U_LIFETIME_BOUND, + UErrorCode* status) { // TODO: When an error occurs: Should we return nullptr vs. resB? if(status == nullptr || U_FAILURE(*status)) { return resB; @@ -1449,14 +1462,14 @@ UResourceBundle *init_resb_result( } if(key != nullptr) { ures_appendResPath(resB, key, static_cast(uprv_strlen(key)), status); - if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) { + if(resB->fResPathLen > 0 && resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) { ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status); } } else if(idx >= 0) { char buf[256]; int32_t len = T_CString_integerToString(buf, idx, 10); ures_appendResPath(resB, buf, len, status); - if(resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) { + if(resB->fResPathLen > 0 && resB->fResPath[resB->fResPathLen-1] != RES_PATH_SEPARATOR) { ures_appendResPath(resB, RES_PATH_SEPARATOR_S, 1, status); } } @@ -1473,11 +1486,14 @@ UResourceBundle *init_resb_result( return resB; } -UResourceBundle *init_resb_result( - UResourceDataEntry *dataEntry, Resource r, const char *key, int32_t idx, - // validLocaleDataEntry + containerResPath - const UResourceBundle *container, - UResourceBundle *resB, UErrorCode *status) { +UResourceBundle* init_resb_result(UResourceDataEntry* dataEntry, + Resource r, + const char* key, + int32_t idx, + // validLocaleDataEntry + containerResPath + const UResourceBundle* container, + UResourceBundle* resB U_LIFETIME_BOUND, + UErrorCode* status) { return init_resb_result( dataEntry, r, key, idx, container->fValidLocaleDataEntry, container->fResPath, 0, resB, status); @@ -1485,7 +1501,9 @@ UResourceBundle *init_resb_result( } // namespace -UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *original, UErrorCode *status) { +UResourceBundle* ures_copyResb(UResourceBundle* r U_LIFETIME_BOUND, + const UResourceBundle* original, + UErrorCode* status) { UBool isStackObject; if(U_FAILURE(*status) || r == original) { return r; @@ -1521,7 +1539,9 @@ UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *origin * Functions to retrieve data from resource bundles. */ -U_CAPI const char16_t* U_EXPORT2 ures_getString(const UResourceBundle* resB, int32_t* len, UErrorCode* status) { +U_CAPI const char16_t* U_EXPORT2 ures_getString(const UResourceBundle* resB U_LIFETIME_BOUND, + int32_t* len, + UErrorCode* status) { const char16_t *s; if (status==nullptr || U_FAILURE(*status)) { return nullptr; @@ -1537,11 +1557,13 @@ U_CAPI const char16_t* U_EXPORT2 ures_getString(const UResourceBundle* resB, int return s; } -static const char * -ures_toUTF8String(const char16_t *s16, int32_t length16, - char *dest, int32_t *pLength, +static const char* +ures_toUTF8String(const char16_t* s16, + int32_t length16, + char* dest U_LIFETIME_BOUND, + int32_t* pLength, UBool forceCopy, - UErrorCode *status) { + UErrorCode* status) { int32_t capacity; if (U_FAILURE(*status)) { @@ -1599,18 +1621,19 @@ ures_toUTF8String(const char16_t *s16, int32_t length16, } } -U_CAPI const char * U_EXPORT2 -ures_getUTF8String(const UResourceBundle *resB, - char *dest, int32_t *pLength, +U_CAPI const char* U_EXPORT2 +ures_getUTF8String(const UResourceBundle* resB, + char* dest U_LIFETIME_BOUND, + int32_t* pLength, UBool forceCopy, - UErrorCode *status) { + UErrorCode* status) { int32_t length16; const char16_t *s16 = ures_getString(resB, &length16, status); return ures_toUTF8String(s16, length16, dest, pLength, forceCopy, status); } -U_CAPI const uint8_t* U_EXPORT2 ures_getBinary(const UResourceBundle* resB, int32_t* len, - UErrorCode* status) { +U_CAPI const uint8_t* U_EXPORT2 +ures_getBinary(const UResourceBundle* resB U_LIFETIME_BOUND, int32_t* len, UErrorCode* status) { const uint8_t *p; if (status==nullptr || U_FAILURE(*status)) { return nullptr; @@ -1626,8 +1649,8 @@ U_CAPI const uint8_t* U_EXPORT2 ures_getBinary(const UResourceBundle* resB, int3 return p; } -U_CAPI const int32_t* U_EXPORT2 ures_getIntVector(const UResourceBundle* resB, int32_t* len, - UErrorCode* status) { +U_CAPI const int32_t* U_EXPORT2 +ures_getIntVector(const UResourceBundle* resB U_LIFETIME_BOUND, int32_t* len, UErrorCode* status) { const int32_t *p; if (status==nullptr || U_FAILURE(*status)) { return nullptr; @@ -1682,7 +1705,8 @@ U_CAPI UResType U_EXPORT2 ures_getType(const UResourceBundle *resB) { return res_getPublicType(resB->fRes); } -U_CAPI const char * U_EXPORT2 ures_getKey(const UResourceBundle *resB) { +U_CAPI const char* U_EXPORT2 +ures_getKey(const UResourceBundle* resB U_LIFETIME_BOUND) { // // TODO: Trace ures_getKey? I guess not usually. // @@ -1706,7 +1730,12 @@ U_CAPI int32_t U_EXPORT2 ures_getSize(const UResourceBundle *resB) { return resB->fSize; } -static const char16_t* ures_getStringWithAlias(const UResourceBundle *resB, Resource r, int32_t sIndex, int32_t *len, UErrorCode *status) { +static const char16_t* +ures_getStringWithAlias(const UResourceBundle* resB U_LIFETIME_BOUND, + Resource r, + int32_t sIndex, + int32_t* len, + UErrorCode* status) { if(RES_GET_TYPE(r) == URES_ALIAS) { const char16_t* result = nullptr; UResourceBundle *tempRes = ures_getByIndex(resB, sIndex, nullptr, status); @@ -1732,7 +1761,11 @@ U_CAPI UBool U_EXPORT2 ures_hasNext(const UResourceBundle *resB) { return resB->fIndex < resB->fSize-1; } -U_CAPI const char16_t* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32_t* len, const char ** key, UErrorCode *status) { +U_CAPI const char16_t* U_EXPORT2 +ures_getNextString(UResourceBundle* resB U_LIFETIME_BOUND, + int32_t* len, + const char** key, + UErrorCode* status) { Resource r = RES_BOGUS; if (status==nullptr || U_FAILURE(*status)) { @@ -1781,7 +1814,10 @@ U_CAPI const char16_t* U_EXPORT2 ures_getNextString(UResourceBundle *resB, int32 return nullptr; } -U_CAPI UResourceBundle* U_EXPORT2 ures_getNextResource(UResourceBundle *resB, UResourceBundle *fillIn, UErrorCode *status) { +U_CAPI UResourceBundle* U_EXPORT2 +ures_getNextResource(UResourceBundle* resB, + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status) { const char *key = nullptr; Resource r = RES_BOGUS; @@ -1831,7 +1867,11 @@ U_CAPI UResourceBundle* U_EXPORT2 ures_getNextResource(UResourceBundle *resB, UR return fillIn; } -U_CAPI UResourceBundle* U_EXPORT2 ures_getByIndex(const UResourceBundle *resB, int32_t indexR, UResourceBundle *fillIn, UErrorCode *status) { +U_CAPI UResourceBundle* U_EXPORT2 +ures_getByIndex(const UResourceBundle* resB, + int32_t indexR, + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status) { const char* key = nullptr; Resource r = RES_BOGUS; @@ -1879,7 +1919,11 @@ U_CAPI UResourceBundle* U_EXPORT2 ures_getByIndex(const UResourceBundle *resB, i return fillIn; } -U_CAPI const char16_t* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *resB, int32_t indexS, int32_t* len, UErrorCode *status) { +U_CAPI const char16_t* U_EXPORT2 +ures_getStringByIndex(const UResourceBundle* resB U_LIFETIME_BOUND, + int32_t indexS, + int32_t* len, + UErrorCode* status) { const char* key = nullptr; Resource r = RES_BOGUS; @@ -1929,12 +1973,13 @@ U_CAPI const char16_t* U_EXPORT2 ures_getStringByIndex(const UResourceBundle *re return nullptr; } -U_CAPI const char * U_EXPORT2 -ures_getUTF8StringByIndex(const UResourceBundle *resB, +U_CAPI const char* U_EXPORT2 +ures_getUTF8StringByIndex(const UResourceBundle* resB, int32_t idx, - char *dest, int32_t *pLength, + char* dest U_LIFETIME_BOUND, + int32_t* pLength, UBool forceCopy, - UErrorCode *status) { + UErrorCode* status) { int32_t length16; const char16_t *s16 = ures_getStringByIndex(resB, idx, &length16, status); return ures_toUTF8String(s16, length16, dest, pLength, forceCopy, status); @@ -1945,7 +1990,7 @@ ures_getUTF8StringByIndex(const UResourceBundle *resB, }*/ U_CAPI UResourceBundle* U_EXPORT2 -ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status) +ures_findResource(const char* path, UResourceBundle* fillIn U_LIFETIME_BOUND, UErrorCode* status) { UResourceBundle *first = nullptr; UResourceBundle *result = fillIn; @@ -2000,7 +2045,10 @@ ures_findResource(const char* path, UResourceBundle *fillIn, UErrorCode *status) } U_CAPI UResourceBundle* U_EXPORT2 -ures_findSubResource(const UResourceBundle *resB, char* path, UResourceBundle *fillIn, UErrorCode *status) +ures_findSubResource(const UResourceBundle* resB, + char* path, + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status) { Resource res = RES_BOGUS; UResourceBundle *result = fillIn; @@ -2026,12 +2074,12 @@ ures_findSubResource(const UResourceBundle *resB, char* path, UResourceBundle *f return result; } + U_CAPI const char16_t* U_EXPORT2 -ures_getStringByKeyWithFallback(const UResourceBundle *resB, - const char* inKey, +ures_getStringByKeyWithFallback(const UResourceBundle* resB U_LIFETIME_BOUND, + const char* inKey, int32_t* len, - UErrorCode *status) { - + UErrorCode* status) { UResourceBundle stack; const char16_t* retVal = nullptr; ures_initStackObject(&stack); @@ -2158,10 +2206,10 @@ static void createPath(const char* origResPath, } U_CAPI UResourceBundle* U_EXPORT2 -ures_getByKeyWithFallback(const UResourceBundle *resB, +ures_getByKeyWithFallback(const UResourceBundle* resB, const char* inKey, - UResourceBundle *fillIn, - UErrorCode *status) { + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status) { Resource res = RES_BOGUS, rootRes = RES_BOGUS; UResourceBundle *helper = nullptr; @@ -2490,7 +2538,11 @@ ures_getAllItemsWithFallback(const UResourceBundle *bundle, const char *path, getAllItemsWithFallback(rb, value, sink, errorCode); } -U_CAPI UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resB, const char* inKey, UResourceBundle *fillIn, UErrorCode *status) { +U_CAPI UResourceBundle* U_EXPORT2 +ures_getByKey(const UResourceBundle* resB, + const char* inKey, + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status) { Resource res = RES_BOGUS; UResourceDataEntry *dataEntry = nullptr; const char *key = inKey; @@ -2543,7 +2595,11 @@ U_CAPI UResourceBundle* U_EXPORT2 ures_getByKey(const UResourceBundle *resB, con return fillIn; } -U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB, const char* inKey, int32_t* len, UErrorCode *status) { +U_CAPI const char16_t* U_EXPORT2 +ures_getStringByKey(const UResourceBundle* resB U_LIFETIME_BOUND, + const char* inKey, + int32_t* len, + UErrorCode* status) { Resource res = RES_BOGUS; UResourceDataEntry *dataEntry = nullptr; const char* key = inKey; @@ -2626,12 +2682,13 @@ U_CAPI const char16_t* U_EXPORT2 ures_getStringByKey(const UResourceBundle *resB return nullptr; } -U_CAPI const char * U_EXPORT2 -ures_getUTF8StringByKey(const UResourceBundle *resB, - const char *key, - char *dest, int32_t *pLength, +U_CAPI const char* U_EXPORT2 +ures_getUTF8StringByKey(const UResourceBundle* resB, + const char* key, + char* dest U_LIFETIME_BOUND, + int32_t* pLength, UBool forceCopy, - UErrorCode *status) { + UErrorCode* status) { int32_t length16; const char16_t *s16 = ures_getStringByKey(resB, key, &length16, status); return ures_toUTF8String(s16, length16, dest, pLength, forceCopy, status); @@ -2643,8 +2700,8 @@ ures_getUTF8StringByKey(const UResourceBundle *resB, * INTERNAL: Get the name of the first real locale (not placeholder) * that has resource bundle data. */ -U_CAPI const char* U_EXPORT2 -ures_getLocaleInternal(const UResourceBundle* resourceBundle, UErrorCode* status) +U_CAPI const char* U_EXPORT2 +ures_getLocaleInternal(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, UErrorCode* status) { if (status==nullptr || U_FAILURE(*status)) { return nullptr; @@ -2657,17 +2714,15 @@ ures_getLocaleInternal(const UResourceBundle* resourceBundle, UErrorCode* status } } -U_CAPI const char* U_EXPORT2 -ures_getLocale(const UResourceBundle* resourceBundle, - UErrorCode* status) +U_CAPI const char* U_EXPORT2 +ures_getLocale(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, UErrorCode* status) { return ures_getLocaleInternal(resourceBundle, status); } - -U_CAPI const char* U_EXPORT2 -ures_getLocaleByType(const UResourceBundle* resourceBundle, - ULocDataLocaleType type, +U_CAPI const char* U_EXPORT2 +ures_getLocaleByType(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, + ULocDataLocaleType type, UErrorCode* status) { if (status==nullptr || U_FAILURE(*status)) { return nullptr; @@ -2689,7 +2744,8 @@ ures_getLocaleByType(const UResourceBundle* resourceBundle, } } -U_CFUNC const char* ures_getName(const UResourceBundle* resB) { +U_CFUNC const char* +ures_getName(const UResourceBundle* resB U_LIFETIME_BOUND) { if(resB == nullptr) { return nullptr; } @@ -2698,7 +2754,8 @@ U_CFUNC const char* ures_getName(const UResourceBundle* resB) { } #ifdef URES_DEBUG -U_CFUNC const char* ures_getPath(const UResourceBundle* resB) { +U_CFUNC const char* +ures_getPath(const UResourceBundle* resB U_LIFETIME_BOUND) { if(resB == nullptr) { return nullptr; } @@ -2708,8 +2765,11 @@ U_CFUNC const char* ures_getPath(const UResourceBundle* resB) { #endif static UResourceBundle* -ures_openWithType(UResourceBundle *r, const char* path, const char* localeID, - UResOpenType openType, UErrorCode* status) { +ures_openWithType(UResourceBundle* r U_LIFETIME_BOUND, + const char* path, + const char* localeID, + UResOpenType openType, + UErrorCode* status) { if(U_FAILURE(*status)) { return nullptr; } @@ -2854,8 +2914,8 @@ ures_countArrayItems(const UResourceBundle* resourceBundle, * @see ures_getVersion * @internal */ -U_CAPI const char* U_EXPORT2 -ures_getVersionNumberInternal(const UResourceBundle *resourceBundle) +U_CAPI const char* U_EXPORT2 +ures_getVersionNumberInternal(const UResourceBundle* resourceBundle U_LIFETIME_BOUND) { if (!resourceBundle) return nullptr; @@ -2898,8 +2958,8 @@ ures_getVersionNumberInternal(const UResourceBundle *resourceBundle) return resourceBundle->fVersion; } -U_CAPI const char* U_EXPORT2 -ures_getVersionNumber(const UResourceBundle* resourceBundle) +U_CAPI const char* U_EXPORT2 +ures_getVersionNumber(const UResourceBundle* resourceBundle U_LIFETIME_BOUND) { return ures_getVersionNumberInternal(resourceBundle); } diff --git a/deps/icu-small/source/common/uresimp.h b/deps/icu-small/source/common/uresimp.h index 2685b2d2dc92..865574b9bd0b 100644 --- a/deps/icu-small/source/common/uresimp.h +++ b/deps/icu-small/source/common/uresimp.h @@ -125,10 +125,10 @@ class U_COMMON_API StackUResourceBundle { StackUResourceBundle(); ~StackUResourceBundle(); - UResourceBundle* getAlias() { return &bundle; } + UResourceBundle* getAlias() U_LIFETIME_BOUND { return &bundle; } - UResourceBundle& ref() { return bundle; } - const UResourceBundle& ref() const { return bundle; } + UResourceBundle& ref() U_LIFETIME_BOUND { return bundle; } + const UResourceBundle& ref() const U_LIFETIME_BOUND { return bundle; } StackUResourceBundle(const StackUResourceBundle&) = delete; StackUResourceBundle& operator=(const StackUResourceBundle&) = delete; @@ -156,9 +156,9 @@ U_CAPI UResourceBundle* U_EXPORT2 ures_openNoDefault(const char* path, const char* localeID, UErrorCode* status); /* Some getters used by the copy constructor */ -U_CFUNC const char* ures_getName(const UResourceBundle* resB); +U_CFUNC const char* ures_getName(const UResourceBundle* resB U_LIFETIME_BOUND); #ifdef URES_DEBUG -U_CFUNC const char* ures_getPath(const UResourceBundle* resB); +U_CFUNC const char* ures_getPath(const UResourceBundle* resB U_LIFETIME_BOUND); /** * If anything was in the RB cache, dump it to the screen. * @return true if there was anything into the cache @@ -167,7 +167,10 @@ U_CAPI UBool U_EXPORT2 ures_dumpCacheContents(void); #endif /* Candidates for export */ -U_CFUNC UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle *original, UErrorCode *status); +U_CFUNC UResourceBundle* +ures_copyResb(UResourceBundle* r U_LIFETIME_BOUND, + const UResourceBundle* original, + UErrorCode* status); /** * Returns a resource that can be located using the pathToResource argument. One needs optional package, locale @@ -185,8 +188,9 @@ U_CFUNC UResourceBundle *ures_copyResb(UResourceBundle *r, const UResourceBundle * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it */ U_CAPI UResourceBundle* U_EXPORT2 -ures_findResource(const char* pathToResource, - UResourceBundle *fillIn, UErrorCode *status); +ures_findResource(const char* pathToResource, + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status); /** * Returns a sub resource that can be located using the pathToResource argument. One needs a path inside @@ -204,9 +208,10 @@ ures_findResource(const char* pathToResource, * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it */ U_CAPI UResourceBundle* U_EXPORT2 -ures_findSubResource(const UResourceBundle *resB, - char* pathToResource, - UResourceBundle *fillIn, UErrorCode *status); +ures_findSubResource(const UResourceBundle* resB, + char* pathToResource, + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status); /** * Returns a functionally equivalent locale (considering keywords) for the specified keyword. @@ -256,11 +261,11 @@ ures_getKeywordValues(const char *path, const char *keyword, UErrorCode *status) * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING * @return a pointer to a UResourceBundle struct. If fill in param was NULL, caller must delete it */ -U_CAPI UResourceBundle* U_EXPORT2 -ures_getByKeyWithFallback(const UResourceBundle *resB, - const char* inKey, - UResourceBundle *fillIn, - UErrorCode *status); +U_CAPI UResourceBundle* U_EXPORT2 +ures_getByKeyWithFallback(const UResourceBundle* resB, + const char* inKey, + UResourceBundle* fillIn U_LIFETIME_BOUND, + UErrorCode* status); /** * Get a String with multi-level fallback. Normally only the top level resources will @@ -278,11 +283,11 @@ ures_getByKeyWithFallback(const UResourceBundle *resB, * @return returns a pointer to a zero-terminated UChar array which lives in a * memory mapped/DLL file. */ -U_CAPI const UChar* U_EXPORT2 -ures_getStringByKeyWithFallback(const UResourceBundle *resB, - const char* inKey, - int32_t* len, - UErrorCode *status); +U_CAPI const UChar* U_EXPORT2 +ures_getStringByKeyWithFallback(const UResourceBundle* resB U_LIFETIME_BOUND, + const char* inKey, + int32_t* len, + UErrorCode* status); #ifdef __cplusplus @@ -349,8 +354,8 @@ ures_getVersionByKey(const UResourceBundle *resB, * The caller does not own this string. * @see ures_getVersion */ -U_CAPI const char* U_EXPORT2 -ures_getVersionNumberInternal(const UResourceBundle *resourceBundle); +U_CAPI const char* U_EXPORT2 +ures_getVersionNumberInternal(const UResourceBundle* resourceBundle U_LIFETIME_BOUND); /** * Return the name of the Locale associated with this ResourceBundle. This API allows @@ -365,9 +370,8 @@ ures_getVersionNumberInternal(const UResourceBundle *resourceBundle); * @param status just for catching illegal arguments * @return A Locale name */ -U_CAPI const char* U_EXPORT2 -ures_getLocaleInternal(const UResourceBundle* resourceBundle, - UErrorCode* status); +U_CAPI const char* U_EXPORT2 +ures_getLocaleInternal(const UResourceBundle* resourceBundle U_LIFETIME_BOUND, UErrorCode* status); /** * Same as ures_openDirect() but uses the fill-in parameter instead of allocating a new bundle. diff --git a/deps/icu-small/source/common/uscript_props.cpp b/deps/icu-small/source/common/uscript_props.cpp index 232ce89755cd..e4393bce0848 100644 --- a/deps/icu-small/source/common/uscript_props.cpp +++ b/deps/icu-small/source/common/uscript_props.cpp @@ -192,7 +192,7 @@ const int32_t SCRIPT_PROPS[] = { 0x112BE | EXCLUSION, // Sind 0x118B4 | EXCLUSION | CASED, // Wara 0, - 0, + 0x18F1A | EXCLUSION | LB_LETTERS, // Jurc 0x16A4F | EXCLUSION, // Mroo 0x1B1C4 | EXCLUSION | LB_LETTERS, // Nshu 0x11183 | EXCLUSION, // Shrd @@ -256,6 +256,9 @@ const int32_t SCRIPT_PROPS[] = { 0x10950 | EXCLUSION | RTL, // Sidt 0x1E6D5 | EXCLUSION | LB_LETTERS, // Tayo 0x11DC6 | EXCLUSION, // Tols + 0, + 0x125AD | EXCLUSION, // Pcun + 0x3EA10 | EXCLUSION | LB_LETTERS, // Seal // 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 29b8655ac965..06ebead1e5f4 100644 --- a/deps/icu-small/source/common/uset.cpp +++ b/deps/icu-small/source/common/uset.cpp @@ -292,7 +292,7 @@ class USetAccess /* not : public UObject because all methods are static */ { inline static int32_t getStringCount(const UnicodeSet& set) { return set.stringsSize(); } - inline static const UnicodeString* getString(const UnicodeSet& set, + inline static const UnicodeString* getString(const UnicodeSet& set U_LIFETIME_BOUND, int32_t i) { return set.getString(i); } @@ -320,7 +320,7 @@ uset_getItemCount(const USet* uset) { } U_CAPI const UChar* U_EXPORT2 -uset_getString(const USet *uset, int32_t index, int32_t *pLength) { +uset_getString(const USet* uset U_LIFETIME_BOUND, int32_t index, int32_t* pLength) { if (pLength == nullptr) { return nullptr; } const UnicodeSet &set = *(const UnicodeSet *)uset; int32_t count = USetAccess::getStringCount(set); diff --git a/deps/icu-small/source/common/usetiter.cpp b/deps/icu-small/source/common/usetiter.cpp index a79d1a26f100..781d3a7d889c 100644 --- a/deps/icu-small/source/common/usetiter.cpp +++ b/deps/icu-small/source/common/usetiter.cpp @@ -19,7 +19,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(UnicodeSetIterator) * Create an iterator * @param set set to iterate over */ -UnicodeSetIterator::UnicodeSetIterator(const UnicodeSet& uSet) { +UnicodeSetIterator::UnicodeSetIterator(const UnicodeSet& uSet U_LIFETIME_BOUND) { cpString = nullptr; reset(uSet); } @@ -134,7 +134,7 @@ void UnicodeSetIterator::loadRange(int32_t iRange) { } -const UnicodeString& UnicodeSetIterator::getString() { +const UnicodeString& UnicodeSetIterator::getString() U_LIFETIME_BOUND { if (string == nullptr && codepoint != static_cast(IS_STRING)) { if (cpString == nullptr) { cpString = new UnicodeString(); diff --git a/deps/icu-small/source/common/ushape.cpp b/deps/icu-small/source/common/ushape.cpp index b7946dc3ce03..a50b814846e0 100644 --- a/deps/icu-small/source/common/ushape.cpp +++ b/deps/icu-small/source/common/ushape.cpp @@ -982,7 +982,7 @@ expandCompositCharAtEnd(char16_t *dest, int32_t sourceLength, int32_t destSize,U uprv_memset(tempbuffer, 0, (sourceLength+1)*U_SIZEOF_UCHAR); - while(dest[inpsize-1] == SPACE_CHAR) { + while(inpsize>0 && dest[inpsize-1] == SPACE_CHAR) { countr++; inpsize--; } @@ -1525,6 +1525,11 @@ u_shapeArabic(const char16_t *source, int32_t sourceLength, prevLink = currLink; currLink = getLink(source[i]); if (aggregate_tashkeel && ((prevLink|currLink)&COMBINE) == COMBINE && aggregation_possible) { + if (j<0 || j>=2*sourceLength) { + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + if (tempsource != nullptr) uprv_free(tempsource); + return 0; + } aggregation_possible = 0; tempsource[j] = (prev &ownedIter, UErrorCode &errorCode) { +BreakIterator* ustrcase_getTitleBreakIterator(const Locale* locale, + const char* locID, + uint32_t options, + BreakIterator* iter U_LIFETIME_BOUND, + LocalPointer& ownedIter, + UErrorCode& errorCode) { if (U_FAILURE(errorCode)) { return nullptr; } options &= U_TITLECASE_ITERATOR_MASK; if (options != 0 && iter != nullptr) { @@ -216,19 +221,20 @@ ucasemap_toTitle(UCaseMap *csm, if (U_FAILURE(*pErrorCode)) { return 0; } - if (csm->iter == nullptr) { + auto *impl = reinterpret_cast(csm); + if (impl->iter == nullptr) { LocalPointer ownedIter; BreakIterator *iter = ustrcase_getTitleBreakIterator( - nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode); + nullptr, impl->locale, impl->options, nullptr, ownedIter, *pErrorCode); if (iter == nullptr) { return 0; } - csm->iter = ownedIter.orphan(); + impl->iter = ownedIter.orphan(); } UnicodeString s(srcLength<0, src, srcLength); - csm->iter->setText(s); + impl->iter->setText(s); return ustrcase_map( - csm->caseLocale, csm->options, csm->iter, + impl->caseLocale, impl->options, impl->iter, dest, destCapacity, src, srcLength, ustrcase_internalToTitle, nullptr, *pErrorCode); diff --git a/deps/icu-small/source/common/ustr_wcs.cpp b/deps/icu-small/source/common/ustr_wcs.cpp index 395713f5cd93..87e31dc3f84d 100644 --- a/deps/icu-small/source/common/ustr_wcs.cpp +++ b/deps/icu-small/source/common/ustr_wcs.cpp @@ -227,12 +227,12 @@ _strToWCS(wchar_t *dest, #endif U_CAPI wchar_t* U_EXPORT2 -u_strToWCS(wchar_t *dest, +u_strToWCS(wchar_t* dest U_LIFETIME_BOUND, int32_t destCapacity, - int32_t *pDestLength, - const char16_t *src, + int32_t* pDestLength, + const char16_t* src, int32_t srcLength, - UErrorCode *pErrorCode){ + UErrorCode* pErrorCode) { /* args check */ if(pErrorCode==nullptr || U_FAILURE(*pErrorCode)){ @@ -483,12 +483,12 @@ _strFromWCS( char16_t *dest, #endif U_CAPI char16_t* U_EXPORT2 -u_strFromWCS(char16_t *dest, - int32_t destCapacity, - int32_t *pDestLength, - const wchar_t *src, +u_strFromWCS(char16_t* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const wchar_t* src, int32_t srcLength, - UErrorCode *pErrorCode) + UErrorCode* pErrorCode) { /* args check */ diff --git a/deps/icu-small/source/common/ustrenum.cpp b/deps/icu-small/source/common/ustrenum.cpp index c42014d617d7..86088010d67d 100644 --- a/deps/icu-small/source/common/ustrenum.cpp +++ b/deps/icu-small/source/common/ustrenum.cpp @@ -40,8 +40,8 @@ StringEnumeration::clone() const { return nullptr; } -const char * -StringEnumeration::next(int32_t *resultLength, UErrorCode &status) { +const char* +StringEnumeration::next(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND { const UnicodeString *s=snext(status); if(U_SUCCESS(status) && s!=nullptr) { unistr=*s; @@ -58,8 +58,8 @@ StringEnumeration::next(int32_t *resultLength, UErrorCode &status) { return nullptr; } -const char16_t * -StringEnumeration::unext(int32_t *resultLength, UErrorCode &status) { +const char16_t* +StringEnumeration::unext(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND { const UnicodeString *s=snext(status); if(U_SUCCESS(status) && s!=nullptr) { unistr=*s; @@ -72,8 +72,8 @@ StringEnumeration::unext(int32_t *resultLength, UErrorCode &status) { return nullptr; } -const UnicodeString * -StringEnumeration::snext(UErrorCode &status) { +const UnicodeString* +StringEnumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { int32_t length; const char *s=next(&length, status); return setChars(s, length, status); @@ -100,8 +100,8 @@ StringEnumeration::ensureCharsCapacity(int32_t capacity, UErrorCode &status) { } } -UnicodeString * -StringEnumeration::setChars(const char *s, int32_t length, UErrorCode &status) { +UnicodeString* +StringEnumeration::setChars(const char* s, int32_t length, UErrorCode& status) U_LIFETIME_BOUND { if(U_SUCCESS(status) && s!=nullptr) { if(length<0) { length = static_cast(uprv_strlen(s)); @@ -161,11 +161,11 @@ int32_t UStringEnumeration::count(UErrorCode& status) const { return uenum_count(uenum, &status); } -const char *UStringEnumeration::next(int32_t *resultLength, UErrorCode &status) { +const char* UStringEnumeration::next(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND { return uenum_next(uenum, resultLength, &status); } -const UnicodeString* UStringEnumeration::snext(UErrorCode& status) { +const UnicodeString* UStringEnumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { int32_t length; const char16_t* str = uenum_unext(uenum, &length, &status); if (str == nullptr || U_FAILURE(status)) { @@ -210,7 +210,7 @@ ustrenum_count(UEnumeration* en, * Wrapper API to make StringEnumeration look like UEnumeration. */ static const char16_t* U_CALLCONV -ustrenum_unext(UEnumeration* en, +ustrenum_unext(UEnumeration* en U_LIFETIME_BOUND, int32_t* resultLength, UErrorCode* ec) { @@ -221,7 +221,7 @@ ustrenum_unext(UEnumeration* en, * Wrapper API to make StringEnumeration look like UEnumeration. */ static const char* U_CALLCONV -ustrenum_next(UEnumeration* en, +ustrenum_next(UEnumeration* en U_LIFETIME_BOUND, int32_t* resultLength, UErrorCode* ec) { @@ -298,7 +298,7 @@ ucharstrenum_count(UEnumeration* en, } static const char16_t* U_CALLCONV -ucharstrenum_unext(UEnumeration* en, +ucharstrenum_unext(UEnumeration* en U_LIFETIME_BOUND, int32_t* resultLength, UErrorCode* /*ec*/) { UCharStringEnumeration *e = (UCharStringEnumeration*) en; @@ -314,7 +314,7 @@ ucharstrenum_unext(UEnumeration* en, static const char* U_CALLCONV -ucharstrenum_next(UEnumeration* en, +ucharstrenum_next(UEnumeration* en U_LIFETIME_BOUND, int32_t* resultLength, UErrorCode* /*ec*/) { UCharStringEnumeration *e = (UCharStringEnumeration*) en; @@ -357,7 +357,8 @@ static const UEnumeration UCHARSTRENUM_U_VT = { U_CDECL_END U_CAPI UEnumeration* U_EXPORT2 -uenum_openCharStringsEnumeration(const char* const strings[], int32_t count, +uenum_openCharStringsEnumeration(U_LIFETIME_BOUND const char* const strings[], + int32_t count, UErrorCode* ec) { UCharStringEnumeration* result = nullptr; if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != nullptr)) { @@ -376,8 +377,9 @@ uenum_openCharStringsEnumeration(const char* const strings[], int32_t count, } U_CAPI UEnumeration* U_EXPORT2 -uenum_openUCharStringsEnumeration(const char16_t* const strings[], int32_t count, - UErrorCode* ec) { +uenum_openUCharStringsEnumeration(U_LIFETIME_BOUND const char16_t* const strings[], + int32_t count, + UErrorCode* ec) { UCharStringEnumeration* result = nullptr; if (U_SUCCESS(*ec) && count >= 0 && (count == 0 || strings != nullptr)) { result = (UCharStringEnumeration*) uprv_malloc(sizeof(UCharStringEnumeration)); diff --git a/deps/icu-small/source/common/ustrenum.h b/deps/icu-small/source/common/ustrenum.h index ff546ca0a1b7..5ad1cc11de39 100644 --- a/deps/icu-small/source/common/ustrenum.h +++ b/deps/icu-small/source/common/ustrenum.h @@ -49,7 +49,7 @@ class U_COMMON_API UStringEnumeration : public StringEnumeration { */ virtual int32_t count(UErrorCode& status) const override; - virtual const char* next(int32_t *resultLength, UErrorCode& status) override; + virtual const char* next(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND override; /** * Returns the next element a UnicodeString*. If there are no @@ -57,7 +57,7 @@ class U_COMMON_API UStringEnumeration : public StringEnumeration { * @param status the error code. * @return a pointer to the string, or nullptr. */ - virtual const UnicodeString* snext(UErrorCode& status) override; + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override; /** * Resets the iterator. diff --git a/deps/icu-small/source/common/ustring.cpp b/deps/icu-small/source/common/ustring.cpp index 8375121e2f45..d9365bdc75be 100644 --- a/deps/icu-small/source/common/ustring.cpp +++ b/deps/icu-small/source/common/ustring.cpp @@ -52,9 +52,11 @@ isMatchAtCPBoundary(const char16_t *start, const char16_t *match, const char16_t return true; } -U_CAPI char16_t * U_EXPORT2 -u_strFindFirst(const char16_t *s, int32_t length, - const char16_t *sub, int32_t subLength) { +U_CAPI char16_t* U_EXPORT2 +u_strFindFirst(const char16_t* s U_LIFETIME_BOUND, + int32_t length, + const char16_t* sub, + int32_t subLength) { const char16_t *start, *p, *q, *subLimit; char16_t c, cs, cq; @@ -190,13 +192,13 @@ u_strFindFirst(const char16_t *s, int32_t length, return nullptr; } -U_CAPI char16_t * U_EXPORT2 -u_strstr(const char16_t *s, const char16_t *substring) { +U_CAPI char16_t* U_EXPORT2 +u_strstr(const char16_t* s U_LIFETIME_BOUND, const char16_t* substring) { return u_strFindFirst(s, -1, substring, -1); } -U_CAPI char16_t * U_EXPORT2 -u_strchr(const char16_t *s, char16_t c) { +U_CAPI char16_t* U_EXPORT2 +u_strchr(const char16_t* s U_LIFETIME_BOUND, char16_t c) { if(U16_IS_SURROGATE(c)) { /* make sure to not find half of a surrogate pair */ return u_strFindFirst(s, -1, &c, 1); @@ -216,8 +218,8 @@ u_strchr(const char16_t *s, char16_t c) { } } -U_CAPI char16_t * U_EXPORT2 -u_strchr32(const char16_t *s, UChar32 c) { +U_CAPI char16_t* U_EXPORT2 +u_strchr32(const char16_t* s U_LIFETIME_BOUND, UChar32 c) { if((uint32_t)c<=U_BMP_MAX) { /* find BMP code point */ return u_strchr(s, (char16_t)c); @@ -237,8 +239,8 @@ u_strchr32(const char16_t *s, UChar32 c) { } } -U_CAPI char16_t * U_EXPORT2 -u_memchr(const char16_t *s, char16_t c, int32_t count) { +U_CAPI char16_t* U_EXPORT2 +u_memchr(const char16_t* s U_LIFETIME_BOUND, char16_t c, int32_t count) { if(count<=0) { return nullptr; /* no string */ } else if(U16_IS_SURROGATE(c)) { @@ -256,8 +258,8 @@ u_memchr(const char16_t *s, char16_t c, int32_t count) { } } -U_CAPI char16_t * U_EXPORT2 -u_memchr32(const char16_t *s, UChar32 c, int32_t count) { +U_CAPI char16_t* U_EXPORT2 +u_memchr32(const char16_t* s U_LIFETIME_BOUND, UChar32 c, int32_t count) { if((uint32_t)c<=U_BMP_MAX) { /* find BMP code point */ return u_memchr(s, (char16_t)c, count); @@ -283,9 +285,11 @@ u_memchr32(const char16_t *s, UChar32 c, int32_t count) { /* Backward binary string search functions ---------------------------------- */ -U_CAPI char16_t * U_EXPORT2 -u_strFindLast(const char16_t *s, int32_t length, - const char16_t *sub, int32_t subLength) { +U_CAPI char16_t* U_EXPORT2 +u_strFindLast(const char16_t* s U_LIFETIME_BOUND, + int32_t length, + const char16_t* sub, + int32_t subLength) { const char16_t *start, *limit, *p, *q, *subLimit; char16_t c, cs; @@ -363,13 +367,13 @@ u_strFindLast(const char16_t *s, int32_t length, return nullptr; } -U_CAPI char16_t * U_EXPORT2 -u_strrstr(const char16_t *s, const char16_t *substring) { +U_CAPI char16_t* U_EXPORT2 +u_strrstr(const char16_t* s U_LIFETIME_BOUND, const char16_t* substring) { return u_strFindLast(s, -1, substring, -1); } -U_CAPI char16_t * U_EXPORT2 -u_strrchr(const char16_t *s, char16_t c) { +U_CAPI char16_t* U_EXPORT2 +u_strrchr(const char16_t* s U_LIFETIME_BOUND, char16_t c) { if(U16_IS_SURROGATE(c)) { /* make sure to not find half of a surrogate pair */ return u_strFindLast(s, -1, &c, 1); @@ -390,8 +394,8 @@ u_strrchr(const char16_t *s, char16_t c) { } } -U_CAPI char16_t * U_EXPORT2 -u_strrchr32(const char16_t *s, UChar32 c) { +U_CAPI char16_t* U_EXPORT2 +u_strrchr32(const char16_t* s U_LIFETIME_BOUND, UChar32 c) { if((uint32_t)c<=U_BMP_MAX) { /* find BMP code point */ return u_strrchr(s, (char16_t)c); @@ -412,8 +416,8 @@ u_strrchr32(const char16_t *s, UChar32 c) { } } -U_CAPI char16_t * U_EXPORT2 -u_memrchr(const char16_t *s, char16_t c, int32_t count) { +U_CAPI char16_t* U_EXPORT2 +u_memrchr(const char16_t* s U_LIFETIME_BOUND, char16_t c, int32_t count) { if(count<=0) { return nullptr; /* no string */ } else if(U16_IS_SURROGATE(c)) { @@ -431,8 +435,8 @@ u_memrchr(const char16_t *s, char16_t c, int32_t count) { } } -U_CAPI char16_t * U_EXPORT2 -u_memrchr32(const char16_t *s, UChar32 c, int32_t count) { +U_CAPI char16_t* U_EXPORT2 +u_memrchr32(const char16_t* s U_LIFETIME_BOUND, UChar32 c, int32_t count) { if((uint32_t)c<=U_BMP_MAX) { /* find BMP code point */ return u_memrchr(s, (char16_t)c, count); @@ -537,8 +541,8 @@ _matchFromSet(const char16_t *string, const char16_t *matchSet, UBool polarity) } /* Search for a codepoint in a string that matches one of the matchSet codepoints. */ -U_CAPI char16_t * U_EXPORT2 -u_strpbrk(const char16_t *string, const char16_t *matchSet) +U_CAPI char16_t* U_EXPORT2 +u_strpbrk(const char16_t* string U_LIFETIME_BOUND, const char16_t* matchSet) { int32_t idx = _matchFromSet(string, matchSet, true); if(idx >= 0) { @@ -575,9 +579,7 @@ u_strspn(const char16_t *string, const char16_t *matchSet) /* ----- Text manipulation functions --- */ U_CAPI char16_t* U_EXPORT2 -u_strtok_r(char16_t *src, - const char16_t *delim, - char16_t **saveState) +u_strtok_r(char16_t* src U_LIFETIME_BOUND, const char16_t* delim, char16_t** saveState) { char16_t *tokSource; char16_t *nextToken; @@ -625,8 +627,7 @@ u_strtok_r(char16_t *src, /* Miscellaneous functions -------------------------------------------------- */ U_CAPI char16_t* U_EXPORT2 -u_strcat(char16_t *dst, - const char16_t *src) +u_strcat(char16_t* dst U_LIFETIME_BOUND, const char16_t* src) { char16_t *anchor = dst; /* save a pointer to start of dst */ @@ -639,10 +640,8 @@ u_strcat(char16_t *dst, return anchor; } -U_CAPI char16_t* U_EXPORT2 -u_strncat(char16_t *dst, - const char16_t *src, - int32_t n ) +U_CAPI char16_t* U_EXPORT2 +u_strncat(char16_t* dst U_LIFETIME_BOUND, const char16_t* src, int32_t n) { if(n > 0) { char16_t *anchor = dst; /* save a pointer to start of dst */ @@ -964,8 +963,7 @@ u_strncmpCodePointOrder(const char16_t *s1, const char16_t *s2, int32_t n) { } U_CAPI char16_t* U_EXPORT2 -u_strcpy(char16_t *dst, - const char16_t *src) +u_strcpy(char16_t* dst U_LIFETIME_BOUND, const char16_t* src) { char16_t *anchor = dst; /* save a pointer to start of dst */ @@ -975,11 +973,8 @@ u_strcpy(char16_t *dst, return anchor; } -U_CAPI char16_t* U_EXPORT2 -u_strncpy(char16_t *dst, - const char16_t *src, - int32_t n) -{ +U_CAPI char16_t* U_EXPORT2 +u_strncpy(char16_t* dst U_LIFETIME_BOUND, const char16_t* src, int32_t n) { char16_t *anchor = dst; /* save a pointer to start of dst */ /* copy string 2 over */ @@ -1113,24 +1108,24 @@ u_strHasMoreChar32Than(const char16_t *s, int32_t length, int32_t number) { } } -U_CAPI char16_t * U_EXPORT2 -u_memcpy(char16_t *dest, const char16_t *src, int32_t count) { +U_CAPI char16_t* U_EXPORT2 +u_memcpy(char16_t* dest U_LIFETIME_BOUND, const char16_t* src, int32_t count) { if(count > 0) { uprv_memcpy(dest, src, (size_t)count*U_SIZEOF_UCHAR); } return dest; } -U_CAPI char16_t * U_EXPORT2 -u_memmove(char16_t *dest, const char16_t *src, int32_t count) { +U_CAPI char16_t* U_EXPORT2 +u_memmove(char16_t* dest U_LIFETIME_BOUND, const char16_t* src, int32_t count) { if(count > 0) { uprv_memmove(dest, src, (size_t)count*U_SIZEOF_UCHAR); } return dest; } -U_CAPI char16_t * U_EXPORT2 -u_memset(char16_t *dest, char16_t c, int32_t count) { +U_CAPI char16_t* U_EXPORT2 +u_memset(char16_t* dest U_LIFETIME_BOUND, char16_t c, int32_t count) { if(count > 0) { char16_t *ptr = dest; char16_t *limit = dest + count; diff --git a/deps/icu-small/source/common/ustrtrns.cpp b/deps/icu-small/source/common/ustrtrns.cpp index d16eabe99fd0..d457ca58b5d8 100644 --- a/deps/icu-small/source/common/ustrtrns.cpp +++ b/deps/icu-small/source/common/ustrtrns.cpp @@ -37,13 +37,14 @@ #include "uassert.h" U_CAPI char16_t* U_EXPORT2 -u_strFromUTF32WithSub(char16_t *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar32 *src, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode) { +u_strFromUTF32WithSub(char16_t* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const UChar32* src, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode) { const UChar32 *srcLimit; UChar32 ch; char16_t *destLimit; @@ -137,12 +138,12 @@ u_strFromUTF32WithSub(char16_t *dest, } U_CAPI char16_t* U_EXPORT2 -u_strFromUTF32(char16_t *dest, - int32_t destCapacity, - int32_t *pDestLength, - const UChar32 *src, +u_strFromUTF32(char16_t* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const UChar32* src, int32_t srcLength, - UErrorCode *pErrorCode) { + UErrorCode* pErrorCode) { return u_strFromUTF32WithSub( dest, destCapacity, pDestLength, src, srcLength, @@ -150,14 +151,15 @@ u_strFromUTF32(char16_t *dest, pErrorCode); } -U_CAPI UChar32* U_EXPORT2 -u_strToUTF32WithSub(UChar32 *dest, - int32_t destCapacity, - int32_t *pDestLength, - const char16_t *src, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode) { +U_CAPI UChar32* U_EXPORT2 +u_strToUTF32WithSub(UChar32* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const char16_t* src, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode) { const char16_t *srcLimit; UChar32 ch; char16_t ch2; @@ -242,13 +244,13 @@ u_strToUTF32WithSub(UChar32 *dest, return dest; } -U_CAPI UChar32* U_EXPORT2 -u_strToUTF32(UChar32 *dest, +U_CAPI UChar32* U_EXPORT2 +u_strToUTF32(UChar32* dest U_LIFETIME_BOUND, int32_t destCapacity, - int32_t *pDestLength, - const char16_t *src, + int32_t* pDestLength, + const char16_t* src, int32_t srcLength, - UErrorCode *pErrorCode) { + UErrorCode* pErrorCode) { return u_strToUTF32WithSub( dest, destCapacity, pDestLength, src, srcLength, @@ -257,13 +259,14 @@ u_strToUTF32(UChar32 *dest, } U_CAPI char16_t* U_EXPORT2 -u_strFromUTF8WithSub(char16_t *dest, - int32_t destCapacity, - int32_t *pDestLength, - const char* src, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode){ +u_strFromUTF8WithSub(char16_t* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const char* src, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode) { /* args check */ if(U_FAILURE(*pErrorCode)) { return nullptr; @@ -537,12 +540,12 @@ u_strFromUTF8WithSub(char16_t *dest, } U_CAPI char16_t* U_EXPORT2 -u_strFromUTF8(char16_t *dest, +u_strFromUTF8(char16_t* dest U_LIFETIME_BOUND, int32_t destCapacity, - int32_t *pDestLength, + int32_t* pDestLength, const char* src, int32_t srcLength, - UErrorCode *pErrorCode){ + UErrorCode* pErrorCode) { return u_strFromUTF8WithSub( dest, destCapacity, pDestLength, src, srcLength, @@ -550,13 +553,13 @@ u_strFromUTF8(char16_t *dest, pErrorCode); } -U_CAPI char16_t * U_EXPORT2 -u_strFromUTF8Lenient(char16_t *dest, +U_CAPI char16_t* U_EXPORT2 +u_strFromUTF8Lenient(char16_t* dest U_LIFETIME_BOUND, int32_t destCapacity, - int32_t *pDestLength, - const char *src, + int32_t* pDestLength, + const char* src, int32_t srcLength, - UErrorCode *pErrorCode) { + UErrorCode* pErrorCode) { char16_t *pDest = dest; UChar32 ch; int32_t reqLength = 0; @@ -788,15 +791,15 @@ _appendUTF8(uint8_t *pDest, UChar32 c) { return pDest; } - -U_CAPI char* U_EXPORT2 -u_strToUTF8WithSub(char *dest, - int32_t destCapacity, - int32_t *pDestLength, - const char16_t *pSrc, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode){ +U_CAPI char* U_EXPORT2 +u_strToUTF8WithSub(char* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const char16_t* pSrc, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode) { int32_t reqLength=0; uint32_t ch=0,ch2=0; uint8_t *pDest = (uint8_t *)dest; @@ -1053,13 +1056,13 @@ u_strToUTF8WithSub(char *dest, return dest; } -U_CAPI char* U_EXPORT2 -u_strToUTF8(char *dest, +U_CAPI char* U_EXPORT2 +u_strToUTF8(char* dest U_LIFETIME_BOUND, int32_t destCapacity, - int32_t *pDestLength, - const char16_t *pSrc, + int32_t* pDestLength, + const char16_t* pSrc, int32_t srcLength, - UErrorCode *pErrorCode){ + UErrorCode* pErrorCode) { return u_strToUTF8WithSub( dest, destCapacity, pDestLength, pSrc, srcLength, @@ -1068,14 +1071,14 @@ u_strToUTF8(char *dest, } U_CAPI char16_t* U_EXPORT2 -u_strFromJavaModifiedUTF8WithSub( - char16_t *dest, - int32_t destCapacity, - int32_t *pDestLength, - const char *src, - int32_t srcLength, - UChar32 subchar, int32_t *pNumSubstitutions, - UErrorCode *pErrorCode) { +u_strFromJavaModifiedUTF8WithSub(char16_t* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const char* src, + int32_t srcLength, + UChar32 subchar, + int32_t* pNumSubstitutions, + UErrorCode* pErrorCode) { /* args check */ if(U_FAILURE(*pErrorCode)) { return nullptr; @@ -1309,14 +1312,13 @@ u_strFromJavaModifiedUTF8WithSub( return dest; } -U_CAPI char* U_EXPORT2 -u_strToJavaModifiedUTF8( - char *dest, - int32_t destCapacity, - int32_t *pDestLength, - const char16_t *src, - int32_t srcLength, - UErrorCode *pErrorCode) { +U_CAPI char* U_EXPORT2 +u_strToJavaModifiedUTF8(char* dest U_LIFETIME_BOUND, + int32_t destCapacity, + int32_t* pDestLength, + const char16_t* src, + int32_t srcLength, + UErrorCode* pErrorCode) { int32_t reqLength=0; uint32_t ch=0; const char16_t *pSrcLimit; diff --git a/deps/icu-small/source/common/utext.cpp b/deps/icu-small/source/common/utext.cpp index 0a4248c4e459..0b8a9f2fb5a8 100644 --- a/deps/icu-small/source/common/utext.cpp +++ b/deps/icu-small/source/common/utext.cpp @@ -519,10 +519,12 @@ utext_copy(UText *ut, ut->pFuncs->copy(ut, nativeStart, nativeLimit, destIndex, move, status); } - - -U_CAPI UText * U_EXPORT2 -utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCode *status) { +U_CAPI UText* U_EXPORT2 +utext_clone(UText* dest U_LIFETIME_BOUND, + const UText* src, + UBool deep, + UBool readOnly, + UErrorCode* status) { if (U_FAILURE(*status)) { return dest; } @@ -577,8 +579,8 @@ struct ExtendedUText { static const UText emptyText = UTEXT_INITIALIZER; -U_CAPI UText * U_EXPORT2 -utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) { +U_CAPI UText* U_EXPORT2 +utext_setup(UText* ut U_LIFETIME_BOUND, int32_t extraSpace, UErrorCode* status) { if (U_FAILURE(*status)) { return ut; } @@ -664,8 +666,8 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) { } -U_CAPI UText * U_EXPORT2 -utext_close(UText *ut) { +U_CAPI UText* U_EXPORT2 +utext_close(UText* ut U_LIFETIME_BOUND) { if (ut==nullptr || ut->magic != UTEXT_MAGIC || (ut->flags & UTEXT_OPEN) == 0) @@ -1630,8 +1632,11 @@ static const struct UTextFuncs utf8Funcs = static const char gEmptyString[] = {0}; -U_CAPI UText * U_EXPORT2 -utext_openUTF8(UText *ut, const char *s, int64_t length, UErrorCode *status) { +U_CAPI UText* U_EXPORT2 +utext_openUTF8(UText* ut U_LIFETIME_BOUND, + const char* s U_LIFETIME_BOUND, + int64_t length, + UErrorCode* status) { if(U_FAILURE(*status)) { return nullptr; } @@ -2037,9 +2042,10 @@ static const struct UTextFuncs repFuncs = }; -U_CAPI UText * U_EXPORT2 -utext_openReplaceable(UText *ut, Replaceable *rep, UErrorCode *status) -{ +U_CAPI UText* U_EXPORT2 +utext_openReplaceable(UText* ut U_LIFETIME_BOUND, + Replaceable* rep U_LIFETIME_BOUND, + UErrorCode* status) { if(U_FAILURE(*status)) { return nullptr; } @@ -2100,6 +2106,7 @@ unistrTextClone(UText *dest, const UText *src, UBool deep, UErrorCode *status) { if (deep && U_SUCCESS(*status)) { const UnicodeString *srcString = (const UnicodeString *)src->context; dest->context = new UnicodeString(*srcString); + dest->chunkContents = ((const UnicodeString *)dest->context)->getBuffer(); dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT); // with deep clone, the copy is writable, even when the source is not. @@ -2295,8 +2302,10 @@ static const struct UTextFuncs unistrFuncs = U_CDECL_END -U_CAPI UText * U_EXPORT2 -utext_openUnicodeString(UText *ut, UnicodeString *s, UErrorCode *status) { +U_CAPI UText* U_EXPORT2 +utext_openUnicodeString(UText* ut U_LIFETIME_BOUND, + UnicodeString* s U_LIFETIME_BOUND, + UErrorCode* status) { ut = utext_openConstUnicodeString(ut, s, status); if (U_SUCCESS(*status)) { ut->providerProperties |= I32_FLAG(UTEXT_PROVIDER_WRITABLE); @@ -2306,8 +2315,10 @@ utext_openUnicodeString(UText *ut, UnicodeString *s, UErrorCode *status) { -U_CAPI UText * U_EXPORT2 -utext_openConstUnicodeString(UText *ut, const UnicodeString *s, UErrorCode *status) { +U_CAPI UText* U_EXPORT2 +utext_openConstUnicodeString(UText* ut U_LIFETIME_BOUND, + const UnicodeString* s U_LIFETIME_BOUND, + UErrorCode* status) { if (U_SUCCESS(*status) && s->isBogus()) { // The UnicodeString is bogus, but we still need to detach the UText // from whatever it was hooked to before, if anything. @@ -2373,6 +2384,7 @@ ucstrTextClone(UText *dest, const UText * src, UBool deep, UErrorCode * status) } copyStr[len] = 0; dest->context = copyStr; + dest->chunkContents = copyStr; dest->providerProperties |= I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT); } } @@ -2613,8 +2625,11 @@ U_CDECL_END static const char16_t gEmptyUString[] = {0}; -U_CAPI UText * U_EXPORT2 -utext_openUChars(UText *ut, const char16_t *s, int64_t length, UErrorCode *status) { +U_CAPI UText* U_EXPORT2 +utext_openUChars(UText* ut U_LIFETIME_BOUND, + const char16_t* s U_LIFETIME_BOUND, + int64_t length, + UErrorCode* status) { if (U_FAILURE(*status)) { return nullptr; } @@ -2837,9 +2852,10 @@ static const struct UTextFuncs charIterFuncs = }; U_CDECL_END - -U_CAPI UText * U_EXPORT2 -utext_openCharacterIterator(UText *ut, CharacterIterator *ci, UErrorCode *status) { +U_CAPI UText* U_EXPORT2 +utext_openCharacterIterator(UText* ut U_LIFETIME_BOUND, + CharacterIterator* ci U_LIFETIME_BOUND, + UErrorCode* status) { if (U_FAILURE(*status)) { return nullptr; } diff --git a/deps/icu-small/source/common/uts46.cpp b/deps/icu-small/source/common/uts46.cpp index 16565ae0dafd..207509308cf8 100644 --- a/deps/icu-small/source/common/uts46.cpp +++ b/deps/icu-small/source/common/uts46.cpp @@ -117,21 +117,29 @@ class UTS46 : public IDNA { UTS46(uint32_t options, UErrorCode &errorCode); virtual ~UTS46(); - virtual UnicodeString & - labelToASCII(const UnicodeString &label, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const override; - - virtual UnicodeString & - labelToUnicode(const UnicodeString &label, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const override; - - virtual UnicodeString & - nameToASCII(const UnicodeString &name, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const override; - - virtual UnicodeString & - nameToUnicode(const UnicodeString &name, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const override; + virtual UnicodeString& + labelToASCII(const UnicodeString& label, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const override; + + virtual UnicodeString& + labelToUnicode(const UnicodeString& label, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const override; + + virtual UnicodeString& + nameToASCII(const UnicodeString& name, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const override; + + virtual UnicodeString& + nameToUnicode(const UnicodeString& name, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const override; virtual void labelToASCII_UTF8(StringPiece label, ByteSink &dest, @@ -150,11 +158,13 @@ class UTS46 : public IDNA { IDNAInfo &info, UErrorCode &errorCode) const override; private: - UnicodeString & - process(const UnicodeString &src, - UBool isLabel, UBool toASCII, - UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const; + UnicodeString& + process(const UnicodeString& src, + UBool isLabel, + UBool toASCII, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const; void processUTF8(StringPiece src, @@ -162,12 +172,15 @@ class UTS46 : public IDNA { ByteSink &dest, IDNAInfo &info, UErrorCode &errorCode) const; - UnicodeString & - processUnicode(const UnicodeString &src, - int32_t labelStart, int32_t mappingStart, - UBool isLabel, UBool toASCII, - UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const; + UnicodeString& + processUnicode(const UnicodeString& src, + int32_t labelStart, + int32_t mappingStart, + UBool isLabel, + UBool toASCII, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const; // returns the new dest.length() int32_t @@ -222,21 +235,27 @@ UTS46::UTS46(uint32_t opt, UErrorCode &errorCode) UTS46::~UTS46() {} -UnicodeString & -UTS46::labelToASCII(const UnicodeString &label, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const { +UnicodeString& +UTS46::labelToASCII(const UnicodeString& label, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const { return process(label, true, true, dest, info, errorCode); } -UnicodeString & -UTS46::labelToUnicode(const UnicodeString &label, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const { +UnicodeString& +UTS46::labelToUnicode(const UnicodeString& label, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const { return process(label, true, false, dest, info, errorCode); } -UnicodeString & -UTS46::nameToASCII(const UnicodeString &name, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const { +UnicodeString& +UTS46::nameToASCII(const UnicodeString& name, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const { process(name, false, true, dest, info, errorCode); if( dest.length()>=254 && (info.errors&UIDNA_ERROR_DOMAIN_NAME_TOO_LONG)==0 && isASCIIString(dest) && @@ -247,9 +266,11 @@ UTS46::nameToASCII(const UnicodeString &name, UnicodeString &dest, return dest; } -UnicodeString & -UTS46::nameToUnicode(const UnicodeString &name, UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const { +UnicodeString& +UTS46::nameToUnicode(const UnicodeString& name, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const { return process(name, false, false, dest, info, errorCode); } @@ -299,11 +320,13 @@ static const int8_t asciiData[128]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1 }; -UnicodeString & -UTS46::process(const UnicodeString &src, - UBool isLabel, UBool toASCII, - UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const { +UnicodeString& +UTS46::process(const UnicodeString& src, + UBool isLabel, + UBool toASCII, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const { // uts46Norm2.normalize() would do all of this error checking and setup, // but with the ASCII fastpath we do not always call it, and do not // call it first. @@ -524,12 +547,15 @@ UTS46::processUTF8(StringPiece src, } } -UnicodeString & -UTS46::processUnicode(const UnicodeString &src, - int32_t labelStart, int32_t mappingStart, - UBool isLabel, UBool toASCII, - UnicodeString &dest, - IDNAInfo &info, UErrorCode &errorCode) const { +UnicodeString& +UTS46::processUnicode(const UnicodeString& src, + int32_t labelStart, + int32_t mappingStart, + UBool isLabel, + UBool toASCII, + UnicodeString& dest U_LIFETIME_BOUND, + IDNAInfo& info, + UErrorCode& errorCode) const { if(mappingStart==0) { uts46Norm2.normalize(src, dest, errorCode); } else { diff --git a/deps/icu-small/source/data/in/icudt78l.dat.bz2 b/deps/icu-small/source/data/in/icudt79l.dat.bz2 similarity index 57% rename from deps/icu-small/source/data/in/icudt78l.dat.bz2 rename to deps/icu-small/source/data/in/icudt79l.dat.bz2 index b2b2e3f6811a..5d99f677554f 100644 Binary files a/deps/icu-small/source/data/in/icudt78l.dat.bz2 and b/deps/icu-small/source/data/in/icudt79l.dat.bz2 differ diff --git a/deps/icu-small/source/i18n/alphaindex.cpp b/deps/icu-small/source/i18n/alphaindex.cpp index e220e60e95e9..e193d8a73bb0 100644 --- a/deps/icu-small/source/i18n/alphaindex.cpp +++ b/deps/icu-small/source/i18n/alphaindex.cpp @@ -372,7 +372,8 @@ void AlphabeticIndex::initLabels(UVector &indexCharacters, UErrorCode &errorCode namespace { -const UnicodeString &fixLabel(const UnicodeString ¤t, UnicodeString &temp) { +const UnicodeString &fixLabel(const UnicodeString ¤t U_LIFETIME_BOUND, + UnicodeString &temp U_LIFETIME_BOUND) { if (!current.startsWith(BASE, BASE_LENGTH)) { return current; } diff --git a/deps/icu-small/source/i18n/anytrans.cpp b/deps/icu-small/source/i18n/anytrans.cpp index c558a29d0005..fe733d5cfb4f 100644 --- a/deps/icu-small/source/i18n/anytrans.cpp +++ b/deps/icu-small/source/i18n/anytrans.cpp @@ -359,7 +359,9 @@ void AnyTransliterator::registerIDs() { UErrorCode ec = U_ZERO_ERROR; Hashtable seen(true, ec); - + if (U_FAILURE(ec)) { + return; + } int32_t sourceCount = Transliterator::_countAvailableSources(); for (int32_t s=0; s 0 || newYear >= 1) { int32_t maxYear = getActualMaximum(field, status); + if (U_FAILURE(status)) { + return; + } if (maxYear < 32768) { // this era has real bounds, roll should wrap years if (newYear < 1) { diff --git a/deps/icu-small/source/i18n/chnsecal.cpp b/deps/icu-small/source/i18n/chnsecal.cpp index 94ece08ce190..6355b98a6800 100644 --- a/deps/icu-small/source/i18n/chnsecal.cpp +++ b/deps/icu-small/source/i18n/chnsecal.cpp @@ -658,7 +658,7 @@ int32_t newMoonNear(const TimeZone* timeZone, double days, UBool after, UErrorCo return static_cast(millisToDays( timeZone, CalendarAstronomer(ms) - .getMoonTime(CalendarAstronomer::NEW_MOON(), after), + .getMoonTime(CalendarAstronomer::NEW_MOON, after), status)); } @@ -915,6 +915,10 @@ void ChineseCalendar::handleComputeFields(int32_t julianDay, UErrorCode & status status = U_ILLEGAL_ARGUMENT_ERROR; return; } + // In C++, computeMonthInfo returns 1-based month numbers (1=Month 1, 11=Month 11), + // so monthInfo.month < 11 checks if the lunar month is before Month 11. + // Notice: In Java (ICU4J), computeMonthInfo returns 0-based month numbers (0=Month 1, 10=Month 11), + // so info.month < 10 is checked there. Both implementations correctly check for Month 11 (see ICU-23198). if (monthInfo.month < 11 || gmonth >= UCAL_JULY) { // forward to next year diff --git a/deps/icu-small/source/i18n/coll.cpp b/deps/icu-small/source/i18n/coll.cpp index 1f8b8e417b04..52d5892b7013 100644 --- a/deps/icu-small/source/i18n/coll.cpp +++ b/deps/icu-small/source/i18n/coll.cpp @@ -829,7 +829,8 @@ class CollationLocaleListEnumeration : public StringEnumeration { return availableLocaleListCount; } - virtual const char* next(int32_t* resultLength, UErrorCode& /*status*/) override { + virtual const char* next(int32_t* resultLength, + UErrorCode& /*status*/) U_LIFETIME_BOUND override { const char* result; if(index < availableLocaleListCount) { result = availableLocaleList[index++].getName(); @@ -845,7 +846,7 @@ class CollationLocaleListEnumeration : public StringEnumeration { return result; } - virtual const UnicodeString* snext(UErrorCode& status) override { + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override { int32_t resultLength = 0; const char *s = next(&resultLength, status); return setChars(s, resultLength, status); diff --git a/deps/icu-small/source/i18n/collationbuilder.cpp b/deps/icu-small/source/i18n/collationbuilder.cpp index 0f7043340be3..74d20fd1c2c8 100644 --- a/deps/icu-small/source/i18n/collationbuilder.cpp +++ b/deps/icu-small/source/i18n/collationbuilder.cpp @@ -1121,7 +1121,7 @@ CollationBuilder::addWithClosure(const UnicodeString &nfdPrefix, const UnicodeSt // This value is needed for compiling a rule with eight Hangul syllables such as // "&a=b쫊쫊쫊쫊쫊쫊쫊" without error, which should be more than realistic // usage. -static constexpr int32_t kClosureLoopLimit = 3000; +static constexpr int32_t kClosureLoopLimit = 2400; uint32_t CollationBuilder::addOnlyClosure(const UnicodeString &nfdPrefix, const UnicodeString &nfdString, @@ -1201,7 +1201,7 @@ CollationBuilder::addTailComposites(const UnicodeString &nfdPrefix, const Unicod UnicodeString newNFDString, newString; int64_t newCEs[Collation::MAX_EXPANSION_LENGTH]; UnicodeSetIterator iter(composites); - while(iter.next()) { + while(iter.next() && U_SUCCESS(errorCode)) { U_ASSERT(!iter.isString()); UChar32 composite = iter.getCodepoint(); nfd.getDecomposition(composite, decomp); @@ -1353,7 +1353,7 @@ CollationBuilder::closeOverComposites(UErrorCode &errorCode) { UnicodeString prefix; // empty UnicodeString nfdString; UnicodeSetIterator iter(composites); - while(iter.next()) { + while(iter.next() && U_SUCCESS(errorCode)) { U_ASSERT(!iter.isString()); nfd.getDecomposition(iter.getCodepoint(), nfdString); cesLength = dataBuilder->getCEs(nfdString, ces, 0); diff --git a/deps/icu-small/source/i18n/collationbuilder.h b/deps/icu-small/source/i18n/collationbuilder.h index a5fd8f427a42..847272be93b5 100644 --- a/deps/icu-small/source/i18n/collationbuilder.h +++ b/deps/icu-small/source/i18n/collationbuilder.h @@ -180,26 +180,27 @@ class U_I18N_API CollationBuilder : public CollationRuleParser::Sink { * * The case bits are unused and available. */ - static inline int64_t tempCEFromIndexAndStrength(int32_t index, int32_t strength) { + static inline uint64_t tempCEFromIndexAndStrength(int32_t index, int32_t strength) { return // CE byte offsets, to ensure valid CE bytes, and case bits 11 - INT64_C(0x4040000006002000) + + UINT64_C(0x4040000006002000) + // index bits 19..13 -> primary byte 1 = CE bits 63..56 (byte values 40..BF) - (static_cast(index & 0xfe000) << 43) + + (static_cast(index & 0xfe000) << 43) + // index bits 12..6 -> primary byte 2 = CE bits 55..48 (byte values 40..BF) - (static_cast(index & 0x1fc0) << 42) + + (static_cast(index & 0x1fc0) << 42) + // index bits 5..0 -> secondary byte 1 = CE bits 31..24 (byte values 06..45) ((index & 0x3f) << 24) + // strength bits 1..0 -> tertiary byte 1 = CE bits 13..8 (byte values 20..23) (strength << 8); } - static inline int32_t indexFromTempCE(int64_t tempCE) { - tempCE -= INT64_C(0x4040000006002000); + static inline int32_t indexFromTempCE(uint64_t tempCE) { + tempCE -= UINT64_C(0x4040000006002000); return (static_cast(tempCE >> 43) & 0xfe000) | (static_cast(tempCE >> 42) & 0x1fc0) | (static_cast(tempCE >> 24) & 0x3f); } + static inline int32_t strengthFromTempCE(int64_t tempCE) { return (static_cast(tempCE) >> 8) & 3; } @@ -251,7 +252,7 @@ class U_I18N_API CollationBuilder : public CollationRuleParser::Sink { return static_cast(previous) << 28; } static inline int64_t nodeFromNextIndex(int32_t next) { - return next << 8; + return static_cast(next) << 8; } static inline int64_t nodeFromStrength(int32_t strength) { return strength; diff --git a/deps/icu-small/source/i18n/collationdatabuilder.cpp b/deps/icu-small/source/i18n/collationdatabuilder.cpp index 4baea33c12eb..27ae4d3cadc7 100644 --- a/deps/icu-small/source/i18n/collationdatabuilder.cpp +++ b/deps/icu-small/source/i18n/collationdatabuilder.cpp @@ -164,7 +164,7 @@ class DataBuilderCollationIterator : public CollationIterator { }; DataBuilderCollationIterator::DataBuilderCollationIterator(CollationDataBuilder &b) - : CollationIterator(&builderData, /*numeric=*/ false), + : CollationIterator(&builderData, /*nullTrie=*/ nullptr, /*numeric=*/ false), builder(b), builderData(b.nfcImpl), s(nullptr), pos(0) { builderData.base = builder.base; @@ -205,7 +205,7 @@ DataBuilderCollationIterator::fetchCEs(const UnicodeString &str, int32_t start, d = &builderData; } appendCEsFromCE32(d, c, ce32, /*forward=*/ true, errorCode); - U_ASSERT(U_SUCCESS(errorCode)); + if(U_FAILURE(errorCode)) { return 0; } for(int32_t i = 0; i < getCEsLength(); ++i) { int64_t ce = getCE(i); if(ce != 0) { @@ -1701,6 +1701,10 @@ CollationDataBuilder::addContextTrie(uint32_t defaultCE32, UCharsTrieBuilder &tr int32_t index = contexts.indexOf(context); if(index < 0) { index = contexts.length(); + if (index + context.length() > Collation::MAX_INDEX) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + return -1; + } contexts.append(context); } return index; diff --git a/deps/icu-small/source/i18n/collationfastlatin.cpp b/deps/icu-small/source/i18n/collationfastlatin.cpp index e128df496761..fad2ba04dcdd 100644 --- a/deps/icu-small/source/i18n/collationfastlatin.cpp +++ b/deps/icu-small/source/i18n/collationfastlatin.cpp @@ -43,6 +43,8 @@ CollationFastLatin::getOptions(const CollationData *data, const CollationSetting return -1; // variableTop >= digits, should not occur } miniVarTop = table[i]; + // Turn the max long-primary for the group into a max CE. + miniVarTop |= TERTIARY_MASK; } UBool digitsAreReordered = false; @@ -86,23 +88,28 @@ CollationFastLatin::getOptions(const CollationData *data, const CollationSetting table += (table[0] & 0xff); // skip the header for(UChar32 c = 0; c < LATIN_LIMIT; ++c) { - uint32_t p = table[c]; - if(p >= MIN_SHORT) { - p &= SHORT_PRIMARY_MASK; - } else if(p > miniVarTop) { - p &= LONG_PRIMARY_MASK; + uint32_t ce = table[c]; + if(ce >= MIN_SHORT) { + ce &= SHORT_PRIMARY_MASK; + } else if(ce > miniVarTop) { + ce &= LONG_PRIMARY_MASK; } else { - p = 0; + ce = 0; } - primaries[c] = static_cast(p); + primaries[c] = static_cast(ce); } if(digitsAreReordered || (settings.options & CollationSettings::NUMERIC) != 0) { // Bail out for digits. for(UChar32 c = 0x30; c <= 0x39; ++c) { primaries[c] = 0; } } + // NUMERIC flag is also used for indicating digits are reordered + // in fast-Latin options. + int options = digitsAreReordered ? + settings.options | CollationSettings::NUMERIC : settings.options; + // Shift the miniVarTop above other options. - return (static_cast(miniVarTop) << 16) | settings.options; + return (static_cast(miniVarTop) << 16) | options; } int32_t diff --git a/deps/icu-small/source/i18n/collationfcd.cpp b/deps/icu-small/source/i18n/collationfcd.cpp index 9b45f0422538..c3cd20caa4bc 100644 --- a/deps/icu-small/source/i18n/collationfcd.cpp +++ b/deps/icu-small/source/i18n/collationfcd.cpp @@ -29,18 +29,18 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x27,0x28,0,0,0,0,0x29,0, 0,0,0,0,0,0x2a,0,0,0,0x13,0,0,0,0,0,0, -0x2b,0,0,0x2c,0,0x2d,0x2e,0x2f,0,0x28,0x30,0x31,0,0x32,0,0x33, -0,0x34,0,0,0,0,0x35,0x36,0,0,0,0,0,0,1,1, +0x2b,0,0,0x2c,0,0x2d,1,0x2e,0,0x28,0x2f,0x30,0,0x31,0,0x32, +0,0x33,0,0,0,0,0x34,0x35,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,0x37,0x38,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x36,0x37,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x39,0,0,0,0x3a,0,0,0,1, +0,0,0,0,0,0,0,0x38,0,0,0,0x39,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x3b,0,0,0x3c,0,0,0,0,0,0,0,0,0,0,0, +0,0x3a,0,0,0x3b,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -99,9 +99,9 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x3d,0x3e,0,0,0x3f,0,0,0,0,0,0,0,0, -0x24,0x40,0,0,0,0,0x30,0x41,0,0x42,0x43,0,0,0x43,0x44,0, -0,0,0,0,0,0x45,0x46,0x47,0,0,0,0,0,0,0,0x19, +0,0,0,0x3c,0x3d,0,0,0x3e,0,0,0,0,0,0,0,0, +0x24,0x3f,0,0,0,0,0x2f,0x40,0,0x41,0x42,0,0,0x42,0x43,0, +0,0,0,0,0,0x44,0x45,0x46,0,0,0,0,0,0,0,0x19, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -124,7 +124,7 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x48,0x49,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x47,0x48,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -146,12 +146,12 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; -const uint32_t CollationFCD::lcccBits[74]={ -0,0xffffffff,0xffff7fff,0xffff,0xf8,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0xfffff800,0x10000,0x9fc00000,0x3d9f,0x20000,0xffff0000,0x7ff, +const uint32_t CollationFCD::lcccBits[73]={ +0,0xffffffff,0xffff7fff,0xffff,0xf8,0xfffe0000,0xbfffffff,0x3b6,0x7ff0000,0xfffff800,0x10000,0x9fc00000,0x3d9f,0x20000,0xffff0000,0x7ff, 0x200ff800,0xfbc00000,0x3eef,0xe000000,0xff800000,0xfffffc00,0xfffffffb,0x10000000,0x1e2000,0x2000,0x40000000,0x602000,0x18000000,0x400,0x7000000,0xf00, -0x3000000,0x2a00000,0x3c3e0000,0xdf,0x40,0x6800000,0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x3fffffff,0xfff, -0x10,0xff800,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000, -0x1000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xd0000fd,0x7108000 +0x3000000,0x2a00000,0x3c3e0000,0xdf,0x40,0x6800000,0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x1ffff,0x10, +0xff800,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,0x1000, +0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xd0000fd,0x7108000 }; const uint8_t CollationFCD::tcccIndex[2048]={ @@ -168,9 +168,9 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x41,0x42,0,0,0,0,0x43,0, 0,0,0,0,0,0x44,0,0,0,0x28,0,0,0,0,0,0, -0x45,0,0,0x46,0,0x47,0x48,0x49,0,0x42,0x4a,0x4b,0,0x4c,0,0x4d, -0,0x4e,0,0,0,0,0x4f,0x50,0,0,0,0,0,0,1,1, -1,1,1,1,0x51,1,1,0x52,0x53,1,0x54,0x48,1,0x55,0x56,0x57, +0x45,0,0,0x46,0,0x47,1,0x48,0,0x42,0x49,0x4a,0,0x4b,0,0x4c, +0,0x4d,0,0,0,0,0x4e,0x4f,0,0,0,0,0,0,1,1, +1,1,1,1,0x50,1,1,0x51,0x52,1,0x53,0x54,1,0x55,0x56,0x57, 0,0,0,0,0,0,0x58,0x59,0,0x5a,0,0,0x5b,0x5c,0x5d,0, 0x5e,0x5f,0x60,0x61,0x62,0x63,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, @@ -239,7 +239,7 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0x6c,0x6d,0,0,0x6e,0,0,0,0,0,0,0,0, -0x3e,0x6f,0,0,0,0,0x4a,0x70,0,0x71,0x72,0,0,0x72,0x73,0, +0x3e,0x6f,0,0,0,0,0x49,0x70,0,0x71,0x72,0,0,0x72,0x73,0, 0,0,0,0,0,0x74,0x75,0x76,0,0,0,0,0,0,0,0x33, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -287,11 +287,11 @@ const uint8_t CollationFCD::tcccIndex[2048]={ const uint32_t CollationFCD::tcccBits[123]={ 0,0xffffffff,0x3e7effbf,0xbe7effbf,0xfffcffff,0x7ef1ff3f,0xfff3f1f8,0x7fffff3f,0x18003,0xdfffe000,0xff31ffcf,0xcfffffff,0xfffc0,0xffff7fff,0xffff,0x1d760, -0x1fc00,0x187c00,0x200708b,0x2000000,0x708b0000,0xc00000,0xf8,0xfccf0006,0x33ffcfc,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0x7c,0xfffff800,0x10000, +0x1fc00,0x187c00,0x200708b,0x2000000,0x708b0000,0xc00000,0xf8,0xfccf0006,0x33ffcfc,0xfffe0000,0xbfffffff,0x3b6,0x7ff0000,0x7c,0xfffff800,0x10000, 0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0x200ff800,0xfbc00000,0x3eef,0xe000000,0xff800000,0xfffffc00,0xfffffffb,0x10120200,0xff1e2000,0x10000000,0xb0002000, 0x40000000,0x10480000,0x4e002000,0x2000,0x30002000,0x602100,0x18000000,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000, -0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x3fffffff,0xfff,0x10,0xff800,0xc00,0xc0040,0x800000,0xfff70000, -0x31021fd,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50, +0xe0000000,0x300000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0xbfff0000,0x1ffff,0x10,0xff800,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd, +0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x3fffffff,0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50, 0x292,0x333e005,0x333,0xf000,0x3c0f,0x38000,0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0xc0000000,0x30000,0x1000, 0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0xd0000ff,0x7108000,0x5f7ffc00,0x7fdb }; diff --git a/deps/icu-small/source/i18n/collationfcd.h b/deps/icu-small/source/i18n/collationfcd.h index c9ca54234f66..a5a758fcb44f 100644 --- a/deps/icu-small/source/i18n/collationfcd.h +++ b/deps/icu-small/source/i18n/collationfcd.h @@ -80,6 +80,24 @@ class U_I18N_API CollationFCD { (tcccBits[i] & (static_cast(1) << (c & 0x1f))) != 0; } + static inline UBool hasTcccBefore(const char16_t *start, const char16_t *pos) { + if (pos != start) { + char16_t prev = *--pos; + if (U16_IS_TRAIL(prev)) { + // hasTccc() always returns false. + // To test possible trailing ccc, we need to check the high surrogate + // (or previous character for unpaired surrogate). + if (pos != start) { + char16_t prev2 = *(pos - 1); + return U16_IS_LEAD(prev2) && hasTccc(prev2); + } + } else { + return hasTccc(prev); + } + } + return false; + } + static inline UBool mayHaveLccc(UChar32 c) { // Handles all of Unicode 0..10FFFF. // c can be negative, e.g., U_SENTINEL. diff --git a/deps/icu-small/source/i18n/collationiterator.h b/deps/icu-small/source/i18n/collationiterator.h index 7e234c65b083..b99e9642ed43 100644 --- a/deps/icu-small/source/i18n/collationiterator.h +++ b/deps/icu-small/source/i18n/collationiterator.h @@ -212,6 +212,22 @@ class U_I18N_API_CLASS CollationIterator : public UObject { protected: CollationIterator(const CollationIterator &other); + /** + * A special constructor used by DataBuilderCollationIterator, which initializes + * the CollationData in the constructor. The public CollationIterator constructor + * initializes the trie pointer from the CollationData, but it's not yet available + * when DataBuilderCollationIterator invokes the CollationIterator constructor. + * The CollationData used by DataBuilderCollationIterator is the Normalizer2Impl, + * which does not have a trie, so the trie pointer is set to nullptr. + */ + CollationIterator(const CollationData *d, std::nullptr_t nullTrie, UBool numeric) + : trie(nullTrie), + data(d), + cesIndex(0), + skipped(nullptr), + numCpFwd(-1), + isNumeric(numeric) {} + void reset(); /** diff --git a/deps/icu-small/source/i18n/collationkeys.cpp b/deps/icu-small/source/i18n/collationkeys.cpp index b5bbd2a64aba..12d9498e9487 100644 --- a/deps/icu-small/source/i18n/collationkeys.cpp +++ b/deps/icu-small/source/i18n/collationkeys.cpp @@ -55,12 +55,12 @@ SortKeyByteSink::Append(const char *bytes, int32_t n) { } } -char * +char* SortKeyByteSink::GetAppendBuffer(int32_t min_capacity, int32_t desired_capacity_hint, - char *scratch, + char* scratch U_LIFETIME_BOUND, int32_t scratch_capacity, - int32_t *result_capacity) { + int32_t* result_capacity) U_LIFETIME_BOUND { if (min_capacity < 1 || scratch_capacity < min_capacity) { *result_capacity = 0; return nullptr; diff --git a/deps/icu-small/source/i18n/collationkeys.h b/deps/icu-small/source/i18n/collationkeys.h index 0529b3098483..2df1e6f427a4 100644 --- a/deps/icu-small/source/i18n/collationkeys.h +++ b/deps/icu-small/source/i18n/collationkeys.h @@ -49,10 +49,11 @@ class SortKeyByteSink : public ByteSink { ++appended_; } } - virtual char *GetAppendBuffer(int32_t min_capacity, + virtual char* GetAppendBuffer(int32_t min_capacity, int32_t desired_capacity_hint, - char *scratch, int32_t scratch_capacity, - int32_t *result_capacity) override; + char* scratch U_LIFETIME_BOUND, + int32_t scratch_capacity, + int32_t* result_capacity) U_LIFETIME_BOUND override; int32_t NumberOfBytesAppended() const { return appended_; } /** diff --git a/deps/icu-small/source/i18n/collationsettings.cpp b/deps/icu-small/source/i18n/collationsettings.cpp index 660efc12f63b..795fec08e297 100644 --- a/deps/icu-small/source/i18n/collationsettings.cpp +++ b/deps/icu-small/source/i18n/collationsettings.cpp @@ -195,6 +195,10 @@ CollationSettings::setReorderArrays(const int32_t *codes, int32_t codesLength, int32_t *ownedCodes; int32_t totalLength = codesLength + rangesLength; U_ASSERT(totalLength > 0); + if (totalLength <= 0) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } if(totalLength <= reorderCodesCapacity) { ownedCodes = const_cast(reorderCodes); } else { diff --git a/deps/icu-small/source/i18n/collationsettings.h b/deps/icu-small/source/i18n/collationsettings.h index 6ef3c8a8d759..5fdcb60875e9 100644 --- a/deps/icu-small/source/i18n/collationsettings.h +++ b/deps/icu-small/source/i18n/collationsettings.h @@ -42,6 +42,10 @@ struct U_I18N_API CollationSettings : public SharedObject { * * Treat digit sequences as numbers with CE sequences in numeric order, * rather than returning a normal CE for each digit. + * + * This bit is also used for indicating that digits are reordered in the fast-Latin code. + * When the fast-Latin code encounters a digit and this bit is set in the options, it bails out + * and fallback to the regular collation code. */ static const int32_t NUMERIC = 2; /** diff --git a/deps/icu-small/source/i18n/collunsafe.h b/deps/icu-small/source/i18n/collunsafe.h index a39aeed6f9e1..18283b86f7d1 100644 --- a/deps/icu-small/source/i18n/collunsafe.h +++ b/deps/icu-small/source/i18n/collunsafe.h @@ -12,15 +12,15 @@ #include "unicode/utypes.h" -#define COLLUNSAFE_ICU_VERSION "78.0.1" -#define COLLUNSAFE_COLL_VERSION "9.136" +#define COLLUNSAFE_ICU_VERSION "79.0.1" +#define COLLUNSAFE_COLL_VERSION "9.144" #define COLLUNSAFE_SERIALIZE 1 -static const int32_t unsafe_serializedCount = 1236; -static const uint16_t unsafe_serializedData[1236] = { -0x84D2, 0x01C2, 0x0034, 0x0035, 0x004C, 0x004D, 0x00A0, 0x00A1, // 8 +static const int32_t unsafe_serializedCount = 1276; +static const uint16_t unsafe_serializedData[1276] = { +0x84FA, 0x01C2, 0x0034, 0x0035, 0x004C, 0x004D, 0x00A0, 0x00A1, // 8 0x0300, 0x034F, 0x0350, 0x0370, 0x03A9, 0x03AA, 0x03E2, 0x03E3, // 16 0x042F, 0x0430, 0x0483, 0x0488, 0x0531, 0x0532, 0x0591, 0x05BE, // 24 -0x05BF, 0x05C0, 0x05C1, 0x05C3, 0x05C4, 0x05C6, 0x05C7, 0x05C8, // 32 +0x05BF, 0x05C0, 0x05C1, 0x05C3, 0x05C4, 0x05C6, 0x05C7, 0x05CA, // 32 0x05D0, 0x05D1, 0x0610, 0x061B, 0x0628, 0x0629, 0x064B, 0x0660, // 40 0x0670, 0x0671, 0x06D6, 0x06DD, 0x06DF, 0x06E5, 0x06E7, 0x06E9, // 48 0x06EA, 0x06EE, 0x0710, 0x0712, 0x0730, 0x074B, 0x078C, 0x078D, // 56 @@ -52,27 +52,27 @@ static const uint16_t unsafe_serializedData[1236] = { 0x17DD, 0x17DE, 0x1826, 0x1827, 0x18A9, 0x18AA, 0x1900, 0x1901, // 264 0x1939, 0x193C, 0x1950, 0x1951, 0x1980, 0x19AC, 0x1A00, 0x1A01, // 272 0x1A17, 0x1A19, 0x1A20, 0x1A21, 0x1A60, 0x1A61, 0x1A75, 0x1A7D, // 280 -0x1A7F, 0x1A80, 0x1AB0, 0x1ABE, 0x1ABF, 0x1ADE, 0x1AE0, 0x1AEC, // 288 -0x1B05, 0x1B06, 0x1B34, 0x1B36, 0x1B44, 0x1B45, 0x1B6B, 0x1B74, // 296 -0x1B83, 0x1B84, 0x1BAA, 0x1BAC, 0x1BC0, 0x1BC1, 0x1BE6, 0x1BE7, // 304 -0x1BF2, 0x1BF4, 0x1C00, 0x1C01, 0x1C37, 0x1C38, 0x1C5A, 0x1C5B, // 312 -0x1CD0, 0x1CD3, 0x1CD4, 0x1CE1, 0x1CE2, 0x1CE9, 0x1CED, 0x1CEE, // 320 -0x1CF4, 0x1CF5, 0x1CF8, 0x1CFA, 0x1DC0, 0x1E00, 0x201C, 0x201D, // 328 -0x20AC, 0x20AD, 0x20D0, 0x20DD, 0x20E1, 0x20E2, 0x20E5, 0x20F1, // 336 -0x263A, 0x263B, 0x2C00, 0x2C01, 0x2CEF, 0x2CF2, 0x2D30, 0x2D31, // 344 -0x2D7F, 0x2D80, 0x2DE0, 0x2E00, 0x302A, 0x3030, 0x304B, 0x304C, // 352 -0x3099, 0x309B, 0x30AB, 0x30AC, 0x3105, 0x3106, 0x5B57, 0x5B58, // 360 -0xA288, 0xA289, 0xA4D0, 0xA4D1, 0xA549, 0xA54A, 0xA66F, 0xA670, // 368 -0xA674, 0xA67E, 0xA69E, 0xA6A1, 0xA6F0, 0xA6F2, 0xA800, 0xA801, // 376 -0xA806, 0xA807, 0xA82C, 0xA82D, 0xA840, 0xA841, 0xA882, 0xA883, // 384 -0xA8C4, 0xA8C5, 0xA8E0, 0xA8F2, 0xA90A, 0xA90B, 0xA92B, 0xA92E, // 392 -0xA930, 0xA931, 0xA953, 0xA954, 0xA984, 0xA985, 0xA9B3, 0xA9B4, // 400 -0xA9C0, 0xA9C1, 0xAA00, 0xAA01, 0xAA80, 0xAAB1, 0xAAB2, 0xAAB5, // 408 -0xAAB7, 0xAAB9, 0xAABE, 0xAAC0, 0xAAC1, 0xAAC2, 0xAAF6, 0xAAF7, // 416 -0xABC0, 0xABC1, 0xABED, 0xABEE, 0xAC00, 0xAC01, 0xD800, 0xD809, // 424 -0xD80B, 0xD80D, 0xD811, 0xD812, 0xD818, 0xD819, 0xD81A, 0xD81C, // 432 -0xD820, 0xD821, 0xD823, 0xD824, 0xD82C, 0xD82D, 0xD82F, 0xD830, // 440 -0xD834, 0xD835, 0xD838, 0xD83B, 0xDC00, 0xE000, 0xFB1E, 0xFB1F, // 448 +0x1A7F, 0x1A80, 0x1AB0, 0x1ABE, 0x1ABF, 0x1AF1, 0x1B05, 0x1B06, // 288 +0x1B34, 0x1B36, 0x1B44, 0x1B45, 0x1B6B, 0x1B74, 0x1B83, 0x1B84, // 296 +0x1BAA, 0x1BAC, 0x1BC0, 0x1BC1, 0x1BE6, 0x1BE7, 0x1BF2, 0x1BF4, // 304 +0x1C00, 0x1C01, 0x1C37, 0x1C38, 0x1C5A, 0x1C5B, 0x1CD0, 0x1CD3, // 312 +0x1CD4, 0x1CE1, 0x1CE2, 0x1CE9, 0x1CED, 0x1CEE, 0x1CF4, 0x1CF5, // 320 +0x1CF8, 0x1CFA, 0x1DC0, 0x1E00, 0x201C, 0x201D, 0x20AC, 0x20AD, // 328 +0x20D0, 0x20DD, 0x20E1, 0x20E2, 0x20E5, 0x20F1, 0x263A, 0x263B, // 336 +0x2C00, 0x2C01, 0x2CEF, 0x2CF2, 0x2D30, 0x2D31, 0x2D7F, 0x2D80, // 344 +0x2DE0, 0x2E00, 0x302A, 0x3030, 0x304B, 0x304C, 0x3099, 0x309B, // 352 +0x30AB, 0x30AC, 0x3105, 0x3106, 0x5B57, 0x5B58, 0xA288, 0xA289, // 360 +0xA4D0, 0xA4D1, 0xA549, 0xA54A, 0xA66F, 0xA670, 0xA674, 0xA67E, // 368 +0xA69E, 0xA6A1, 0xA6F0, 0xA6F2, 0xA800, 0xA801, 0xA806, 0xA807, // 376 +0xA82C, 0xA82D, 0xA840, 0xA841, 0xA882, 0xA883, 0xA8C4, 0xA8C5, // 384 +0xA8E0, 0xA8F2, 0xA90A, 0xA90B, 0xA92B, 0xA92E, 0xA930, 0xA931, // 392 +0xA953, 0xA954, 0xA984, 0xA985, 0xA9B3, 0xA9B4, 0xA9C0, 0xA9C1, // 400 +0xAA00, 0xAA01, 0xAA80, 0xAAB1, 0xAAB2, 0xAAB5, 0xAAB7, 0xAAB9, // 408 +0xAABE, 0xAAC0, 0xAAC1, 0xAAC2, 0xAAF6, 0xAAF7, 0xABC0, 0xABC1, // 416 +0xABED, 0xABEE, 0xAC00, 0xAC01, 0xD800, 0xD809, 0xD80B, 0xD80D, // 424 +0xD811, 0xD812, 0xD818, 0xD819, 0xD81A, 0xD81C, 0xD820, 0xD821, // 432 +0xD823, 0xD824, 0xD82C, 0xD82D, 0xD82F, 0xD830, 0xD834, 0xD835, // 440 +0xD838, 0xD83B, 0xD8BA, 0xD8BB, 0xDC00, 0xE000, 0xFB1E, 0xFB1F, // 448 0xFDD0, 0xFDD1, 0xFE20, 0xFE30, 0x0001, 0x0000, 0x0001, 0x0001, // 456 0x0001, 0x01FD, 0x0001, 0x01FE, 0x0001, 0x0280, 0x0001, 0x0281, // 464 0x0001, 0x02A0, 0x0001, 0x02A1, 0x0001, 0x02E0, 0x0001, 0x02E1, // 472 @@ -99,77 +99,82 @@ static const uint16_t unsafe_serializedData[1236] = { 0x0001, 0x0D12, 0x0001, 0x0D13, 0x0001, 0x0D24, 0x0001, 0x0D28, // 640 0x0001, 0x0D5D, 0x0001, 0x0D5E, 0x0001, 0x0D69, 0x0001, 0x0D6E, // 648 0x0001, 0x0E88, 0x0001, 0x0E89, 0x0001, 0x0EAB, 0x0001, 0x0EAD, // 656 -0x0001, 0x0EFA, 0x0001, 0x0EFC, 0x0001, 0x0EFD, 0x0001, 0x0F00, // 664 -0x0001, 0x0F19, 0x0001, 0x0F1A, 0x0001, 0x0F42, 0x0001, 0x0F43, // 672 -0x0001, 0x0F46, 0x0001, 0x0F51, 0x0001, 0x0F7C, 0x0001, 0x0F7D, // 680 -0x0001, 0x0F82, 0x0001, 0x0F86, 0x0001, 0x0FBF, 0x0001, 0x0FC0, // 688 -0x0001, 0x0FF1, 0x0001, 0x0FF2, 0x0001, 0x1005, 0x0001, 0x1006, // 696 -0x0001, 0x1046, 0x0001, 0x1047, 0x0001, 0x1070, 0x0001, 0x1071, // 704 -0x0001, 0x107F, 0x0001, 0x1080, 0x0001, 0x1083, 0x0001, 0x1084, // 712 -0x0001, 0x10B9, 0x0001, 0x10BB, 0x0001, 0x10D0, 0x0001, 0x10D1, // 720 -0x0001, 0x1100, 0x0001, 0x1104, 0x0001, 0x1127, 0x0001, 0x1128, // 728 -0x0001, 0x1133, 0x0001, 0x1135, 0x0001, 0x1152, 0x0001, 0x1153, // 736 -0x0001, 0x1173, 0x0001, 0x1174, 0x0001, 0x1183, 0x0001, 0x1184, // 744 -0x0001, 0x11C0, 0x0001, 0x11C1, 0x0001, 0x11CA, 0x0001, 0x11CB, // 752 -0x0001, 0x1208, 0x0001, 0x1209, 0x0001, 0x1235, 0x0001, 0x1237, // 760 -0x0001, 0x128F, 0x0001, 0x1290, 0x0001, 0x12BE, 0x0001, 0x12BF, // 768 -0x0001, 0x12E9, 0x0001, 0x12EB, 0x0001, 0x1315, 0x0001, 0x1316, // 776 -0x0001, 0x133B, 0x0001, 0x133D, 0x0001, 0x133E, 0x0001, 0x133F, // 784 -0x0001, 0x134D, 0x0001, 0x134E, 0x0001, 0x1357, 0x0001, 0x1358, // 792 -0x0001, 0x1366, 0x0001, 0x136D, 0x0001, 0x1370, 0x0001, 0x1375, // 800 -0x0001, 0x1392, 0x0001, 0x1393, 0x0001, 0x13B8, 0x0001, 0x13B9, // 808 -0x0001, 0x13BB, 0x0001, 0x13BC, 0x0001, 0x13C2, 0x0001, 0x13C3, // 816 -0x0001, 0x13C9, 0x0001, 0x13CA, 0x0001, 0x13CE, 0x0001, 0x13D1, // 824 -0x0001, 0x1412, 0x0001, 0x1413, 0x0001, 0x1442, 0x0001, 0x1443, // 832 -0x0001, 0x1446, 0x0001, 0x1447, 0x0001, 0x145E, 0x0001, 0x145F, // 840 -0x0001, 0x1484, 0x0001, 0x1485, 0x0001, 0x14B0, 0x0001, 0x14B1, // 848 -0x0001, 0x14BA, 0x0001, 0x14BB, 0x0001, 0x14BD, 0x0001, 0x14BE, // 856 -0x0001, 0x14C2, 0x0001, 0x14C4, 0x0001, 0x158E, 0x0001, 0x158F, // 864 -0x0001, 0x15AF, 0x0001, 0x15B0, 0x0001, 0x15BF, 0x0001, 0x15C1, // 872 -0x0001, 0x160E, 0x0001, 0x160F, 0x0001, 0x163F, 0x0001, 0x1640, // 880 -0x0001, 0x1680, 0x0001, 0x1681, 0x0001, 0x16B6, 0x0001, 0x16B8, // 888 -0x0001, 0x1717, 0x0001, 0x1718, 0x0001, 0x172B, 0x0001, 0x172C, // 896 -0x0001, 0x180B, 0x0001, 0x180C, 0x0001, 0x1839, 0x0001, 0x183B, // 904 -0x0001, 0x18B4, 0x0001, 0x18B5, 0x0001, 0x190C, 0x0001, 0x190D, // 912 -0x0001, 0x1930, 0x0001, 0x1931, 0x0001, 0x193D, 0x0001, 0x193F, // 920 -0x0001, 0x1943, 0x0001, 0x1944, 0x0001, 0x19CE, 0x0001, 0x19CF, // 928 -0x0001, 0x19E0, 0x0001, 0x19E1, 0x0001, 0x1A0B, 0x0001, 0x1A0C, // 936 -0x0001, 0x1A34, 0x0001, 0x1A35, 0x0001, 0x1A47, 0x0001, 0x1A48, // 944 -0x0001, 0x1A5C, 0x0001, 0x1A5D, 0x0001, 0x1A99, 0x0001, 0x1A9A, // 952 -0x0001, 0x1AC0, 0x0001, 0x1AC1, 0x0001, 0x1BC4, 0x0001, 0x1BC5, // 960 -0x0001, 0x1C0E, 0x0001, 0x1C0F, 0x0001, 0x1C3F, 0x0001, 0x1C40, // 968 -0x0001, 0x1C72, 0x0001, 0x1C73, 0x0001, 0x1D10, 0x0001, 0x1D11, // 976 -0x0001, 0x1D42, 0x0001, 0x1D43, 0x0001, 0x1D44, 0x0001, 0x1D46, // 984 -0x0001, 0x1D71, 0x0001, 0x1D72, 0x0001, 0x1D97, 0x0001, 0x1D98, // 992 -0x0001, 0x1DC6, 0x0001, 0x1DC7, 0x0001, 0x1EE5, 0x0001, 0x1EE6, // 1000 -0x0001, 0x1F1B, 0x0001, 0x1F1C, 0x0001, 0x1F41, 0x0001, 0x1F43, // 1008 -0x0001, 0x2000, 0x0001, 0x2001, 0x0001, 0x2FE5, 0x0001, 0x2FE6, // 1016 -0x0001, 0x3153, 0x0001, 0x3154, 0x0001, 0x4400, 0x0001, 0x4401, // 1024 -0x0001, 0x611C, 0x0001, 0x611D, 0x0001, 0x611E, 0x0001, 0x6121, // 1032 -0x0001, 0x6123, 0x0001, 0x6126, 0x0001, 0x6129, 0x0001, 0x612A, // 1040 -0x0001, 0x612F, 0x0001, 0x6130, 0x0001, 0x6A4F, 0x0001, 0x6A50, // 1048 -0x0001, 0x6ABC, 0x0001, 0x6ABD, 0x0001, 0x6AE6, 0x0001, 0x6AE7, // 1056 -0x0001, 0x6AF0, 0x0001, 0x6AF5, 0x0001, 0x6B1C, 0x0001, 0x6B1D, // 1064 -0x0001, 0x6B30, 0x0001, 0x6B37, 0x0001, 0x6D45, 0x0001, 0x6D46, // 1072 -0x0001, 0x6D67, 0x0001, 0x6D69, 0x0001, 0x6E40, 0x0001, 0x6E41, // 1080 -0x0001, 0x6EA1, 0x0001, 0x6EA2, 0x0001, 0x6F00, 0x0001, 0x6F01, // 1088 -0x0001, 0x6FF0, 0x0001, 0x6FF2, 0x0001, 0x8229, 0x0001, 0x822A, // 1096 -0x0001, 0x8C65, 0x0001, 0x8C66, 0x0001, 0xB1C4, 0x0001, 0xB1C5, // 1104 -0x0001, 0xBC20, 0x0001, 0xBC21, 0x0001, 0xBC9E, 0x0001, 0xBC9F, // 1112 -0x0001, 0xD165, 0x0001, 0xD16A, 0x0001, 0xD16D, 0x0001, 0xD173, // 1120 -0x0001, 0xD17B, 0x0001, 0xD183, 0x0001, 0xD185, 0x0001, 0xD18C, // 1128 -0x0001, 0xD1AA, 0x0001, 0xD1AE, 0x0001, 0xD242, 0x0001, 0xD245, // 1136 -0x0001, 0xE000, 0x0001, 0xE007, 0x0001, 0xE008, 0x0001, 0xE019, // 1144 -0x0001, 0xE01B, 0x0001, 0xE022, 0x0001, 0xE023, 0x0001, 0xE025, // 1152 -0x0001, 0xE026, 0x0001, 0xE02B, 0x0001, 0xE08F, 0x0001, 0xE090, // 1160 -0x0001, 0xE108, 0x0001, 0xE109, 0x0001, 0xE130, 0x0001, 0xE137, // 1168 -0x0001, 0xE290, 0x0001, 0xE291, 0x0001, 0xE2AE, 0x0001, 0xE2AF, // 1176 -0x0001, 0xE2E1, 0x0001, 0xE2E2, 0x0001, 0xE2EC, 0x0001, 0xE2F0, // 1184 -0x0001, 0xE4E6, 0x0001, 0xE4E7, 0x0001, 0xE4EC, 0x0001, 0xE4F0, // 1192 -0x0001, 0xE5D0, 0x0001, 0xE5D1, 0x0001, 0xE5EE, 0x0001, 0xE5F0, // 1200 -0x0001, 0xE6D5, 0x0001, 0xE6D6, 0x0001, 0xE6E3, 0x0001, 0xE6E4, // 1208 -0x0001, 0xE6E6, 0x0001, 0xE6E7, 0x0001, 0xE6EE, 0x0001, 0xE6F0, // 1216 -0x0001, 0xE6F5, 0x0001, 0xE6F6, 0x0001, 0xE802, 0x0001, 0xE803, // 1224 -0x0001, 0xE8D0, 0x0001, 0xE8D7, 0x0001, 0xE909, 0x0001, 0xE90A, // 1232 -0x0001, 0xE944, 0x0001, 0xE94B}; +0x0001, 0x0ECB, 0x0001, 0x0ED0, 0x0001, 0x0EF0, 0x0001, 0x0EFC, // 664 +0x0001, 0x0EFD, 0x0001, 0x0F00, 0x0001, 0x0F19, 0x0001, 0x0F1A, // 672 +0x0001, 0x0F42, 0x0001, 0x0F43, 0x0001, 0x0F46, 0x0001, 0x0F51, // 680 +0x0001, 0x0F7C, 0x0001, 0x0F7D, 0x0001, 0x0F82, 0x0001, 0x0F86, // 688 +0x0001, 0x0FBF, 0x0001, 0x0FC0, 0x0001, 0x0FF1, 0x0001, 0x0FF2, // 696 +0x0001, 0x1005, 0x0001, 0x1006, 0x0001, 0x1046, 0x0001, 0x1047, // 704 +0x0001, 0x1070, 0x0001, 0x1071, 0x0001, 0x107F, 0x0001, 0x1080, // 712 +0x0001, 0x1083, 0x0001, 0x1084, 0x0001, 0x10B9, 0x0001, 0x10BB, // 720 +0x0001, 0x10D0, 0x0001, 0x10D1, 0x0001, 0x1100, 0x0001, 0x1104, // 728 +0x0001, 0x1127, 0x0001, 0x1128, 0x0001, 0x1133, 0x0001, 0x1135, // 736 +0x0001, 0x1152, 0x0001, 0x1153, 0x0001, 0x1173, 0x0001, 0x1174, // 744 +0x0001, 0x1183, 0x0001, 0x1184, 0x0001, 0x11C0, 0x0001, 0x11C1, // 752 +0x0001, 0x11CA, 0x0001, 0x11CB, 0x0001, 0x1208, 0x0001, 0x1209, // 760 +0x0001, 0x1235, 0x0001, 0x1237, 0x0001, 0x128F, 0x0001, 0x1290, // 768 +0x0001, 0x12BE, 0x0001, 0x12BF, 0x0001, 0x12E9, 0x0001, 0x12EB, // 776 +0x0001, 0x1315, 0x0001, 0x1316, 0x0001, 0x133B, 0x0001, 0x133D, // 784 +0x0001, 0x133E, 0x0001, 0x133F, 0x0001, 0x134D, 0x0001, 0x134E, // 792 +0x0001, 0x1357, 0x0001, 0x1358, 0x0001, 0x1366, 0x0001, 0x136D, // 800 +0x0001, 0x1370, 0x0001, 0x1375, 0x0001, 0x1392, 0x0001, 0x1393, // 808 +0x0001, 0x13B8, 0x0001, 0x13B9, 0x0001, 0x13BB, 0x0001, 0x13BC, // 816 +0x0001, 0x13C2, 0x0001, 0x13C3, 0x0001, 0x13C9, 0x0001, 0x13CA, // 824 +0x0001, 0x13CE, 0x0001, 0x13D1, 0x0001, 0x1412, 0x0001, 0x1413, // 832 +0x0001, 0x1442, 0x0001, 0x1443, 0x0001, 0x1446, 0x0001, 0x1447, // 840 +0x0001, 0x145E, 0x0001, 0x145F, 0x0001, 0x1484, 0x0001, 0x1485, // 848 +0x0001, 0x14B0, 0x0001, 0x14B1, 0x0001, 0x14BA, 0x0001, 0x14BB, // 856 +0x0001, 0x14BD, 0x0001, 0x14BE, 0x0001, 0x14C2, 0x0001, 0x14C4, // 864 +0x0001, 0x158E, 0x0001, 0x158F, 0x0001, 0x15AF, 0x0001, 0x15B0, // 872 +0x0001, 0x15BF, 0x0001, 0x15C1, 0x0001, 0x160E, 0x0001, 0x160F, // 880 +0x0001, 0x163F, 0x0001, 0x1640, 0x0001, 0x1680, 0x0001, 0x1681, // 888 +0x0001, 0x16B6, 0x0001, 0x16B8, 0x0001, 0x1717, 0x0001, 0x1718, // 896 +0x0001, 0x172B, 0x0001, 0x172C, 0x0001, 0x180B, 0x0001, 0x180C, // 904 +0x0001, 0x1839, 0x0001, 0x183B, 0x0001, 0x18B4, 0x0001, 0x18B5, // 912 +0x0001, 0x190C, 0x0001, 0x190D, 0x0001, 0x1930, 0x0001, 0x1931, // 920 +0x0001, 0x193D, 0x0001, 0x193F, 0x0001, 0x1943, 0x0001, 0x1944, // 928 +0x0001, 0x19CE, 0x0001, 0x19CF, 0x0001, 0x19E0, 0x0001, 0x19E1, // 936 +0x0001, 0x1A0B, 0x0001, 0x1A0C, 0x0001, 0x1A34, 0x0001, 0x1A35, // 944 +0x0001, 0x1A47, 0x0001, 0x1A48, 0x0001, 0x1A5C, 0x0001, 0x1A5D, // 952 +0x0001, 0x1A99, 0x0001, 0x1A9A, 0x0001, 0x1AC0, 0x0001, 0x1AC1, // 960 +0x0001, 0x1BC4, 0x0001, 0x1BC5, 0x0001, 0x1C0E, 0x0001, 0x1C0F, // 968 +0x0001, 0x1C3F, 0x0001, 0x1C40, 0x0001, 0x1C72, 0x0001, 0x1C73, // 976 +0x0001, 0x1D10, 0x0001, 0x1D11, 0x0001, 0x1D42, 0x0001, 0x1D43, // 984 +0x0001, 0x1D44, 0x0001, 0x1D46, 0x0001, 0x1D71, 0x0001, 0x1D72, // 992 +0x0001, 0x1D97, 0x0001, 0x1D98, 0x0001, 0x1DC6, 0x0001, 0x1DC7, // 1000 +0x0001, 0x1EE5, 0x0001, 0x1EE6, 0x0001, 0x1F1B, 0x0001, 0x1F1C, // 1008 +0x0001, 0x1F41, 0x0001, 0x1F43, 0x0001, 0x2000, 0x0001, 0x2001, // 1016 +0x0001, 0x2FE5, 0x0001, 0x2FE6, 0x0001, 0x3153, 0x0001, 0x3154, // 1024 +0x0001, 0x4400, 0x0001, 0x4401, 0x0001, 0x611C, 0x0001, 0x611D, // 1032 +0x0001, 0x611E, 0x0001, 0x6121, 0x0001, 0x6123, 0x0001, 0x6126, // 1040 +0x0001, 0x6129, 0x0001, 0x612A, 0x0001, 0x612F, 0x0001, 0x6130, // 1048 +0x0001, 0x6A4F, 0x0001, 0x6A50, 0x0001, 0x6ABC, 0x0001, 0x6ABD, // 1056 +0x0001, 0x6AE6, 0x0001, 0x6AE7, 0x0001, 0x6AF0, 0x0001, 0x6AF5, // 1064 +0x0001, 0x6B1C, 0x0001, 0x6B1D, 0x0001, 0x6B30, 0x0001, 0x6B37, // 1072 +0x0001, 0x6D45, 0x0001, 0x6D46, 0x0001, 0x6D67, 0x0001, 0x6D69, // 1080 +0x0001, 0x6D93, 0x0001, 0x6D94, 0x0001, 0x6D9D, 0x0001, 0x6D9E, // 1088 +0x0001, 0x6E40, 0x0001, 0x6E41, 0x0001, 0x6EA1, 0x0001, 0x6EA2, // 1096 +0x0001, 0x6F00, 0x0001, 0x6F01, 0x0001, 0x6FF0, 0x0001, 0x6FF2, // 1104 +0x0001, 0x8229, 0x0001, 0x822A, 0x0001, 0x8C65, 0x0001, 0x8C66, // 1112 +0x0001, 0x8F1A, 0x0001, 0x8F1B, 0x0001, 0xB1C4, 0x0001, 0xB1C5, // 1120 +0x0001, 0xBC20, 0x0001, 0xBC21, 0x0001, 0xBC9E, 0x0001, 0xBC9F, // 1128 +0x0001, 0xD127, 0x0001, 0xD129, 0x0001, 0xD165, 0x0001, 0xD16A, // 1136 +0x0001, 0xD16D, 0x0001, 0xD173, 0x0001, 0xD17B, 0x0001, 0xD183, // 1144 +0x0001, 0xD185, 0x0001, 0xD18C, 0x0001, 0xD1AA, 0x0001, 0xD1AE, // 1152 +0x0001, 0xD242, 0x0001, 0xD245, 0x0001, 0xD250, 0x0001, 0xD253, // 1160 +0x0001, 0xD25B, 0x0001, 0xD25D, 0x0001, 0xD25F, 0x0001, 0xD260, // 1168 +0x0001, 0xD280, 0x0001, 0xD282, 0x0001, 0xE000, 0x0001, 0xE007, // 1176 +0x0001, 0xE008, 0x0001, 0xE019, 0x0001, 0xE01B, 0x0001, 0xE022, // 1184 +0x0001, 0xE023, 0x0001, 0xE025, 0x0001, 0xE026, 0x0001, 0xE02B, // 1192 +0x0001, 0xE08F, 0x0001, 0xE090, 0x0001, 0xE108, 0x0001, 0xE109, // 1200 +0x0001, 0xE130, 0x0001, 0xE137, 0x0001, 0xE290, 0x0001, 0xE291, // 1208 +0x0001, 0xE2AE, 0x0001, 0xE2AF, 0x0001, 0xE2E1, 0x0001, 0xE2E2, // 1216 +0x0001, 0xE2EC, 0x0001, 0xE2F0, 0x0001, 0xE4E6, 0x0001, 0xE4E7, // 1224 +0x0001, 0xE4EC, 0x0001, 0xE4F0, 0x0001, 0xE5D0, 0x0001, 0xE5D1, // 1232 +0x0001, 0xE5EE, 0x0001, 0xE5F0, 0x0001, 0xE6D5, 0x0001, 0xE6D6, // 1240 +0x0001, 0xE6E3, 0x0001, 0xE6E4, 0x0001, 0xE6E6, 0x0001, 0xE6E7, // 1248 +0x0001, 0xE6EE, 0x0001, 0xE6F0, 0x0001, 0xE6F5, 0x0001, 0xE6F6, // 1256 +0x0001, 0xE802, 0x0001, 0xE803, 0x0001, 0xE8D0, 0x0001, 0xE8D7, // 1264 +0x0001, 0xE909, 0x0001, 0xE90A, 0x0001, 0xE944, 0x0001, 0xE94B, // 1272 +0x0003, 0xEA10, 0x0003, 0xEA11}; #endif diff --git a/deps/icu-small/source/i18n/csdetect.cpp b/deps/icu-small/source/i18n/csdetect.cpp index cedc3c063490..340dec4989d5 100644 --- a/deps/icu-small/source/i18n/csdetect.cpp +++ b/deps/icu-small/source/i18n/csdetect.cpp @@ -213,9 +213,9 @@ UBool CharsetDetector::getStripTagsFlag() const return fStripTags; } -void CharsetDetector::setDeclaredEncoding(const char *encoding, int32_t len) const +void CharsetDetector::setDeclaredEncoding(const char *encoding, int32_t len, UErrorCode &status) const { - textIn->setDeclaredEncoding(encoding,len); + textIn->setDeclaredEncoding(encoding,len, status); } int32_t CharsetDetector::getDetectableCount() diff --git a/deps/icu-small/source/i18n/csdetect.h b/deps/icu-small/source/i18n/csdetect.h index d4bfa75eef25..acd872f7ad07 100644 --- a/deps/icu-small/source/i18n/csdetect.h +++ b/deps/icu-small/source/i18n/csdetect.h @@ -47,7 +47,7 @@ class CharsetDetector : public UMemory const CharsetMatch *detect(UErrorCode& status); - void setDeclaredEncoding(const char *encoding, int32_t len) const; + void setDeclaredEncoding(const char *encoding, int32_t len, UErrorCode &status) const; UBool setStripTagsFlag(UBool flag); diff --git a/deps/icu-small/source/i18n/curramt.cpp b/deps/icu-small/source/i18n/curramt.cpp index 43c3e9c151a2..f6e22fa71ca8 100644 --- a/deps/icu-small/source/i18n/curramt.cpp +++ b/deps/icu-small/source/i18n/curramt.cpp @@ -33,7 +33,7 @@ CurrencyAmount::CurrencyAmount(const CurrencyAmount& other) : Measure(other) { } -CurrencyAmount& CurrencyAmount::operator=(const CurrencyAmount& other) { +CurrencyAmount& CurrencyAmount::operator=(const CurrencyAmount& other) U_LIFETIME_BOUND { Measure::operator=(other); return *this; } @@ -45,7 +45,7 @@ CurrencyAmount* CurrencyAmount::clone() const { CurrencyAmount::~CurrencyAmount() { } -const CurrencyUnit& CurrencyAmount::getCurrency() const { +const CurrencyUnit& CurrencyAmount::getCurrency() const U_LIFETIME_BOUND { return static_cast(getUnit()); } diff --git a/deps/icu-small/source/i18n/currunit.cpp b/deps/icu-small/source/i18n/currunit.cpp index 98f28365cfc8..9ee059edfdf2 100644 --- a/deps/icu-small/source/i18n/currunit.cpp +++ b/deps/icu-small/source/i18n/currunit.cpp @@ -103,7 +103,7 @@ CurrencyUnit::CurrencyUnit() : MeasureUnit() { initCurrency(simpleIsoCode); } -CurrencyUnit& CurrencyUnit::operator=(const CurrencyUnit& other) { +CurrencyUnit& CurrencyUnit::operator=(const CurrencyUnit& other) U_LIFETIME_BOUND { if (this == &other) { return *this; } diff --git a/deps/icu-small/source/i18n/datefmt.cpp b/deps/icu-small/source/i18n/datefmt.cpp index de9efc7ca8f9..5f53c027bcd7 100644 --- a/deps/icu-small/source/i18n/datefmt.cpp +++ b/deps/icu-small/source/i18n/datefmt.cpp @@ -19,6 +19,8 @@ ******************************************************************************** */ +#include + #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING @@ -40,7 +42,7 @@ #if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) #include #endif -#include + // ***************************************************************************** // class DateFormat @@ -421,17 +423,37 @@ DateFormat::createDateInstance(DateFormat::EStyle style, } //---------------------------------------------------------------------- +namespace { + +UBool isValidStyle(int32_t style) { + return (style >= DateFormat::kFull && style <= DateFormat::kShort) || + (style >= DateFormat::kFullRelative && style <= DateFormat::kShortRelative); +} +UBool isValidTimeStyle(int32_t style) { + return (style >= DateFormat::kFull && style <= DateFormat::kShort); +} + +} // namespace DateFormat* U_EXPORT2 DateFormat::createDateTimeInstance(EStyle dateStyle, EStyle timeStyle, - const Locale& aLocale) + const Locale& aLocale) UPRV_NO_SANITIZE_UNDEFINED { - if(dateStyle != kNone) + int32_t dateStyleInt = dateStyle; + int32_t timeStyleInt = timeStyle; + + if (dateStyleInt != kNone && !isValidStyle(dateStyleInt)) { + return nullptr; + } + if (timeStyleInt != kNone && !isValidTimeStyle(timeStyleInt)) { + return nullptr; + } + if(dateStyleInt != kNone) { - dateStyle = static_cast(dateStyle + kDateOffset); + dateStyleInt = dateStyleInt + kDateOffset; } - return create(timeStyle, dateStyle, aLocale); + return create(timeStyle, static_cast(dateStyleInt), aLocale); } //---------------------------------------------------------------------- diff --git a/deps/icu-small/source/i18n/dayperiodrules.cpp b/deps/icu-small/source/i18n/dayperiodrules.cpp index ea5e51eb9d51..8a73962c33ea 100644 --- a/deps/icu-small/source/i18n/dayperiodrules.cpp +++ b/deps/icu-small/source/i18n/dayperiodrules.cpp @@ -360,12 +360,16 @@ const DayPeriodRules *DayPeriodRules::getInstance(const Locale &locale, UErrorCo while (*name != '\0') { ruleSetNum = uhash_geti(data->localeToRuleSetNumMap, name); if (ruleSetNum == 0) { - CharString parent = ulocimp_getParent(name, errorCode); - if (parent.isEmpty()) { - // Saves a lookup in the hash table. - break; + if (uprv_strcmp(name, "root") == 0) { + name[0] = '\0'; + } else { + CharString parent = ulocimp_getParent(name, errorCode); + if (parent.isEmpty()) { + uprv_strcpy(name, "root"); + } else { + parent.extract(name, UPRV_LENGTHOF(name), errorCode); + } } - parent.extract(name, UPRV_LENGTHOF(name), errorCode); } else { break; } diff --git a/deps/icu-small/source/i18n/dcfmtsym.cpp b/deps/icu-small/source/i18n/dcfmtsym.cpp index b82a9587328c..847860da44cb 100644 --- a/deps/icu-small/source/i18n/dcfmtsym.cpp +++ b/deps/icu-small/source/i18n/dcfmtsym.cpp @@ -557,6 +557,10 @@ void DecimalFormatSymbols::setCurrency(const char16_t* currency, UErrorCode& sta fSymbols[kMonetaryGroupingSeparatorSymbol] = groupingSep; fSymbols[kMonetarySeparatorSymbol] = decimalSep; //pattern.setTo(true, currPattern, currPatternLen); + } else { + // TODO: At this point we should reset the pattern and the separators to the + // locale default, in case the previous currency overrode them. This requires + // either reopening the resource bundle or caching the symbols. } } /* else An explicit currency was requested and is unknown or locale data is malformed. */ diff --git a/deps/icu-small/source/i18n/double-conversion-double-to-string.cpp b/deps/icu-small/source/i18n/double-conversion-double-to-string.cpp index 938484bca851..c150d5bdcb65 100644 --- a/deps/icu-small/source/i18n/double-conversion-double-to-string.cpp +++ b/deps/icu-small/source/i18n/double-conversion-double-to-string.cpp @@ -195,7 +195,7 @@ bool DoubleToStringConverter::ToShortestIeeeNumber( return HandleSpecialValues(value, result_builder); } - int decimal_point; + int decimal_point = 0; bool sign; const int kDecimalRepCapacity = kBase10MaximalLength + 1; char decimal_rep[kDecimalRepCapacity]; @@ -421,6 +421,7 @@ void DoubleToStringConverter::DoubleToAscii(double v, if (mode == PRECISION && requested_digits == 0) { vector[0] = '\0'; *length = 0; + *point = 0; return; } diff --git a/deps/icu-small/source/i18n/double-conversion-double-to-string.h b/deps/icu-small/source/i18n/double-conversion-double-to-string.h index b8cb06a8b2ce..f15e07273ed0 100644 --- a/deps/icu-small/source/i18n/double-conversion-double-to-string.h +++ b/deps/icu-small/source/i18n/double-conversion-double-to-string.h @@ -252,11 +252,24 @@ class DoubleToStringConverter { // kBase10MaximalLength significant digits). // "-1.7976931348623157e+308", "-1.7976931348623157E308" // In addition, the buffer must be able to hold the trailing '\0' character. + // + // Since the algorithm finds the shortest number of significant digits, it + // can produce an output that isn't the shortest possible if the + // decimal_in_shortest_high is high enough. For example, the number + // 1e23 could be written as 99999999999999991611392 with 23 + // digits, however, it only needs one significant digit 1, and thus the + // result is 100000000000000000000000, which has 24 digits. bool ToShortest(double value, StringBuilder* result_builder) const { return ToShortestIeeeNumber(value, result_builder, SHORTEST); } // Same as ToShortest, but for single-precision floats. + // + // Since the algorithm finds the shortest number of significant digits, it + // can, in very rare cases, produce an output that isn't the shortest possible. + // For example, the number 1e11f could be written as 99999997952 with 11 + // digits, however, it only needs one significant digit 1, and thus the + // result is 100000000000, which has 12 digits. bool ToShortestSingle(float value, StringBuilder* result_builder) const { return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE); } diff --git a/deps/icu-small/source/i18n/dtfmtsym.cpp b/deps/icu-small/source/i18n/dtfmtsym.cpp index 8d1427f6e960..350f3657fc6b 100644 --- a/deps/icu-small/source/i18n/dtfmtsym.cpp +++ b/deps/icu-small/source/i18n/dtfmtsym.cpp @@ -52,6 +52,7 @@ #include "shareddateformatsymbols.h" #include "unicode/calendar.h" #include "unifiedcache.h" +#include "standardplural.h" // ***************************************************************************** // class DateFormatSymbols @@ -257,6 +258,7 @@ static const char gNumberElementsTag[]="NumberElements"; static const char gSymbolsTag[]="symbols"; static const char gTimeSeparatorTag[]="timeSeparator"; static const char gDayPeriodTag[]="dayPeriod"; +static const char gDayOfMonthNamesTag[]="dayOfMonthNames"; // static const char gZoneStringsTag[]="zoneStrings"; @@ -443,6 +445,13 @@ DateFormatSymbols::copyData(const DateFormatSymbols& other) { other.fStandaloneNarrowDayPeriods, other.fStandaloneNarrowDayPeriodsCount); assignArray(fStandaloneAbbreviatedDayPeriods, fStandaloneAbbreviatedDayPeriodsCount, other.fStandaloneAbbreviatedDayPeriods, other.fStandaloneAbbreviatedDayPeriodsCount); + { + int32_t unusedCount = 0; + int32_t srcCount = other.fDayOfMonthOrdinalNames != nullptr ? StandardPlural::COUNT : 0; + assignArray(fDayOfMonthOrdinalNames, unusedCount, other.fDayOfMonthOrdinalNames, srcCount); + } + assignArray(fDayOfMonthCardinalNames, fDayOfMonthCardinalNamesCount, + other.fDayOfMonthCardinalNames, other.fDayOfMonthCardinalNamesCount); if (other.fLeapMonthPatterns != nullptr) { assignArray(fLeapMonthPatterns, fLeapMonthPatternsCount, other.fLeapMonthPatterns, other.fLeapMonthPatternsCount); } else { @@ -536,6 +545,8 @@ void DateFormatSymbols::dispose() delete[] fStandaloneAbbreviatedDayPeriods; delete[] fStandaloneWideDayPeriods; delete[] fStandaloneNarrowDayPeriods; + delete[] fDayOfMonthOrdinalNames; + delete[] fDayOfMonthCardinalNames; actualLocale = Locale::getRoot(); validLocale = Locale::getRoot(); @@ -619,6 +630,8 @@ DateFormatSymbols::operator==(const DateFormatSymbols& other) const fStandaloneAbbreviatedDayPeriodsCount == other.fStandaloneAbbreviatedDayPeriodsCount && fStandaloneWideDayPeriodsCount == other.fStandaloneWideDayPeriodsCount && fStandaloneNarrowDayPeriodsCount == other.fStandaloneNarrowDayPeriodsCount && + (fDayOfMonthOrdinalNames == nullptr) == (other.fDayOfMonthOrdinalNames == nullptr) && + fDayOfMonthCardinalNamesCount == other.fDayOfMonthCardinalNamesCount && (uprv_memcmp(fCapitalization, other.fCapitalization, sizeof(fCapitalization))==0)) { // Now compare the arrays themselves @@ -660,7 +673,12 @@ DateFormatSymbols::operator==(const DateFormatSymbols& other) const arrayCompare(fStandaloneWideDayPeriods, other.fStandaloneWideDayPeriods, fStandaloneWideDayPeriodsCount) && arrayCompare(fStandaloneNarrowDayPeriods, other.fStandaloneNarrowDayPeriods, - fStandaloneWideDayPeriodsCount)) + fStandaloneWideDayPeriodsCount) + && arrayCompare(fDayOfMonthOrdinalNames, other.fDayOfMonthOrdinalNames, + fDayOfMonthOrdinalNames != nullptr ? StandardPlural::COUNT : 0) + && arrayCompare(fDayOfMonthCardinalNames, other.fDayOfMonthCardinalNames, + fDayOfMonthCardinalNamesCount) + ) { // Compare the contents of fZoneStrings if (fZoneStrings == nullptr && other.fZoneStrings == nullptr) { @@ -1298,6 +1316,20 @@ DateFormatSymbols::setAmPmStrings(const UnicodeString* amPmsArray, int32_t count *targetCount = count; } +const UnicodeString* +DateFormatSymbols::getDayOfMonthOrdinalNames(DtContextType /*context*/, + DtWidthType /*width*/) const { + return fDayOfMonthOrdinalNames; +} + +const UnicodeString* +DateFormatSymbols::getDayOfMonthCardinalNames(int32_t& count, + DtContextType /*context*/, + DtWidthType /*width*/) const { + count = fDayOfMonthCardinalNamesCount; + return fDayOfMonthCardinalNames; +} + void DateFormatSymbols::setTimeSeparatorString(const UnicodeString& newTimeSeparator) { @@ -1668,7 +1700,9 @@ struct CalendarDataSink : public ResourceSink { || uprv_strcmp(key, gQuartersTag) == 0 || uprv_strcmp(key, gDayPeriodTag) == 0 || uprv_strcmp(key, gMonthPatternsTag) == 0 - || uprv_strcmp(key, gCyclicNameSetsTag) == 0) { + || uprv_strcmp(key, gCyclicNameSetsTag) == 0 + || uprv_strcmp(key, gDayOfMonthNamesTag) == 0 + ) { processResource(keyUString, key, value, errorCode); } } @@ -1896,6 +1930,31 @@ CalendarDataSink::~CalendarDataSink() { } //------------------------------------------------------ +static CharString +&buildResourcePath(CharString &path, const char* segment1, UErrorCode &errorCode) { + return path.clear().append(segment1, -1, errorCode); +} + +static CharString +&buildResourcePath(CharString &path, const char* segment1, const char* segment2, + UErrorCode &errorCode) { + return buildResourcePath(path, segment1, errorCode).append('/', errorCode) + .append(segment2, -1, errorCode); +} + +static CharString +&buildResourcePath(CharString &path, const char* segment1, const char* segment2, + const char* segment3, UErrorCode &errorCode) { + return buildResourcePath(path, segment1, segment2, errorCode).append('/', errorCode) + .append(segment3, -1, errorCode); +} + +static CharString +&buildResourcePath(CharString &path, const char* segment1, const char* segment2, + const char* segment3, const char* segment4, UErrorCode &errorCode) { + return buildResourcePath(path, segment1, segment2, segment3, errorCode).append('/', errorCode) + .append(segment4, -1, errorCode); +} static void initField(UnicodeString **field, int32_t& length, const char16_t *data, LastResortSize numStr, LastResortSize strLen, UErrorCode &status) { @@ -1957,48 +2016,77 @@ initField(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharSt } static void -initEras(UnicodeString **field, int32_t& length, CalendarDataSink &sink, CharString &key, const UResourceBundle *ctebPtr, const char* eraWidth, int32_t maxEra, UErrorCode &status) { - if (U_SUCCESS(status)) { - length = 0; - UnicodeString keyUString(key.data(), -1, US_INV); - Hashtable *eraNamesTable = static_cast(sink.maps.get(keyUString)); +loadEraNames(UnicodeString *eras, int32_t length, Hashtable *eraNamesTable, UResourceBundle *calBaseBundle, + const char *eraWidth, const EraRules *eraRules, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + int32_t maxEra = eraRules->getMaxEraCode(); + U_ASSERT(maxEra < length); + const char *calType = eraRules->getCalendarType(); - if (eraNamesTable != nullptr) { - UErrorCode resStatus = U_ZERO_ERROR; - LocalUResourceBundlePointer ctewb(ures_getByKeyWithFallback(ctebPtr, eraWidth, nullptr, &resStatus)); - const UResourceBundle *ctewbPtr = (U_SUCCESS(resStatus))? ctewb.getAlias() : nullptr; - *field = new UnicodeString[maxEra + 1]; - if (*field == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } - length = maxEra + 1; - for (int32_t eraCode = 0; eraCode <= maxEra; eraCode++) { - char eraCodeStr[12]; // T_CString_integerToString is documented to generate at most 12 bytes including nul terminator - int32_t eraCodeStrLen = T_CString_integerToString(eraCodeStr, eraCode, 10); - UnicodeString eraCodeKey = UnicodeString(eraCodeStr, eraCodeStrLen, US_INV); - UnicodeString *eraName = static_cast(eraNamesTable->get(eraCodeKey)); - (*field)[eraCode].remove(); - if (eraName != nullptr) { - // Get eraName from map (created by CalendarSink) - (*field)[eraCode].fastCopyFrom(*eraName); - } else if (ctewbPtr != nullptr) { - // Try filling in missing items from parent locale(s) - resStatus = U_ZERO_ERROR; - LocalUResourceBundlePointer ctewkb(ures_getByKeyWithFallback(ctewbPtr, eraCodeStr, nullptr, &resStatus)); - if (U_SUCCESS(resStatus)) { - int32_t eraNameLen; - const UChar* eraNamePtr = ures_getString(ctewkb.getAlias(), &eraNameLen, &resStatus); - if (U_SUCCESS(resStatus)) { - (*field)[eraCode].setTo(false, eraNamePtr, eraNameLen); - } - } + UErrorCode resStatus = U_ZERO_ERROR; + LocalUResourceBundlePointer ctb(ures_getByKeyWithFallback(calBaseBundle, calType, nullptr, &resStatus)); + LocalUResourceBundlePointer cteb(ures_getByKeyWithFallback(ctb.getAlias(), gErasTag, nullptr, &resStatus)); + LocalUResourceBundlePointer ctewb(ures_getByKeyWithFallback(cteb.getAlias(), eraWidth, nullptr, &resStatus)); + const UResourceBundle *ctewbPtr = (U_SUCCESS(resStatus))? ctewb.getAlias() : nullptr; + + for (int32_t eraCode = 0; eraCode <= maxEra; eraCode++) { + char eraCodeStr[12]; // T_CString_integerToString is documented to generate at most 12 bytes including nul terminator + int32_t eraCodeStrLen = T_CString_integerToString(eraCodeStr, eraCode, 10); + UnicodeString eraCodeKey = UnicodeString(eraCodeStr, eraCodeStrLen, US_INV); + UnicodeString *eraName = static_cast(eraNamesTable->get(eraCodeKey)); + eras[eraCode].remove(); + if (eraName != nullptr) { + // Get eraName from map (created by CalendarSink) + eras[eraCode].fastCopyFrom(*eraName); + } else if (ctewbPtr != nullptr) { + // Try filling in missing items from parent locale(s) + resStatus = U_ZERO_ERROR; + LocalUResourceBundlePointer ctewkb(ures_getByKeyWithFallback(ctewbPtr, eraCodeStr, nullptr, &resStatus)); + if (U_SUCCESS(resStatus)) { + int32_t eraNameLen; + const UChar* eraNamePtr = ures_getString(ctewkb.getAlias(), &eraNameLen, &resStatus); + if (U_SUCCESS(resStatus)) { + eras[eraCode].setTo(false, eraNamePtr, eraNameLen); } } - return; } + } + + // Also load era names from resource corresponding to the inherited era rules if any. + const EraRules *inheritEraRules = eraRules->getInheritEraRules(); + if (inheritEraRules != nullptr) { + loadEraNames(eras, length, eraNamesTable, calBaseBundle, eraWidth, inheritEraRules, status); + } +} + +static void initEras(UnicodeString **field, int32_t& length, CalendarDataSink &sink, UResourceBundle *calBaseBundle, + const char *eraWidth, EraRules *eraRules, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + CharString key; + buildResourcePath(key, gErasTag, eraWidth, status); + if (U_FAILURE(status)) { + return; + } + UnicodeString keyUString(key.data(), -1, US_INV); + Hashtable *eraNamesTable = static_cast(sink.maps.get(keyUString)); + if (eraNamesTable == nullptr) { status = U_MISSING_RESOURCE_ERROR; + return; + } + + // Note: maxEra value should be from the primary EraRules. + int32_t maxEra = eraRules->getMaxEraCode(); + *field = new UnicodeString[maxEra + 1]; + if (*field == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; } + length = maxEra + 1; + loadEraNames(*field, length, eraNamesTable, calBaseBundle, eraWidth, eraRules, status); } static void @@ -2021,32 +2109,6 @@ initLeapMonthPattern(UnicodeString *field, int32_t index, CalendarDataSink &sink } } -static CharString -&buildResourcePath(CharString &path, const char* segment1, UErrorCode &errorCode) { - return path.clear().append(segment1, -1, errorCode); -} - -static CharString -&buildResourcePath(CharString &path, const char* segment1, const char* segment2, - UErrorCode &errorCode) { - return buildResourcePath(path, segment1, errorCode).append('/', errorCode) - .append(segment2, -1, errorCode); -} - -static CharString -&buildResourcePath(CharString &path, const char* segment1, const char* segment2, - const char* segment3, UErrorCode &errorCode) { - return buildResourcePath(path, segment1, segment2, errorCode).append('/', errorCode) - .append(segment3, -1, errorCode); -} - -static CharString -&buildResourcePath(CharString &path, const char* segment1, const char* segment2, - const char* segment3, const char* segment4, UErrorCode &errorCode) { - return buildResourcePath(path, segment1, segment2, segment3, errorCode).append('/', errorCode) - .append(segment4, -1, errorCode); -} - typedef struct { const char * usageTypeName; DateFormatSymbols::ECapitalizationContextUsageType usageTypeEnumValue; @@ -2109,6 +2171,56 @@ UnicodeString* loadDayPeriodStrings(CalendarDataSink &sink, CharString &path, return strings; } +static const int32_t kDayOfMonthCardinalNamesCount = 33; // indices 1-32; index 0 unused + +static void loadDayOfMonthNames(CalendarDataSink &sink, CharString &path, + UnicodeString *&ordinalNames, + UnicodeString *&cardinalNames, int32_t &cardinalCount, + UErrorCode &status) { + if (U_FAILURE(status)) { return; } + + UnicodeString pathUString(path.data(), -1, US_INV); + Hashtable *map = static_cast(sink.maps.get(pathUString)); + if (map == nullptr) { return; } // resource not found; leave fields nullptr + + // Allocate both arrays up front so LocalArray cleans up both on any failure. + // UnicodeString default-constructs to empty string, which serves as the + // "no data" sentinel (empty is never a valid day name or pattern). + LocalArray ordinal(new UnicodeString[StandardPlural::COUNT], status); + LocalArray cardinal(new UnicodeString[kDayOfMonthCardinalNamesCount], status); + if (U_FAILURE(status)) { return; } + + // Push: iterate over the table entries and dispatch each to the right array. + int32_t pos = UHASH_FIRST; + const UHashElement *e; + while ((e = map->nextElement(pos)) != nullptr) { + const UnicodeString *key = static_cast(e->key.pointer); + const UnicodeString *value = static_cast(e->value.pointer); + if (key == nullptr || value == nullptr) { continue; } + + if (key->charAt(0) >= u'0' && key->charAt(0) <= u'9') { + // Cardinal entry: key is a day number string ("1"–"32"). + char numBuf[4]; + if (key->length() >= (int32_t)sizeof(numBuf)) { continue; } + key->extract(0, key->length(), numBuf, sizeof(numBuf), US_INV); + numBuf[key->length()] = '\0'; + char *endPtr; + long day = uprv_strtol(numBuf, &endPtr, 10); + if (*endPtr == '\0' && day >= 1 && day < kDayOfMonthCardinalNamesCount) { + cardinal[(int32_t)day].fastCopyFrom(*value); + } + } else { + // Ordinal entry: key is a plural category name. + StandardPlural::Form form = StandardPlural::orOtherFromString(*key); + ordinal[(int32_t)form].fastCopyFrom(*value); + } + } + + ordinalNames = ordinal.orphan(); + cardinalNames = cardinal.orphan(); + cardinalCount = kDayOfMonthCardinalNamesCount; +} + void DateFormatSymbols::initializeData(const Locale& locale, const char *type, UErrorCode& status, UBool useLastResortData) @@ -2190,6 +2302,9 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError fStandaloneWideDayPeriodsCount = 0; fStandaloneNarrowDayPeriods = nullptr; fStandaloneNarrowDayPeriodsCount = 0; + fDayOfMonthOrdinalNames = nullptr; + fDayOfMonthCardinalNames = nullptr; + fDayOfMonthCardinalNamesCount = 0; uprv_memset(fCapitalization, 0, sizeof(fCapitalization)); // We need to preserve the requested locale for @@ -2376,6 +2491,12 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError buildResourcePath(path, gDayPeriodTag, gNamesStandaloneTag, gNamesNarrowTag, status), fStandaloneNarrowDayPeriodsCount, status); + loadDayOfMonthNames(calendarSink, + buildResourcePath(path, gDayOfMonthNamesTag, gNamesFormatTag, gNamesAbbrTag, status), + fDayOfMonthOrdinalNames, + fDayOfMonthCardinalNames, fDayOfMonthCardinalNamesCount, + status); + // Fill in for missing/bogus items (dayPeriods are a map so single items might be missing) if (U_SUCCESS(status)) { for (int32_t dpidx = 0; dpidx < fAbbreviatedDayPeriodsCount; ++dpidx) { @@ -2407,30 +2528,44 @@ DateFormatSymbols::initializeData(const Locale& locale, const char *type, UError if (type == nullptr) { type = "gregorian"; } - LocalPointer eraRules(EraRules::createInstance(type, false, status)); - int32_t maxEra = (U_SUCCESS(status))? eraRules->getMaxEraCode(): 0; - UErrorCode resStatus = U_ZERO_ERROR; - LocalUResourceBundlePointer ctpb(ures_getByKeyWithFallback(cb.getAlias(), type, nullptr, &resStatus)); - LocalUResourceBundlePointer cteb(ures_getByKeyWithFallback(ctpb.getAlias(), gErasTag, nullptr, &resStatus)); - const UResourceBundle *ctebPtr = (U_SUCCESS(resStatus))? cteb.getAlias() : nullptr; // Load eras - initEras(&fEras, fErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesAbbrTag, status), - ctebPtr, gNamesAbbrTag, maxEra, status); + UErrorCode preErasStatus = status; UErrorCode oldStatus = status; - initEras(&fEraNames, fEraNamesCount, calendarSink, buildResourcePath(path, gErasTag, gNamesWideTag, status), - ctebPtr, gNamesWideTag, maxEra, status); + LocalPointer eraRules(EraRules::createInstance(type, false, status)); + if (status == U_MISSING_RESOURCE_ERROR) { + // call IDs unsupported in supplmental era rules such as + // "iso8601" or bogus "unknown". Similar code in Java. + status = oldStatus; + type = "gregorian"; + LocalPointer eraRulesRetry(EraRules::createInstance(type, false, status)); + eraRules = std::move(eraRulesRetry); + } + initEras(&fEras, fErasCount, calendarSink, cb.getAlias(), gNamesAbbrTag, eraRules.getAlias(), status); + oldStatus = status; + initEras(&fEraNames, fEraNamesCount, calendarSink, cb.getAlias(), gNamesWideTag, eraRules.getAlias(), status); if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3 status = oldStatus; assignArray(fEraNames, fEraNamesCount, fEras, fErasCount); } // current ICU4J falls back to abbreviated if narrow eras are missing, so we will too oldStatus = status; - initEras(&fNarrowEras, fNarrowErasCount, calendarSink, buildResourcePath(path, gErasTag, gNamesNarrowTag, status), - ctebPtr, gNamesNarrowTag, maxEra, status); + initEras(&fNarrowEras, fNarrowErasCount, calendarSink, cb.getAlias(), gNamesNarrowTag, eraRules.getAlias(), status); if (status == U_MISSING_RESOURCE_ERROR) { // Workaround because eras/wide was omitted from CLDR 1.3 status = oldStatus; assignArray(fNarrowEras, fNarrowErasCount, fEras, fErasCount); } + if (status == U_MISSING_RESOURCE_ERROR) { + // If we still can't load any era names, we restore the pre-eras status + // so that we can continue loading the rest of the data. + // The era names will be empty strings. Not great, but having the era names + // AND month names AND day of week AND am/pm be empty strings is worse. + status = preErasStatus; + } + // if the error was something other (worse) than U_MISSING_RESOURCE_ERROR + // the code goes on to load the rest of the data (doing nothing, because + // the status is already set to an error code) and it is handled by the + // if (U_FAILURE(status)) { if (useLastResortData) { ... } } + // block at the end of this function. // Load month names initField(&fMonths, fMonthsCount, calendarSink, diff --git a/deps/icu-small/source/i18n/dtptngen.cpp b/deps/icu-small/source/i18n/dtptngen.cpp index 97219c104782..6e02d93c36ed 100644 --- a/deps/icu-small/source/i18n/dtptngen.cpp +++ b/deps/icu-small/source/i18n/dtptngen.cpp @@ -197,6 +197,7 @@ static const dtTypeElem dtTypes[] = { {LOW_E, UDATPG_WEEKDAY_FIELD, DT_SHORTER - DT_DELTA, 6, 0}, {LOW_D, UDATPG_DAY_FIELD, DT_NUMERIC, 1, 2}, + {LOW_D, UDATPG_DAY_FIELD, DT_SHORT, 3, 0}, {LOW_G, UDATPG_DAY_FIELD, DT_NUMERIC + DT_DELTA, 1, 20}, // really internal use, so we don't care {CAP_D, UDATPG_DAY_OF_YEAR_FIELD, DT_NUMERIC, 1, 3}, @@ -333,11 +334,9 @@ DateTimePatternGenerator::createEmptyInstance(UErrorCode& status) { } DateTimePatternGenerator::DateTimePatternGenerator(UErrorCode &status) : - skipMatcher(nullptr), - fAvailableFormatKeyHash(nullptr), - fDefaultHourFormatChar(0), - internalErrorCode(U_ZERO_ERROR) + UObject() { + emptyString.getTerminatedBuffer(); fp = new FormatParser(); dtMatcher = new DateTimeMatcher(); distanceInfo = new DistanceInfo(); @@ -348,30 +347,15 @@ DateTimePatternGenerator::DateTimePatternGenerator(UErrorCode &status) : } DateTimePatternGenerator::DateTimePatternGenerator(const Locale& locale, UErrorCode &status, UBool skipStdPatterns) : - skipMatcher(nullptr), - fAvailableFormatKeyHash(nullptr), - fDefaultHourFormatChar(0), - internalErrorCode(U_ZERO_ERROR) + DateTimePatternGenerator(status) { - fp = new FormatParser(); - dtMatcher = new DateTimeMatcher(); - distanceInfo = new DistanceInfo(); - patternMap = new PatternMap(); - if (fp == nullptr || dtMatcher == nullptr || distanceInfo == nullptr || patternMap == nullptr) { - internalErrorCode = status = U_MEMORY_ALLOCATION_ERROR; - } - else { - initData(locale, status, skipStdPatterns); - } + initData(locale, status, skipStdPatterns); } DateTimePatternGenerator::DateTimePatternGenerator(const DateTimePatternGenerator& other) : - UObject(), - skipMatcher(nullptr), - fAvailableFormatKeyHash(nullptr), - fDefaultHourFormatChar(0), - internalErrorCode(U_ZERO_ERROR) + UObject() { + emptyString.getTerminatedBuffer(); fp = new FormatParser(); dtMatcher = new DateTimeMatcher(); distanceInfo = new DistanceInfo(); @@ -1406,7 +1390,6 @@ DateTimePatternGenerator::setDateTimeFormat(UDateFormatStyle style, const Unicod const UnicodeString& DateTimePatternGenerator::getDateTimeFormat(UDateFormatStyle style, UErrorCode& status) const { - static const UnicodeString emptyString = UNICODE_STRING_SIMPLE(""); if (U_FAILURE(status)) { return emptyString; } @@ -1634,6 +1617,21 @@ DateTimePatternGenerator::getFieldAndWidthIndices(const char* key, UDateTimePGDi return UDATPG_FIELD_COUNT; } +// A pattern whose skeleton specifies a two-digit year (such as the en availableFormats entry +// yyMMMd{"MMM d, ’yy"}) can contain literal text that only makes sense with a two-digit year, +// so it's only a valid match for a request that also asks for a two-digit year. Without this +// check, a request for "yyyyMMMd" would match the "yyMMMd" entry-- its year field length is closer +// to the requested 4 than the "yMMMd" entry's is --and produce "MMM d, ’yyyy". +static UBool yearLengthIsCompatible(const PtnSkeleton& request, const PtnSkeleton& trial) { + // a type value greater than 0 means the year field is present and numeric (y/Y/u/r, as opposed + // to the cyclic year U); we don't want to interfere with matching of the non-numeric years + if (request.type[UDATPG_YEAR_FIELD] <= 0 || trial.type[UDATPG_YEAR_FIELD] <= 0) { + return true; + } + return trial.original.getFieldLength(UDATPG_YEAR_FIELD) != 2 + || request.original.getFieldLength(UDATPG_YEAR_FIELD) == 2; +} + const UnicodeString* DateTimePatternGenerator::getBestRaw(DateTimeMatcher& source, int32_t includeMask, @@ -1654,6 +1652,9 @@ DateTimePatternGenerator::getBestRaw(DateTimeMatcher& source, if (trial.equals(skipMatcher)) { continue; } + if (!yearLengthIsCompatible(source.skeleton, trial.skeleton)) { + continue; + } int32_t distance=source.getDistance(trial, includeMask, tempInfo); // Because we iterate over a map the order is undefined. Can change between implementations, // versions, and will very likely be different between Java and C/C++. @@ -2816,6 +2817,9 @@ PtnSkeleton::PtnSkeleton(const PtnSkeleton& other) { } void PtnSkeleton::copyFrom(const PtnSkeleton& other) { + if (this == &other) { + return; + } uprv_memcpy(type, other.type, sizeof(type)); original.copyFrom(other.original); baseOriginal.copyFrom(other.baseOriginal); @@ -2926,7 +2930,7 @@ DTSkeletonEnumeration::DTSkeletonEnumeration(PatternMap& patternMap, dtStrEnum t } const UnicodeString* -DTSkeletonEnumeration::snext(UErrorCode& status) { +DTSkeletonEnumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { if (U_SUCCESS(status) && fSkeletons.isValid() && pos < fSkeletons->size()) { return static_cast(fSkeletons->elementAt(pos++)); } @@ -2993,7 +2997,7 @@ DTRedundantEnumeration::add(const UnicodeString& pattern, UErrorCode& status) { } const UnicodeString* -DTRedundantEnumeration::snext(UErrorCode& status) { +DTRedundantEnumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { if (U_SUCCESS(status) && fPatterns.isValid() && pos < fPatterns->size()) { return static_cast(fPatterns->elementAt(pos++)); } diff --git a/deps/icu-small/source/i18n/dtptngen_impl.h b/deps/icu-small/source/i18n/dtptngen_impl.h index b6eb5f63734e..f3849db6cf41 100644 --- a/deps/icu-small/source/i18n/dtptngen_impl.h +++ b/deps/icu-small/source/i18n/dtptngen_impl.h @@ -280,7 +280,7 @@ class DTSkeletonEnumeration : public StringEnumeration { virtual ~DTSkeletonEnumeration(); static UClassID U_EXPORT2 getStaticClassID(); virtual UClassID getDynamicClassID() const override; - virtual const UnicodeString* snext(UErrorCode& status) override; + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override; virtual void reset(UErrorCode& status) override; virtual int32_t count(UErrorCode& status) const override; private: @@ -295,7 +295,7 @@ class DTRedundantEnumeration : public StringEnumeration { virtual ~DTRedundantEnumeration(); static UClassID U_EXPORT2 getStaticClassID(); virtual UClassID getDynamicClassID() const override; - virtual const UnicodeString* snext(UErrorCode& status) override; + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override; virtual void reset(UErrorCode& status) override; virtual int32_t count(UErrorCode& status) const override; void add(const UnicodeString &pattern, UErrorCode& status); diff --git a/deps/icu-small/source/i18n/erarules.cpp b/deps/icu-small/source/i18n/erarules.cpp index 6f1a379b2842..b9a944857628 100644 --- a/deps/icu-small/source/i18n/erarules.cpp +++ b/deps/icu-small/source/i18n/erarules.cpp @@ -17,6 +17,7 @@ #include "erarules.h" #include "gregoimp.h" #include "uassert.h" +#include "uinvchar.h" #include "uvectr32.h" U_NAMESPACE_BEGIN @@ -103,22 +104,49 @@ static int32_t compareEncodedDateWithYMD(int encoded, int year, int month, int d } } -EraRules::EraRules(LocalMemory& startDatesIn, int32_t startDatesLengthIn, int32_t minEraIn, int32_t numErasIn) - : startDatesLength(startDatesLengthIn), minEra(minEraIn), numEras(numErasIn) { +EraRules::EraRules(const char* calTypeId, LocalMemory& startDatesIn, int32_t startDatesLengthIn, + int32_t minEraIn, int32_t numErasIn) + : startDatesLength(startDatesLengthIn), minEra(minEraIn), numEras(numErasIn), inheritEraRules(nullptr) { + U_ASSERT(uprv_strlen(calTypeId) <= MAX_CAL_ID_LENGTH); + uprv_strcpy(this->calTypeId, calTypeId); startDates = std::move(startDatesIn); initCurrentEra(); } EraRules::~EraRules() { + delete inheritEraRules; } -EraRules* EraRules::createInstance(const char *calType, UBool includeTentativeEra, UErrorCode& status) { +EraRules* EraRules::createInstance(const char *calTypeId, UBool includeTentativeEra, UErrorCode& status) { if(U_FAILURE(status)) { return nullptr; } + if (calTypeId == nullptr || uprv_strlen(calTypeId) > MAX_CAL_ID_LENGTH) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + LocalUResourceBundlePointer rb(ures_openDirect(nullptr, "supplementalData", &status)); ures_getByKey(rb.getAlias(), "calendarData", rb.getAlias(), &status); - ures_getByKey(rb.getAlias(), calType, rb.getAlias(), &status); + ures_getByKey(rb.getAlias(), calTypeId, rb.getAlias(), &status); + + // Check they key "inheritEras" to see if this calendar inherits eras from another calendar. + const char *inheritCalType = nullptr; + char inheritCalTypeBuf[MAX_CAL_ID_LENGTH + 1]; + int32_t inheritCalTypeLen = 0; + UErrorCode tmpStatus = U_ZERO_ERROR; + const UChar *inheritCalTypeStr = ures_getStringByKey(rb.getAlias(), "inheritEras", &inheritCalTypeLen, &tmpStatus); + if (U_SUCCESS(tmpStatus)) { + if (inheritCalTypeLen > MAX_CAL_ID_LENGTH && !uprv_isInvariantUString(inheritCalTypeStr, inheritCalTypeLen)) { + // calendar type ID from data is too long or not in ASCII + status = U_INVALID_FORMAT_ERROR; + return nullptr; + } + u_UCharsToChars(inheritCalTypeStr, inheritCalTypeBuf, inheritCalTypeLen); + inheritCalTypeBuf[inheritCalTypeLen] = 0; + inheritCalType = inheritCalTypeBuf; + } + ures_getByKey(rb.getAlias(), "eras", rb.getAlias(), &status); if (U_FAILURE(status)) { @@ -257,11 +285,47 @@ EraRules* EraRules::createInstance(const char *calType, UBool includeTentativeEr for (int32_t eraIdx = 0; eraIdx < eraStartDates.size(); eraIdx++) { startDates[eraIdx] = eraStartDates.elementAti(eraIdx); } - EraRules *result = new EraRules(startDates, eraStartDates.size(), minEra, numEras); - if (result == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; + LocalPointer result(new EraRules(calTypeId, startDates, eraStartDates.size(), minEra, numEras), status); + if (U_FAILURE(status)) { + return nullptr; + } + + // Initialize era rules from inherited calendar + if (inheritCalType) { + tmpStatus = U_ZERO_ERROR; + LocalPointer tmpEraRules(createInstance(inheritCalType, includeTentativeEra, status), tmpStatus); + if (U_FAILURE(tmpStatus)) { + status = tmpStatus; + return nullptr; + } + if (U_FAILURE(status)) { + return nullptr; + } + result->inheritEraRules = tmpEraRules.orphan(); + } + + return result.orphan(); +} + +int32_t EraRules::getNextEraCode(int32_t eraCode) const { + int32_t nextEra = eraCode + 1; + if (nextEra < minEra) { + if (inheritEraRules != nullptr) { + if (nextEra > inheritEraRules->getMaxEraCode()) { + nextEra = minEra; + } else { + nextEra = inheritEraRules->getNextEraCode(eraCode); + } + } else { + nextEra = minEra; + } + } else { + int32_t maxEra = getMaxEraCode(); + if (nextEra > maxEra) { + nextEra = maxEra; + } } - return result; + return nextEra; } void EraRules::getStartDate(int32_t eraCode, int32_t (&fields)[3], UErrorCode& status) const { @@ -269,7 +333,14 @@ void EraRules::getStartDate(int32_t eraCode, int32_t (&fields)[3], UErrorCode& s return; } int32_t startDate = 0; - if (eraCode >= minEra) { + if (eraCode < minEra) { + if (inheritEraRules != nullptr) { + if (eraCode >= inheritEraRules->getMinEraCode()) { + inheritEraRules->getStartDate(eraCode, fields, status); + return; + } + } + } else { int32_t startIdx = eraCode - minEra; if (startIdx < startDatesLength) { startDate = startDates[startIdx]; @@ -289,22 +360,9 @@ int32_t EraRules::getStartYear(int32_t eraCode, UErrorCode& status) const { if(U_FAILURE(status)) { return year; } - int32_t startDate = 0; - if (eraCode >= minEra) { - int32_t startIdx = eraCode - minEra; - if (startIdx < startDatesLength) { - startDate = startDates[startIdx]; - } - } - if (isSet(startDate)) { - int fields[3]; - decodeDate(startDate, fields); - year = fields[0]; - return year; - } - // We did not find the requested eraCode in our data - status = U_ILLEGAL_ARGUMENT_ERROR; - return year; + int32_t fields[3] = {0, 0, 0}; + getStartDate(eraCode, fields, status); + return fields[0]; } int32_t EraRules::getEraCode(int32_t year, int32_t month, int32_t day, UErrorCode& status) const { @@ -327,6 +385,7 @@ int32_t EraRules::getEraCode(int32_t year, int32_t month, int32_t day, UErrorCod return minEra + startIdx; } } + return minEra + startDatesLength - 1; } // Linear search from the end, which should hit the most likely eras first. // Also this is the most efficient for any era if we have < 8 or so eras, so only less @@ -342,10 +401,19 @@ int32_t EraRules::getEraCode(int32_t year, int32_t month, int32_t day, UErrorCod return minEra + startIdx; } } + + // Note: Inherit era rules should be only applied to date before the start of minEra. + if (inheritEraRules != nullptr) { + return inheritEraRules->getEraCode(year, month, day, status); + } + return minEra; } void EraRules::initCurrentEra() { + // Note: This implementation assumes current era is the primary era rules, + // not in inherited era rules. + // Compute local wall time in millis using ICU's default time zone. UErrorCode ec = U_ZERO_ERROR; UDate localMillis = ucal_getNow(); diff --git a/deps/icu-small/source/i18n/erarules.h b/deps/icu-small/source/i18n/erarules.h index f72f73c1c7f5..2b0af76523cb 100644 --- a/deps/icu-small/source/i18n/erarules.h +++ b/deps/icu-small/source/i18n/erarules.h @@ -10,8 +10,11 @@ #include "unicode/localpointer.h" #include "unicode/uobject.h" +#include "unicode/unistr.h" #include "cmemory.h" +#define MAX_CAL_ID_LENGTH 31 // Currently, maximum calendar type length is 19 + U_NAMESPACE_BEGIN class U_I18N_API_CLASS EraRules : public UMemory { @@ -21,13 +24,30 @@ class U_I18N_API_CLASS EraRules : public UMemory { U_I18N_API static EraRules* createInstance(const char* calType, UBool includeTentativeEra, UErrorCode& status); + /** + * Gets the calendar type ID + * @return calendar type ID + */ + inline const char* getCalendarType() const { + return calTypeId; + } + + /** + * Gets the era rules of the calendar from which the current calendar inherits eras, + * or nullptr if there is no such calendar. + * @return era rules of the calendar from which the current calendar inherits eras, + * or nullptr. + */ + inline const EraRules* getInheritEraRules() const { + return inheritEraRules; + } /** * Gets number of effective eras * @return number of effective eras (not the same as max era code) */ inline int32_t getNumberOfEras() const { - return numEras; + return inheritEraRules == nullptr ? numEras : numEras + inheritEraRules->getNumberOfEras(); } /** @@ -38,6 +58,25 @@ class U_I18N_API_CLASS EraRules : public UMemory { return minEra + startDatesLength - 1; } + /** + * Gets minimum defined era code for the current calendar + * @return minimum defined era code + */ + inline int32_t getMinEraCode() const { + int minEraCode = minEra; + if (inheritEraRules != nullptr) { + minEraCode = inheritEraRules->getMinEraCode(); + } + return minEraCode; + } + + /** + * Gets next era code + * @param eraCode Current era code + * @return Next era code. If not available, maximum era code is returned. + */ + U_I18N_API int32_t getNextEraCode(int32_t eraCode) const; + /** * Gets start date of an era * @param eraCode Era code @@ -46,7 +85,7 @@ class U_I18N_API_CLASS EraRules : public UMemory { * will be January 1st in year whose value is minimum integer. * @param status Receives status. */ - void getStartDate(int32_t eraCode, int32_t (&fields)[3], UErrorCode& status) const; + U_I18N_API void getStartDate(int32_t eraCode, int32_t (&fields)[3], UErrorCode& status) const; /** * Gets start year of an era @@ -79,15 +118,18 @@ class U_I18N_API_CLASS EraRules : public UMemory { } private: - EraRules(LocalMemory& startDatesIn, int32_t startDatesLengthIn, int32_t minEraIn, int32_t numErasIn); + EraRules(const char* calTypeId, LocalMemory& startDatesIn, int32_t startDatesLengthIn, + int32_t minEraIn, int32_t numErasIn); void initCurrentEra(); + char calTypeId[MAX_CAL_ID_LENGTH + 1]; // calendar type id LocalMemory startDates; int32_t startDatesLength; int32_t minEra; // minimum valid era code, for first entry in startDates int32_t numEras; // number of valid era codes (not necessarily the same as startDates length int32_t currentEra; + EraRules* inheritEraRules; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/formattedvalue.cpp b/deps/icu-small/source/i18n/formattedvalue.cpp index f2bfdda6e465..04df70912080 100644 --- a/deps/icu-small/source/i18n/formattedvalue.cpp +++ b/deps/icu-small/source/i18n/formattedvalue.cpp @@ -198,6 +198,10 @@ ucfpos_close(UConstrainedFieldPosition* ptr) { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wreturn-local-addr" #endif +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreturn-stack-address" +#endif U_CAPI const char16_t* U_EXPORT2 ufmtval_getString( const UFormattedValue* ufmtval, @@ -218,6 +222,9 @@ ufmtval_getString( // defined to return memory owned by the ufmtval argument. return readOnlyAlias.getBuffer(); } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif #if U_GCC_MAJOR_MINOR >= 409 #pragma GCC diagnostic pop #endif diff --git a/deps/icu-small/source/i18n/gregocal.cpp b/deps/icu-small/source/i18n/gregocal.cpp index 3dc3950e274f..7a6c2109918e 100644 --- a/deps/icu-small/source/i18n/gregocal.cpp +++ b/deps/icu-small/source/i18n/gregocal.cpp @@ -334,7 +334,20 @@ GregorianCalendar::setGregorianChange(UDate date, UErrorCode& status) if (cal->get(UCAL_ERA, status) == BC) { fGregorianCutoverYear = 1 - fGregorianCutoverYear; } - fCutoverJulianDay = static_cast(cutoverDay); + // fCutoverJulianDay holds an actual Julian Day count, consistent with + // the kCutoverJulianDay constant used by the constructors above and with + // the jd values it is compared against in handleComputeJulianDay() and + // handleComputeFields(). cutoverDay, in contrast, is a day count relative + // to the 1970 epoch, so convert it to a Julian Day in 64 bits first and + // then clamp to the int32_t range, the same way as above. + int64_t cutoverJulianDay64 = static_cast(cutoverDay) + kEpochStartAsJulianDay; + if (cutoverJulianDay64 <= INT32_MIN) { + fCutoverJulianDay = INT32_MIN; + } else if (cutoverJulianDay64 >= INT32_MAX) { + fCutoverJulianDay = INT32_MAX; + } else { + fCutoverJulianDay = static_cast(cutoverJulianDay64); + } delete cal; } @@ -494,12 +507,31 @@ int32_t GregorianCalendar::handleComputeJulianDay(UCalendarDateFields bestField, #endif jd -= gregShift; } else if ( bestField == UCAL_WEEK_OF_MONTH ) { - int32_t weekShift = 14; + // Only the month that actually contains the cutover point loses + // days (10 days vanish from the transition month), so only that + // month's weeks need to be pushed forward to avoid colliding + // with the weeks before the gap. The requested month is compared + // against the month the cutover falls in, derived from + // fGregorianCutover (whose units, milliseconds, are unambiguous; + // fCutoverJulianDay is not usable here since its units depend on + // how the cutover was set). No range normalization is applied to + // the requested month, so an out-of-range month is by definition + // not the cutover month and gets no shift. + int32_t requestedMonth = internalGetMonth(status); + if (U_SUCCESS(status)) { + int32_t cutoverYear, cutoverMillisInDay; + int8_t cutoverMonth, cutoverDom; + Grego::timeToFields(fGregorianCutover, cutoverYear, cutoverMonth, + cutoverDom, cutoverMillisInDay, status); + if (U_SUCCESS(status) && requestedMonth == cutoverMonth) { + int32_t weekShift = 14; #if defined (U_DEBUG_CAL) - fprintf(stderr, "%s:%d: [WOY/WOM] gregorian week shift of %d += %d\n", - __FILE__, __LINE__, jd, weekShift); + fprintf(stderr, "%s:%d: [WOY/WOM] gregorian week shift of %d += %d\n", + __FILE__, __LINE__, jd, weekShift); #endif - jd += weekShift; // shift by weeks for week based fields. + jd += weekShift; // shift by weeks for week based fields. + } + } } } diff --git a/deps/icu-small/source/i18n/hebrwcal.cpp b/deps/icu-small/source/i18n/hebrwcal.cpp index 83f170799035..0dcb54b47987 100644 --- a/deps/icu-small/source/i18n/hebrwcal.cpp +++ b/deps/icu-small/source/i18n/hebrwcal.cpp @@ -437,22 +437,23 @@ int32_t startOfYear(int32_t year, UErrorCode &status) (235LL * static_cast(year) - 234LL), 19LL); int64_t frac = months * MONTH_FRACT + BAHARAD; // Fractional part of day # - day = months * 29LL + frac / DAY_PARTS; // Whole # part of calculation - frac = frac % DAY_PARTS; // Time of day + int64_t fracDiv = ClockMath::floorDivideInt64(frac, DAY_PARTS); + day = months * 29LL + fracDiv; // Whole # part of calculation + frac = frac - (fracDiv * DAY_PARTS); // Time of day - int32_t wd = (day % 7); // Day of week (0 == Monday) + int32_t wd = static_cast((day % 7 + 7) % 7); // Day of week (0 == Monday) if (wd == 2 || wd == 4 || wd == 6) { // If the 1st is on Sun, Wed, or Fri, postpone to the next day day += 1; - wd = (day % 7); - } else if (wd == 1 && frac > 15*HOUR_PARTS+204 && !HebrewCalendar::isLeapYear(year) ) { + wd = static_cast((day % 7 + 7) % 7); + } else if (wd == 1 && frac >= 15*HOUR_PARTS+204 && !HebrewCalendar::isLeapYear(year) ) { // If the new moon falls after 3:11:20am (15h204p from the previous noon) // on a Tuesday and it is not a leap year, postpone by 2 days. // This prevents 356-day years. day += 2; } - else if (wd == 0 && frac > 21*HOUR_PARTS+589 && HebrewCalendar::isLeapYear(year-1) ) { + else if (wd == 0 && frac >= 21*HOUR_PARTS+589 && HebrewCalendar::isLeapYear(year-1) ) { // If the new moon falls after 9:32:43 1/3am (21h589p from yesterday noon) // on a Monday and *last* year was a leap year, postpone by 1 day. // Prevents 382-day years. @@ -521,9 +522,8 @@ int32_t yearType(int32_t year, UErrorCode& status) * The formula below performs the same test, believe it or not. */ UBool HebrewCalendar::isLeapYear(int32_t year) { - //return (year * 12 + 17) % 19 >= 12; - int64_t x = (year*12LL + 17) % YEARS_IN_CYCLE; - return x >= ((x < 0) ? -7 : 12); + int64_t x = ((year*12LL + 17) % YEARS_IN_CYCLE + YEARS_IN_CYCLE) % YEARS_IN_CYCLE; + return x >= 12; } namespace{ diff --git a/deps/icu-small/source/i18n/inputext.cpp b/deps/icu-small/source/i18n/inputext.cpp index 4a7712404ca3..b7e6f128b750 100644 --- a/deps/icu-small/source/i18n/inputext.cpp +++ b/deps/icu-small/source/i18n/inputext.cpp @@ -54,17 +54,23 @@ void InputText::setText(const char *in, int32_t len) fRawLength = len == -1 ? static_cast(uprv_strlen(in)) : len; } -void InputText::setDeclaredEncoding(const char* encoding, int32_t len) +void InputText::setDeclaredEncoding(const char* encoding, int32_t len, UErrorCode &status) { + if (U_FAILURE(status)) return; if(encoding) { if (len == -1) { len = static_cast(uprv_strlen(encoding)); } len += 1; // to make place for the \0 at the end. + char* newEncoding = NEW_ARRAY(char, len); + if (newEncoding == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } uprv_free(fDeclaredEncoding); - fDeclaredEncoding = NEW_ARRAY(char, len); - uprv_strncpy(fDeclaredEncoding, encoding, len); + uprv_strncpy(newEncoding, encoding, len); + fDeclaredEncoding = newEncoding; } } diff --git a/deps/icu-small/source/i18n/inputext.h b/deps/icu-small/source/i18n/inputext.h index fb92dc06343a..f56f0d3d5c3c 100644 --- a/deps/icu-small/source/i18n/inputext.h +++ b/deps/icu-small/source/i18n/inputext.h @@ -34,7 +34,7 @@ class InputText : public UMemory ~InputText(); void setText(const char *in, int32_t len); - void setDeclaredEncoding(const char *encoding, int32_t len); + void setDeclaredEncoding(const char *encoding, int32_t len, UErrorCode &status); UBool isSet() const; void MungeInput(UBool fStripTags); diff --git a/deps/icu-small/source/i18n/japancal.cpp b/deps/icu-small/source/i18n/japancal.cpp index b71b935e4ed8..5d44edca0eb2 100644 --- a/deps/icu-small/source/i18n/japancal.cpp +++ b/deps/icu-small/source/i18n/japancal.cpp @@ -139,7 +139,7 @@ const char *JapaneseCalendar::getType() const return "japanese"; } -int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear, UErrorCode& status) +int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t extendedYear, UErrorCode& status) { if (U_FAILURE(status)) { return 0; @@ -147,40 +147,47 @@ int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear, UErrorCode& statu int32_t era = internalGetEra(); // TODO do we assume we can trust 'era'? What if it is denormalized? - int32_t month = 0; + if (era == 0) { + // era 0 in Japanese calendar is Gregorian BC + return GregorianCalendar::getDefaultMonthInYear(extendedYear, status); + } // Find out if we are at the edge of an era - int32_t eraStart[3] = { 0,0,0 }; + int32_t eraStart[3] = {0, 0, 0}; gJapaneseEraRules->getStartDate(era, eraStart, status); if (U_FAILURE(status)) { return 0; } - if(eyear == eraStart[0]) { - // Yes, we're in the first year of this era. - return eraStart[1] // month - -1; // return 0-based month + if (extendedYear == eraStart[0]) { + return eraStart[1] - 1; // return 0-based month + } else { + return 0; } - - return month; } -int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t eyear, int32_t month, UErrorCode& status) +int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t extendedYear, int32_t month, UErrorCode& status) { if (U_FAILURE(status)) { return 0; } int32_t era = internalGetEra(); - int32_t day = 1; - int32_t eraStart[3] = { 0,0,0 }; + if (era == 0) { + // era 0 in Japanese calendar is Gregorian BC + return GregorianCalendar::getDefaultDayInMonth(extendedYear, month, status); + } + + int32_t eraStart[3] = {0, 0, 0}; gJapaneseEraRules->getStartDate(era, eraStart, status); if (U_FAILURE(status)) { return 0; } - if (eyear == eraStart[0] && (month == eraStart[1] - 1)) { - return eraStart[2]; + if (extendedYear == eraStart[0]) { // if it is year 1.. + if (month == (eraStart[1] - 1)) { // if it is the emperor's first month.. + return eraStart[2]; // return the D_O_M of accession + } } - return day; + return 1; } @@ -194,24 +201,34 @@ int32_t JapaneseCalendar::handleGetExtendedYear(UErrorCode& status) if (U_FAILURE(status)) { return 0; } + // EXTENDED_YEAR in JapaneseCalendar is a Gregorian year // The default value of EXTENDED_YEAR is 1970 (Showa 45) - if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR && newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { return internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); } - int32_t eraStartYear = gJapaneseEraRules->getStartYear(internalGet(UCAL_ERA, gCurrentEra), status); - if (U_FAILURE(status)) { - return 0; - } // extended year is a gregorian year, where 1 = 1AD, 0 = 1BC, -1 = 2BC, etc - int32_t year = internalGet(UCAL_YEAR, 1); // pin to minimum of year 1 (first year) - // add gregorian starting year, subtract one because year starts at 1 - if (uprv_add32_overflow(year, eraStartYear - 1, &year)) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return 0; + int32_t era = internalGet(UCAL_ERA, gCurrentEra); + int32_t year = internalGet(UCAL_YEAR, 1); + if (era == 0) { + // era 0 in Japanese calendar is Gregorian BC + // year = 1 - year; + if (uprv_mul32_overflow(year, -1, &year) || uprv_add32_overflow(year, 1, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + } else { + int32_t eraStartYear = gJapaneseEraRules->getStartYear(internalGet(UCAL_ERA, gCurrentEra), status); + if (U_FAILURE(status)) { + return 0; + } + // add gregorian starting year, subtract one because year starts at 1 + if (uprv_add32_overflow(year, eraStartYear - 1, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } } return year; } @@ -219,21 +236,36 @@ int32_t JapaneseCalendar::handleGetExtendedYear(UErrorCode& status) void JapaneseCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) { - //Calendar::timeToFields(theTime, quick, status); - GregorianCalendar::handleComputeFields(julianDay, status); - int32_t year = internalGet(UCAL_EXTENDED_YEAR); // Gregorian year - int32_t eraCode = gJapaneseEraRules->getEraCode(year, internalGetMonth(status) + 1, internalGet(UCAL_DAY_OF_MONTH), status); - - int32_t startYear = gJapaneseEraRules->getStartYear(eraCode, status) - 1; if (U_FAILURE(status)) { return; } - if (uprv_add32_overflow(year, -startYear, &year)) { - status = U_ILLEGAL_ARGUMENT_ERROR; + //Calendar::timeToFields(theTime, quick, status); + GregorianCalendar::handleComputeFields(julianDay, status); + int32_t extendedYear = internalGet(UCAL_EXTENDED_YEAR); // Gregorian year + int32_t eraCode = gJapaneseEraRules->getEraCode(extendedYear, internalGetMonth(status) + 1, internalGet(UCAL_DAY_OF_MONTH), status); + if (U_FAILURE(status)) { return; } + U_ASSERT(eraCode >= 0); // getEraCode() returns -1 only when status is failure + internalSet(UCAL_ERA, eraCode); - internalSet(UCAL_YEAR, year); + int32_t year; + if (eraCode == 0) { + // Gregorian BC + // year = 1 - extendedYear; + if (uprv_mul32_overflow(extendedYear, -1, &year) || uprv_add32_overflow(year, 1, &year)) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + } else if (eraCode == 1) { + // Gregorian AD + year = extendedYear; + } else { + // Japanese era. extendedYear is at least 1868 (Meiji 1), so it should never + // cause integer overflow here. + year = extendedYear - gJapaneseEraRules->getStartYear(eraCode, status) + 1; + } + internalSet(YEAR, year); } /* @@ -295,17 +327,28 @@ int32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode if (U_FAILURE(status)) { return 0; // error case... any value } - if (era == gJapaneseEraRules->getMaxEraCode()) { // max known era, not gCurrentEra + if (era >= gJapaneseEraRules->getMaxEraCode()) { // max known era, not gCurrentEra // TODO: Investigate what value should be used here - revisit after 4.0. return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); } - int32_t nextEraStart[3] = { 0,0,0 }; - gJapaneseEraRules->getStartDate(era + 1, nextEraStart, status); + if (era == 0) { + // era 0 is Gregorian BC and has no era start year data. + return GregorianCalendar::getActualMaximum(UCAL_YEAR, status); + } + + // Use getNextEraCode() instead of +1, because there might be gaps between eras. + int32_t nextEra = gJapaneseEraRules->getNextEraCode(era); + U_ASSERT(nextEra != era); + int32_t nextEraStart[3] = {0, 0, 0}; + gJapaneseEraRules->getStartDate(nextEra, nextEraStart, status); int32_t nextEraYear = nextEraStart[0]; int32_t nextEraMonth = nextEraStart[1]; // 1-base int32_t nextEraDate = nextEraStart[2]; int32_t eraStartYear = gJapaneseEraRules->getStartYear(era, status); + if (U_FAILURE(status)) { + return 0; + } int32_t maxYear = nextEraYear - eraStartYear + 1; // 1-base if (nextEraMonth == 1 && nextEraDate == 1) { // Subtract 1, because the next era starts at Jan 1 diff --git a/deps/icu-small/source/i18n/japancal.h b/deps/icu-small/source/i18n/japancal.h index 3271cbfb794a..49f7bfd6ca3a 100644 --- a/deps/icu-small/source/i18n/japancal.h +++ b/deps/icu-small/source/i18n/japancal.h @@ -204,7 +204,7 @@ class JapaneseCalendar : public GregorianCalendar { */ virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month, UErrorCode& status) override; - virtual bool isEra0CountingBackward() const override { return false; } + virtual bool isEra0CountingBackward() const override { return true; } }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/measunit.cpp b/deps/icu-small/source/i18n/measunit.cpp index 06b2436940ae..ee3237cecca7 100644 --- a/deps/icu-small/source/i18n/measunit.cpp +++ b/deps/icu-small/source/i18n/measunit.cpp @@ -43,25 +43,25 @@ static const int32_t gOffsets[] = { 21, 34, 38, - 340, - 351, - 370, - 378, - 392, - 396, + 342, + 353, + 372, + 380, + 394, 400, - 408, - 439, - 443, - 445, - 462, - 463, - 469, - 481, - 487, + 404, + 412, + 444, + 448, + 450, + 467, + 468, + 474, + 486, 492, - 494, - 538 + 497, + 499, + 543 }; static const int32_t kCurrencyOffset = 5; @@ -401,6 +401,7 @@ static const char * const gSubTypes[] = { "VND", "VUV", "WST", + "XAD", "XAF", "XAG", "XAU", @@ -409,6 +410,7 @@ static const char * const gSubTypes[] = { "XBC", "XBD", "XCD", + "XCG", "XDR", "XEU", "XOF", @@ -488,10 +490,12 @@ static const char * const gSubTypes[] = { "kilowatt-hour", "sievert", "therm-us", + "dyne", "kilogram-force", "kilowatt-hour-per-100-kilometer", "newton", "pound-force", + "poundal", "gigahertz", "hertz", "kilohertz", @@ -521,6 +525,7 @@ static const char * const gSubTypes[] = { "micrometer", "mile", "mile-scandinavian", + "milliinch", "millimeter", "nanometer", "nautical-mile", @@ -1376,38 +1381,54 @@ MeasureUnit MeasureUnit::getThermUs() { return MeasureUnit(9, 13); } -MeasureUnit *MeasureUnit::createKilogramForce(UErrorCode &status) { +MeasureUnit *MeasureUnit::createDyne(UErrorCode &status) { return MeasureUnit::create(10, 0, status); } -MeasureUnit MeasureUnit::getKilogramForce() { +MeasureUnit MeasureUnit::getDyne() { return MeasureUnit(10, 0); } -MeasureUnit *MeasureUnit::createKilowattHourPer100Kilometer(UErrorCode &status) { +MeasureUnit *MeasureUnit::createKilogramForce(UErrorCode &status) { return MeasureUnit::create(10, 1, status); } -MeasureUnit MeasureUnit::getKilowattHourPer100Kilometer() { +MeasureUnit MeasureUnit::getKilogramForce() { return MeasureUnit(10, 1); } -MeasureUnit *MeasureUnit::createNewton(UErrorCode &status) { +MeasureUnit *MeasureUnit::createKilowattHourPer100Kilometer(UErrorCode &status) { return MeasureUnit::create(10, 2, status); } -MeasureUnit MeasureUnit::getNewton() { +MeasureUnit MeasureUnit::getKilowattHourPer100Kilometer() { return MeasureUnit(10, 2); } -MeasureUnit *MeasureUnit::createPoundForce(UErrorCode &status) { +MeasureUnit *MeasureUnit::createNewton(UErrorCode &status) { return MeasureUnit::create(10, 3, status); } -MeasureUnit MeasureUnit::getPoundForce() { +MeasureUnit MeasureUnit::getNewton() { return MeasureUnit(10, 3); } +MeasureUnit *MeasureUnit::createPoundForce(UErrorCode &status) { + return MeasureUnit::create(10, 4, status); +} + +MeasureUnit MeasureUnit::getPoundForce() { + return MeasureUnit(10, 4); +} + +MeasureUnit *MeasureUnit::createPoundal(UErrorCode &status) { + return MeasureUnit::create(10, 5, status); +} + +MeasureUnit MeasureUnit::getPoundal() { + return MeasureUnit(10, 5); +} + MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) { return MeasureUnit::create(11, 0, status); } @@ -1640,118 +1661,126 @@ MeasureUnit MeasureUnit::getMileScandinavian() { return MeasureUnit(13, 16); } -MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) { +MeasureUnit *MeasureUnit::createMilliinch(UErrorCode &status) { return MeasureUnit::create(13, 17, status); } -MeasureUnit MeasureUnit::getMillimeter() { +MeasureUnit MeasureUnit::getMilliinch() { return MeasureUnit(13, 17); } -MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) { +MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) { return MeasureUnit::create(13, 18, status); } -MeasureUnit MeasureUnit::getNanometer() { +MeasureUnit MeasureUnit::getMillimeter() { return MeasureUnit(13, 18); } -MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) { +MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) { return MeasureUnit::create(13, 19, status); } -MeasureUnit MeasureUnit::getNauticalMile() { +MeasureUnit MeasureUnit::getNanometer() { return MeasureUnit(13, 19); } -MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) { +MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) { return MeasureUnit::create(13, 20, status); } -MeasureUnit MeasureUnit::getParsec() { +MeasureUnit MeasureUnit::getNauticalMile() { return MeasureUnit(13, 20); } -MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) { +MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) { return MeasureUnit::create(13, 21, status); } -MeasureUnit MeasureUnit::getPicometer() { +MeasureUnit MeasureUnit::getParsec() { return MeasureUnit(13, 21); } -MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) { +MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) { return MeasureUnit::create(13, 22, status); } -MeasureUnit MeasureUnit::getPoint() { +MeasureUnit MeasureUnit::getPicometer() { return MeasureUnit(13, 22); } -MeasureUnit *MeasureUnit::createRiJp(UErrorCode &status) { +MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) { return MeasureUnit::create(13, 23, status); } -MeasureUnit MeasureUnit::getRiJp() { +MeasureUnit MeasureUnit::getPoint() { return MeasureUnit(13, 23); } -MeasureUnit *MeasureUnit::createRin(UErrorCode &status) { +MeasureUnit *MeasureUnit::createRiJp(UErrorCode &status) { return MeasureUnit::create(13, 24, status); } -MeasureUnit MeasureUnit::getRin() { +MeasureUnit MeasureUnit::getRiJp() { return MeasureUnit(13, 24); } -MeasureUnit *MeasureUnit::createRod(UErrorCode &status) { +MeasureUnit *MeasureUnit::createRin(UErrorCode &status) { return MeasureUnit::create(13, 25, status); } -MeasureUnit MeasureUnit::getRod() { +MeasureUnit MeasureUnit::getRin() { return MeasureUnit(13, 25); } -MeasureUnit *MeasureUnit::createShakuCloth(UErrorCode &status) { +MeasureUnit *MeasureUnit::createRod(UErrorCode &status) { return MeasureUnit::create(13, 26, status); } -MeasureUnit MeasureUnit::getShakuCloth() { +MeasureUnit MeasureUnit::getRod() { return MeasureUnit(13, 26); } -MeasureUnit *MeasureUnit::createShakuLength(UErrorCode &status) { +MeasureUnit *MeasureUnit::createShakuCloth(UErrorCode &status) { return MeasureUnit::create(13, 27, status); } -MeasureUnit MeasureUnit::getShakuLength() { +MeasureUnit MeasureUnit::getShakuCloth() { return MeasureUnit(13, 27); } -MeasureUnit *MeasureUnit::createSolarRadius(UErrorCode &status) { +MeasureUnit *MeasureUnit::createShakuLength(UErrorCode &status) { return MeasureUnit::create(13, 28, status); } -MeasureUnit MeasureUnit::getSolarRadius() { +MeasureUnit MeasureUnit::getShakuLength() { return MeasureUnit(13, 28); } -MeasureUnit *MeasureUnit::createSun(UErrorCode &status) { +MeasureUnit *MeasureUnit::createSolarRadius(UErrorCode &status) { return MeasureUnit::create(13, 29, status); } -MeasureUnit MeasureUnit::getSun() { +MeasureUnit MeasureUnit::getSolarRadius() { return MeasureUnit(13, 29); } -MeasureUnit *MeasureUnit::createYard(UErrorCode &status) { +MeasureUnit *MeasureUnit::createSun(UErrorCode &status) { return MeasureUnit::create(13, 30, status); } -MeasureUnit MeasureUnit::getYard() { +MeasureUnit MeasureUnit::getSun() { return MeasureUnit(13, 30); } +MeasureUnit *MeasureUnit::createYard(UErrorCode &status) { + return MeasureUnit::create(13, 31, status); +} + +MeasureUnit MeasureUnit::getYard() { + return MeasureUnit(13, 31); +} + MeasureUnit *MeasureUnit::createCandela(UErrorCode &status) { return MeasureUnit::create(14, 0, status); } @@ -2546,6 +2575,14 @@ MeasureUnit MeasureUnit::getToJp() { // End generated code for measunit.cpp +/** + * Generic binary search function for string arrays. + * @param array the array of strings to search in + * @param start the starting index (inclusive) + * @param end the ending index (exclusive) + * @param key the string to search for + * @return the index if found, -1 if not found + */ static int32_t binarySearch( const char * const * array, int32_t start, int32_t end, StringPiece key) { while (start < end) { @@ -2563,6 +2600,33 @@ static int32_t binarySearch( return -1; } +/** + * Helper function to get the subtype range for a given type index. + * @param typeIdx the type index (0 to UPRV_LENGTHOF(gTypes)-1) + * @param start will be set to the starting index in gSubTypes + * @param end will be set to the ending index in gSubTypes (exclusive) + * @return the length of the range (end - start) + */ +static int32_t getSubtypeRange(int32_t typeIdx, int32_t &start, int32_t &end) { + U_ASSERT(typeIdx >= 0 && typeIdx < UPRV_LENGTHOF(gTypes)); + start = gOffsets[typeIdx]; + end = gOffsets[typeIdx + 1]; + return end - start; +} + +/** + * Binary search function that searches for a subtype in gSubTypes within the range + * corresponding to the given type. + * @param typeIdx the type index (0 to UPRV_LENGTHOF(gTypes)-1) + * @param key the subtype string to search for + * @return the index in gSubTypes if found, -1 if not found + */ +static int32_t binarySearch(int32_t typeIdx, StringPiece key) { + int32_t start, end; + (void)getSubtypeRange(typeIdx, start, end); + return binarySearch(gSubTypes, start, end, key); +} + MeasureUnit::MeasureUnit() : MeasureUnit(kBaseTypeIdx, kBaseSubTypeIdx) { } @@ -2586,6 +2650,9 @@ MeasureUnit::MeasureUnit(MeasureUnitImpl&& impl) : fImpl(nullptr), fSubTypeId(-1), fTypeId(-1) { if (!findBySubType(impl.identifier.data(), this)) { fImpl = new MeasureUnitImpl(std::move(impl)); + if (!fImpl) { + *this = MeasureUnit(); + } } } @@ -2677,7 +2744,8 @@ int32_t MeasureUnit::getAvailable( } int32_t idx = 0; for (int32_t typeIdx = 0; typeIdx < UPRV_LENGTHOF(gTypes); ++typeIdx) { - int32_t len = gOffsets[typeIdx + 1] - gOffsets[typeIdx]; + int32_t start, end; + int32_t len = getSubtypeRange(typeIdx, start, end); for (int32_t subTypeIdx = 0; subTypeIdx < len; ++subTypeIdx) { dest[idx].setTo(typeIdx, subTypeIdx); ++idx; @@ -2699,7 +2767,8 @@ int32_t MeasureUnit::getAvailable( if (typeIdx == -1) { return 0; } - int32_t len = gOffsets[typeIdx + 1] - gOffsets[typeIdx]; + int32_t start, end; + int32_t len = getSubtypeRange(typeIdx, start, end); if (destCapacity < len) { errorCode = U_BUFFER_OVERFLOW_ERROR; return len; @@ -2726,6 +2795,29 @@ StringEnumeration* MeasureUnit::getAvailableTypes(UErrorCode &errorCode) { return result; } +bool MeasureUnit::validateAndGet(StringPiece type, StringPiece subtype, MeasureUnit &result) { + // Find the type and subtype indices using binary search + int32_t typeIdx = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), type); + int32_t subtypeIdx = typeIdx >= 0 ? binarySearch(typeIdx, subtype) : -1; + + if (typeIdx >= 0 && subtypeIdx < 0) { + // if we did find the type, but didn't find the subtype, that might be because the sybtype name + // is an alias-- try using MeasureUnit::forIdentifier(), which will resolve aliases + UErrorCode localStatus = U_ZERO_ERROR; + MeasureUnit tempUnit = MeasureUnit::forIdentifier(subtype, localStatus); + if (U_SUCCESS(localStatus) && uprv_strcmp(type.data(), tempUnit.getType()) == 0) { + subtypeIdx = tempUnit.fSubTypeId + gOffsets[tempUnit.fTypeId]; + } + } + if (typeIdx < 0 || subtypeIdx < 0) { + return false; + } + + // Create the MeasureUnit and return it + result.setTo(typeIdx, subtypeIdx - gOffsets[typeIdx]); + return true; +} + bool MeasureUnit::findBySubType(StringPiece subType, MeasureUnit* output) { // Sanity checking kCurrencyOffset and final entry in gOffsets U_ASSERT(uprv_strcmp(gTypes[kCurrencyOffset], "currency") == 0); @@ -2736,7 +2828,7 @@ bool MeasureUnit::findBySubType(StringPiece subType, MeasureUnit* output) { if (t == kCurrencyOffset) { continue; } - int32_t st = binarySearch(gSubTypes, gOffsets[t], gOffsets[t + 1], subType); + int32_t st = binarySearch(t, subType); if (st >= 0) { output->setTo(t, st - gOffsets[t]); return true; @@ -2760,7 +2852,7 @@ void MeasureUnit::initTime(const char *timeId) { int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "duration"); U_ASSERT(result != -1); fTypeId = result; - result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], timeId); + result = binarySearch(fTypeId, timeId); U_ASSERT(result != -1); fSubTypeId = result - gOffsets[fTypeId]; } @@ -2769,8 +2861,7 @@ void MeasureUnit::initCurrency(StringPiece isoCurrency) { int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "currency"); U_ASSERT(result != -1); fTypeId = result; - result = binarySearch( - gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], isoCurrency); + result = binarySearch(fTypeId, isoCurrency); if (result == -1) { UErrorCode status = U_ZERO_ERROR; fImpl = new MeasureUnitImpl(MeasureUnitImpl::forCurrencyCode(isoCurrency, status)); diff --git a/deps/icu-small/source/i18n/messageformat2.cpp b/deps/icu-small/source/i18n/messageformat2.cpp index b7202ccb8ad6..4703202dc736 100644 --- a/deps/icu-small/source/i18n/messageformat2.cpp +++ b/deps/icu-small/source/i18n/messageformat2.cpp @@ -14,6 +14,7 @@ #include "unicode/messageformat2_formattable.h" #include "unicode/messageformat2.h" #include "unicode/normalizer2.h" +#include "unicode/ubidi.h" #include "unicode/unistr.h" #include "messageformat2_allocation.h" #include "messageformat2_checker.h" @@ -31,17 +32,36 @@ using namespace data_model; // ------------------------------------------------------ // Formatting -// The result of formatting a literal is just itself. -static Formattable evalLiteral(const Literal& lit) { - return Formattable(lit.unquoted()); + +// Arguments and literals +//----------------------- + +static UnicodeString varFallback(const VariableName& var) { + UnicodeString str(DOLLAR); + str += var; + return str; +} + +static UnicodeString functionFallback(const InternalValue& operand, + const FunctionName& functionName) { + UnicodeString fallbackStr; + // Create the fallback string for this function call + if (operand.isNullOperand()) { + fallbackStr = UnicodeString(COLON); + fallbackStr += functionName; + } else { + fallbackStr = operand.asFallback(); + } + return fallbackStr; } // Assumes that `var` is a message argument; returns the argument's value. -[[nodiscard]] FormattedPlaceholder MessageFormatter::evalArgument(const UnicodeString& fallback, - const VariableName& var, - MessageContext& context, - UErrorCode& errorCode) const { +[[nodiscard]] InternalValue MessageFormatter::evalArgument(const UnicodeString& fallback, + const VariableName& var, + MessageContext& context, + UErrorCode& errorCode) const { if (U_SUCCESS(errorCode)) { + // Look up the variable in the global environment const Formattable* val = context.getGlobal(var, errorCode); if (U_SUCCESS(errorCode)) { // Note: the fallback string has to be passed in because in a declaration like: @@ -52,7 +72,12 @@ static Formattable evalLiteral(const Literal& lit) { fallbackToUse += DOLLAR; fallbackToUse += var; } - return (FormattedPlaceholder(*val, fallbackToUse)); + // If it exists, create a BaseValue (FunctionValue) for it + LocalPointer result(BaseValue::create(locale, fallbackToUse, *val, false, errorCode)); + // Add fallback and return an InternalValue + if (U_SUCCESS(errorCode)) { + return InternalValue(result.orphan(), fallbackToUse); + } } } return {}; @@ -80,75 +105,219 @@ static UnicodeString reserialize(const UnicodeString& s) { } // Returns the contents of the literal -[[nodiscard]] FormattedPlaceholder MessageFormatter::formatLiteral(const UnicodeString& fallback, - const Literal& lit) const { - // The fallback for a literal is itself, unless another fallback is passed in - // (same reasoning as evalArgument()) - UnicodeString fallbackToUse = fallback.isEmpty() ? reserialize(lit.unquoted()) : fallback; - return FormattedPlaceholder(evalLiteral(lit), fallbackToUse); +[[nodiscard]] InternalValue MessageFormatter::evalLiteral(const UnicodeString& fallback, + const Literal& lit, + UErrorCode& errorCode) const { + // The fallback for a literal is itself, unless another fallback is passed + // in (same reasoning as evalArgument()) + UnicodeString fallbackToUse = !fallback.isEmpty() ? fallback : reserialize(lit.unquoted()); + + // Create a BaseValue (FunctionValue) that wraps the literal + LocalPointer val(BaseValue::create(locale, + fallbackToUse, + Formattable(lit.unquoted()), + true, + errorCode)); + if (U_SUCCESS(errorCode)) { + return InternalValue(val.orphan(), fallbackToUse); + } + return {}; } -[[nodiscard]] InternalValue* MessageFormatter::formatOperand(const UnicodeString& fallback, - const Environment& env, - const Operand& rand, - MessageContext& context, - UErrorCode &status) const { +// Operands +// -------- + +[[nodiscard]] InternalValue& MessageFormatter::evalVariableReference(const UnicodeString& fallback, + Environment& env, + const VariableName& var, + MessageContext& context, + UErrorCode &status) const { + // Check if it's local or global + // Note: there is no name shadowing; this is enforced by the parser + + // This code implements lazy call-by-need evaluation of locals. + // That is, the environment binds names to a closure, not a resolved value. + // The spec does not require either eager or lazy evaluation. + + // NFC-normalize the variable name. See + // https://github.com/unicode-org/message-format-wg/blob/main/spec/syntax.md#names-and-identifiers + const VariableName normalized = StandardFunctions::normalizeNFC(var); + + // Look up the variable in the environment + if (env.has(normalized)) { + // `var` is a local -- look it up + InternalValue& rhs = env.lookup(normalized); + // Evaluate the expression using the environment from the closure + // The name of this local variable is the fallback for its RHS. + UnicodeString newFallback(DOLLAR); + newFallback += var; + if (rhs.isClosure()) { + Closure& c = rhs.asClosure(); + InternalValue& result = evalExpression(newFallback, + c.getEnv(), + c.getExpr(), + context, + status); + // Overwrite the closure with the result of evaluation + if (result.isFallback()) { + rhs.update(result.asFallback()); + } else { + U_ASSERT(result.isEvaluated()); + + // The FunctionValue representing the right-hand side of this declaration + // might have a wasSetFromLiteral() method that returns true (i.e. if it's a BaseValue); + // But that value is being assigned to a variable here, so we need to + // ensure that wasSetFromLiteral() returns false. + // We accomplish this by wrapping it in a VariableValue. + LocalPointer variableValue(result.wrapInVariableValue(status)); + if (U_FAILURE(status) || !variableValue.isValid()) { + return result; + } + + InternalValue wrappedResult(variableValue.orphan(), result.asFallback()); + InternalValue& ref = env.createUnnamed(std::move(wrappedResult), status); + if (U_FAILURE(status)) { + return result; + } + // Create an indirection to the result returned + // by evalExpression() + rhs.update(ref); + } + } + // If it's already evaluated, just return the value + return rhs; + } + // Variable wasn't found in locals -- check if it's global + InternalValue result = evalArgument(fallback, normalized, context, status); + if (status == U_ILLEGAL_ARGUMENT_ERROR) { + status = U_ZERO_ERROR; + // Unbound variable -- set a resolution error + context.getErrors().setUnresolvedVariable(var, status); + // Use fallback per + // https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#fallback-resolution + return env.createFallback(varFallback(var), status); + } + // Looking up the global variable succeeded; return it + return env.createUnnamed(std::move(result), status); +} + +// InternalValues are passed as references into a global environment object +// that is live for the duration of one formatter call. +// They are mutable references so that they can be updated with a new value +// (when a closure is overwritten with the result of evaluating it), +// which can be shared across different references to the corresponding MF2 +// variable. +[[nodiscard]] InternalValue& MessageFormatter::evalOperand(const UnicodeString& fallback, + Environment& env, + const Operand& rand, + MessageContext& context, + UErrorCode &status) const { if (U_FAILURE(status)) { - return {}; + return env.bogus(); } + // Three cases: absent operand; variable; or literal + + // Absent (null) operand if (rand.isNull()) { - return create(InternalValue(FormattedPlaceholder()), status); + return env.createNull(status); } + // Variable reference if (rand.isVariable()) { - // Check if it's local or global - // Note: there is no name shadowing; this is enforced by the parser - const VariableName& var = rand.asVariable(); - // TODO: Currently, this code implements lazy evaluation of locals. - // That is, the environment binds names to a closure, not a resolved value. - // Eager vs. lazy evaluation is an open issue: - // see https://github.com/unicode-org/message-format-wg/issues/299 - - // NFC-normalize the variable name. See - // https://github.com/unicode-org/message-format-wg/blob/main/spec/syntax.md#names-and-identifiers - const VariableName normalized = StandardFunctions::normalizeNFC(var); - - // Look up the variable in the environment - if (env.has(normalized)) { - // `var` is a local -- look it up - const Closure& rhs = env.lookup(normalized); - // Format the expression using the environment from the closure - // The name of this local variable is the fallback for its RHS. - UnicodeString newFallback(DOLLAR); - newFallback += var; - return formatExpression(newFallback, rhs.getEnv(), rhs.getExpr(), context, status); - } - // Variable wasn't found in locals -- check if it's global - FormattedPlaceholder result = evalArgument(fallback, normalized, context, status); - if (status == U_ILLEGAL_ARGUMENT_ERROR) { - status = U_ZERO_ERROR; - // Unbound variable -- set a resolution error - context.getErrors().setUnresolvedVariable(var, status); - // Use fallback per - // https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#fallback-resolution - UnicodeString str(DOLLAR); - str += var; - return create(InternalValue(FormattedPlaceholder(str)), status); - } - return create(InternalValue(std::move(result)), status); - } else { + return evalVariableReference(fallback, env, rand.asVariable(), context, status); + } + // Literal + else { U_ASSERT(rand.isLiteral()); - return create(InternalValue(formatLiteral(fallback, rand.asLiteral())), status); + return env.createUnnamed(evalLiteral(fallback, rand.asLiteral(), status), status); } } +// Function calls +// -------------- + +// Looks up `functionName` and applies it to an operand and options, +// handling errors if the function is unbound +[[nodiscard]] InternalValue& MessageFormatter::apply(Environment& env, + const FunctionName& functionName, + InternalValue& rand, + FunctionOptions&& options, + MessageContext& context, + UErrorCode& status) const { + if (U_FAILURE(status)) + return env.bogus(); + + // Create the fallback string to use in case of an error + // calling the function + UnicodeString fallbackStr = functionFallback(rand, functionName); + + // Look up the function name + const Function* function = lookupFunction(functionName, status); + + if (U_FAILURE(status)) { // Handle unknown function + // Set error and use the fallback value + status = U_ZERO_ERROR; + context.getErrors().setUnknownFunction(functionName, status); + return env.createFallback(fallbackStr, status); + } // `function` is now known to be non-null + + // Value is not a fallback (checked by the caller), + // so we can safely call getValue() + const FunctionValue* functionArg(rand.getValue(status)); + U_ASSERT(U_SUCCESS(status)); + // Call the function + LocalPointer + functionResult(function->call(makeFunctionContext(options, functionName), + *functionArg, + std::move(options), + status)); + // Handle any errors signaled by the function + // (and use the fallback value) + UErrorCode savedStatus = status; + status = U_ZERO_ERROR; + if (U_MF_RECOVERABLE_ERROR(savedStatus)) { + if (savedStatus == U_MF_OPERAND_MISMATCH_ERROR) { + context.getErrors().setOperandMismatchError(functionName, status); + } else if (savedStatus == U_MF_FORMATTING_ERROR) { + context.getErrors().setFormattingError(functionName, status); + } else { + U_ASSERT(savedStatus == U_MF_BAD_OPTION); + context.getErrors().setBadOption(functionName, status); + } + return env.createFallback(fallbackStr, status); + } + // Non-recoverable error + if (U_FAILURE(savedStatus)) { + status = savedStatus; + return env.bogus(); + } // Success; return the result + return env.createUnnamed(InternalValue(functionResult.orphan(), fallbackStr), status); +} + +// Function options and context +// ---------------------------- + +FunctionContext MessageFormatter::makeFunctionContext(const FunctionOptions& options, const FunctionName& calledFunction) const { + // Look up "u:dir", and "u:id" in the options + + UMFBidiOption dir = ubidi_getMFOption(options.getStringFunctionOption(options::U_DIR)); + UnicodeString id = options.getStringFunctionOption(options::U_ID); + + return FunctionContext(locale, dir, id, calledFunction); +} + // Resolves a function's options -FunctionOptions MessageFormatter::resolveOptions(const Environment& env, const OptionMap& options, MessageContext& context, UErrorCode& status) const { +FunctionOptions MessageFormatter::resolveOptions(Environment& env, + const OptionMap& options, + MessageContext& context, + UErrorCode& status) const { + // Create a vector of options LocalPointer optionsVector(createUVector(status)); if (U_FAILURE(status)) { return {}; } LocalPointer resolvedOpt; + // For each option... for (int i = 0; i < options.size(); i++) { const Option& opt = options.getOption(i, status); if (U_FAILURE(status)) { @@ -157,158 +326,96 @@ FunctionOptions MessageFormatter::resolveOptions(const Environment& env, const O const UnicodeString& k = opt.getName(); const Operand& v = opt.getValue(); - // Options are fully evaluated before calling the function - // Format the operand - LocalPointer rhsVal(formatOperand({}, env, v, context, status)); - if (U_FAILURE(status)) { - return {}; - } - // Note: this means option values are "eagerly" evaluated. - // Currently, options don't have options. This will be addressed by the - // full FormattedPlaceholder redesign. - FormattedPlaceholder optValue = rhsVal->forceFormatting(context.getErrors(), status); - resolvedOpt.adoptInstead(create - (ResolvedFunctionOption(k, - optValue.asFormattable(), - v.isLiteral()), - status)); - if (U_FAILURE(status)) { - return {}; - } - optionsVector->adoptElement(resolvedOpt.orphan(), status); - } + // ...evaluate its right-hand side... + UErrorCode subStatus = U_ZERO_ERROR; + InternalValue& rhsVal = evalOperand({}, env, v, context, subStatus); + // ...giving a FunctionValue. + const FunctionValue* optVal = rhsVal.getValue(subStatus); + if (U_FAILURE(subStatus)) { // Ignore fallback values + continue; + } // The list of resolved options omits any fallback values + + // The option is resolved; add it to the vector + ResolvedFunctionOption resolvedOpt(k, *optVal, false); + LocalPointer + p(create(std::move(resolvedOpt), status)); + EMPTY_ON_ERROR(status); + optionsVector->adoptElement(p.orphan(), status); + } + // Return a new FunctionOptions constructed from the vector of options return FunctionOptions(std::move(*optionsVector), status); } -// Overload that dispatches on argument type. Syntax doesn't provide for options in this case. -[[nodiscard]] InternalValue* MessageFormatter::evalFunctionCall(FormattedPlaceholder&& argument, - MessageContext& context, - UErrorCode& status) const { - if (U_FAILURE(status)) { - return nullptr; - } - - // These cases should have been checked for already - U_ASSERT(!argument.isFallback() && !argument.isNullOperand()); - - const Formattable& toFormat = argument.asFormattable(); - switch (toFormat.getType()) { - case UFMT_OBJECT: { - const FormattableObject* obj = toFormat.getObject(status); - U_ASSERT(U_SUCCESS(status)); - U_ASSERT(obj != nullptr); - const UnicodeString& type = obj->tag(); - FunctionName functionName; - if (!getDefaultFormatterNameByType(type, functionName)) { - // No formatter for this type -- follow default behavior - break; - } - return evalFunctionCall(functionName, - create(std::move(argument), status), - FunctionOptions(), - context, - status); - } - default: { - // TODO: The array case isn't handled yet; not sure whether it's desirable - // to have a default list formatter - break; - } - } - // No formatter for this type, or it's a primitive type (which will be formatted later) - // -- just return the argument itself - return create(std::move(argument), status); -} - -// Overload that dispatches on function name -// Adopts `arg` -[[nodiscard]] InternalValue* MessageFormatter::evalFunctionCall(const FunctionName& functionName, - InternalValue* arg_, - FunctionOptions&& options, - MessageContext& context, - UErrorCode& status) const { - if (U_FAILURE(status)) { - return {}; - } - - LocalPointer arg(arg_); - - // Look up the formatter or selector - LocalPointer formatterImpl(nullptr); - LocalPointer selectorImpl(nullptr); - if (isFormatter(functionName)) { - formatterImpl.adoptInstead(getFormatter(functionName, status)); - U_ASSERT(U_SUCCESS(status)); - } - if (isSelector(functionName)) { - selectorImpl.adoptInstead(getSelector(context, functionName, status)); - U_ASSERT(U_SUCCESS(status)); - } - if (formatterImpl == nullptr && selectorImpl == nullptr) { - // Unknown function error - context.getErrors().setUnknownFunction(functionName, status); - - if (arg->hasNullOperand()) { - // Non-selector used as selector; an error would have been recorded earlier - UnicodeString fallback(COLON); - fallback += functionName; - return new InternalValue(FormattedPlaceholder(fallback)); - } else { - return new InternalValue(FormattedPlaceholder(arg->getFallback())); - } - } - return new InternalValue(arg.orphan(), - std::move(options), - functionName, - formatterImpl.isValid() ? formatterImpl.orphan() : nullptr, - selectorImpl.isValid() ? selectorImpl.orphan() : nullptr); -} - -// Formats an expression using `globalEnv` for the values of variables -[[nodiscard]] InternalValue* MessageFormatter::formatExpression(const UnicodeString& fallback, - const Environment& globalEnv, - const Expression& expr, - MessageContext& context, - UErrorCode &status) const { - if (U_FAILURE(status)) { - return {}; - } - - const Operand& rand = expr.getOperand(); - // Format the operand (formatOperand handles the case of a null operand) - LocalPointer randVal(formatOperand(fallback, globalEnv, rand, context, status)); - - FormattedPlaceholder maybeRand = randVal->takeArgument(status); - - if (!expr.isFunctionCall() && U_SUCCESS(status)) { - // Dispatch based on type of `randVal` - if (maybeRand.isFallback()) { - return randVal.orphan(); - } - return evalFunctionCall(std::move(maybeRand), context, status); - } else if (expr.isFunctionCall()) { - status = U_ZERO_ERROR; - const Operator* rator = expr.getOperator(status); - U_ASSERT(U_SUCCESS(status)); - const FunctionName& functionName = rator->getFunctionName(); - const OptionMap& options = rator->getOptionsInternal(); - // Resolve the options - FunctionOptions resolvedOptions = resolveOptions(globalEnv, options, context, status); - - // Call the formatter function - return evalFunctionCall(functionName, - randVal.orphan(), - std::move(resolvedOptions), - context, - status); +// Expressions +// ----------- +// Evaluates an expression using `globalEnv` for the values of variables +[[nodiscard]] InternalValue& MessageFormatter::evalExpression(const UnicodeString& fallback, + Environment& globalEnv, + const Expression& expr, + MessageContext& context, + UErrorCode &status) const { + if (U_FAILURE(status)) + return globalEnv.bogus(); + + // Evaluate the operand (evalOperand handles the case of a null operand) + InternalValue& randVal = evalOperand(fallback, globalEnv, expr.getOperand(), context, status); + + // If there's no function, we check for an implicit formatter + if (!expr.isFunctionCall()) { + const FunctionValue* contained = randVal.getValue(status); + if (U_FAILURE(status)) { + // Fallback or null -- no implicit formatter + status = U_ZERO_ERROR; + return randVal; + } // There might be an implicit formatter + const Formattable& toFormat = contained->unwrap(); + // If it has an object type, there might be an implicit formatter for it... + switch (toFormat.getType()) { + case UFMT_OBJECT: { + const FormattableObject* obj = toFormat.getObject(status); + U_ASSERT(U_SUCCESS(status)); + U_ASSERT(obj != nullptr); + const UnicodeString& type = obj->tag(); + FunctionName functionName; + if (!getDefaultFormatterNameByType(type, functionName)) { + // No formatter for this type -- follow default behavior + return randVal; + } + // ... apply the implicit formatter + return apply(globalEnv, + functionName, + randVal, + FunctionOptions(), + context, + status); + } // No formatters for other types, so just return the evaluated operand + default: + return randVal; + } // End of non-function-call case } else { - status = U_ZERO_ERROR; - return randVal.orphan(); + // Don't call the function on error values + if (randVal.isFallback()) + return randVal; + const Operator* rator = expr.getOperator(status); // Get the operator from the expression + U_ASSERT(U_SUCCESS(status)); // This must succeed since we checked that it's a function call + const FunctionName& functionName = rator->getFunctionName(); // Get function name + const OptionMap& options = rator->getOptionsInternal(); // Get options + FunctionOptions resolvedOptions = resolveOptions(globalEnv, options, context, status); // Resolve options + + // Call the function with the operand and arguments + return apply(globalEnv, functionName, + randVal, std::move(resolvedOptions), context, status); } } +// Patterns +// -------- + // Formats each text and expression part of a pattern, appending the results to `result` -void MessageFormatter::formatPattern(MessageContext& context, const Environment& globalEnv, const Pattern& pat, UErrorCode &status, UnicodeString& result) const { +void MessageFormatter::formatPattern(MessageContext& context, + Environment& globalEnv, + const Pattern& pat, + UErrorCode &status, UnicodeString& result) const { CHECK_ERROR(status); for (int32_t i = 0; i < pat.numParts(); i++) { @@ -316,24 +423,52 @@ void MessageFormatter::formatPattern(MessageContext& context, const Environment& if (part.isText()) { result += part.asText(); } else if (part.isMarkup()) { - // Markup is ignored + validateUOptionsOnMarkup(context, globalEnv, part.asMarkup(), status); } else { // Format the expression - LocalPointer partVal( - formatExpression({}, globalEnv, part.contents(), context, status)); - FormattedPlaceholder partResult = partVal->forceFormatting(context.getErrors(), - status); - // Force full evaluation, e.g. applying default formatters to - // unformatted input (or formatting numbers as strings) - result += partResult.formatToString(locale, status); - // Handle formatting errors. `formatToString()` can't take a context and thus can't - // register an error directly - if (status == U_MF_FORMATTING_ERROR) { - status = U_ZERO_ERROR; - // TODO: The name of the formatter that failed is unavailable. - // Not ideal, but it's hard for `formatToString()` - // to pass along more detailed diagnostics - context.getErrors().setFormattingError(status); + InternalValue& partVal = evalExpression({}, globalEnv, part.contents(), context, status); + if (partVal.isFallback()) { + result += LEFT_CURLY_BRACE; + result += partVal.asFallback(); + result += RIGHT_CURLY_BRACE; + } else { + // Get the `FunctionValue` corresponding to this part + const FunctionValue* val = partVal.getValue(status); + // It shouldn't be null or a fallback + U_ASSERT(U_SUCCESS(status)); + + // See comment in matchSelectorKeys() + bool badSelectOption = !checkSelectOption(*val); + + // Format the `FunctionValue` to a string + UnicodeString fmt = val->formatToString(status); + + // Apply bidi isolation to the formatted result + UMFDirectionality dir = val->getDirection(); + result += *(ubidi_isolate(bidiIsolationStrategy, + msgdir, + bidiIsolationStyle, + val->getDirectionAnnotation(), + dir, + fmt)); + + if (badSelectOption) { + context.getErrors().setBadOption(val->getFunctionName(), status); + CHECK_ERROR(status); + } + + // Handle formatting errors. `formatToString()` can't take a context and thus can't + // register an error directly + if (status == U_MF_FORMATTING_ERROR) { + status = U_ZERO_ERROR; + // The name of the formatter that failed is unavailable. + // Not ideal, but it's hard for `formatToString()` + // to pass along more detailed diagnostics + context.getErrors().setFormattingError(status); + } else if (status == U_MF_BAD_OPTION) { + status = U_ZERO_ERROR; + context.getErrors().setBadOption(status); + } } } } @@ -344,7 +479,7 @@ void MessageFormatter::formatPattern(MessageContext& context, const Environment& // See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#resolve-selectors // `res` is a vector of ResolvedSelectors -void MessageFormatter::resolveSelectors(MessageContext& context, const Environment& env, UErrorCode &status, UVector& res) const { +void MessageFormatter::resolveSelectors(MessageContext& context, Environment& env, UErrorCode &status, UVector& res) const { CHECK_ERROR(status); U_ASSERT(!dataModel.hasPattern()); @@ -354,8 +489,8 @@ void MessageFormatter::resolveSelectors(MessageContext& context, const Environme // 2. For each expression exp of the message's selectors for (int32_t i = 0; i < dataModel.numSelectors(); i++) { // 2i. Let rv be the resolved value of exp. - LocalPointer rv(formatOperand({}, env, Operand(selectors[i]), context, status)); - if (rv->canSelect()) { + InternalValue& rv = evalVariableReference({}, env, selectors[i], context, status); + if (rv.isSelectable()) { // 2ii. If selection is supported for rv: // (True if this code has been reached) } else { @@ -364,32 +499,50 @@ void MessageFormatter::resolveSelectors(MessageContext& context, const Environme // Append nomatch as the last element of the list res. // Emit a Selection Error. // (Note: in this case, rv, being a fallback, serves as `nomatch`) - DynamicErrors& err = context.getErrors(); - err.setSelectorError(rv->getFunctionName(), status); - rv.adoptInstead(new InternalValue(FormattedPlaceholder(rv->getFallback()))); - if (!rv.isValid()) { - status = U_MEMORY_ALLOCATION_ERROR; - return; - } + context.getErrors().setSelectorError({}, status); } // 2ii(a). Append rv as the last element of the list res. // (Also fulfills 2iii) - res.adoptElement(rv.orphan(), status); + LocalPointer v(create(std::move(rv), status)); + CHECK_ERROR(status); + res.adoptElement(v.orphan(), status); + } +} + +bool MessageFormatter::checkSelectOption(const FunctionValue& val) const { + const UnicodeString& name = val.getFunctionName(); + + if (name != functions::NUMBER && name != functions::INTEGER) { + return true; + } + + // Per the spec, if the "select" option is present, it must have been + // set from a literal + + // Returns false if the `select` option is present and it was not set from a literal + + const FunctionOptions& opts = val.getResolvedOptions(); + + // OK if the option wasn't present + UErrorCode localErrorCode = U_ZERO_ERROR; + opts.getFunctionOption(options::SELECT, localErrorCode); + if (U_FAILURE(localErrorCode)) { + return true; } + // Otherwise, return true if the option was set from a literal + return opts.wasSetFromLiteral(options::SELECT); } // See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#resolve-preferences // `keys` and `matches` are vectors of strings void MessageFormatter::matchSelectorKeys(const UVector& keys, MessageContext& context, - InternalValue* rv, // Does not adopt `rv` + InternalValue&& rv, UVector& keysOut, UErrorCode& status) const { CHECK_ERROR(status); - if (U_FAILURE(status)) { - // Return an empty list of matches - status = U_ZERO_ERROR; + if (!rv.isSelectable()) { return; } @@ -410,26 +563,37 @@ void MessageFormatter::matchSelectorKeys(const UVector& keys, LocalArray adoptedKeys(keysArr); // Create an array to hold the output - UnicodeString* prefsArr = new UnicodeString[keysLen]; + int32_t* prefsArr = static_cast(uprv_malloc(keysLen * sizeof(int32_t))); if (prefsArr == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } - LocalArray adoptedPrefs(prefsArr); + int32_t prefsLen = 0; // Call the selector - FunctionName name = rv->getFunctionName(); - rv->forceSelection(context.getErrors(), - adoptedKeys.getAlias(), keysLen, - adoptedPrefs.getAlias(), prefsLen, - status); + // Caller checked for fallback, so it's safe to call getValue() + const FunctionValue* rvVal = rv.getValue(status); + U_ASSERT(U_SUCCESS(status)); + + // This condition can't be checked in the selector. + bool badSelectOption = !checkSelectOption(*rvVal); + + rvVal->selectKeys(adoptedKeys.getAlias(), keysLen, prefsArr, prefsLen, + status); + + if (badSelectOption) { + context.getErrors().setBadOption(rvVal->getFunctionName(), status); + CHECK_ERROR(status); + // In this case, only the `*` variant should match + prefsLen = 0; + } // Update errors if (savedStatus != status) { if (U_FAILURE(status)) { status = U_ZERO_ERROR; - context.getErrors().setSelectorError(name, status); + context.getErrors().setSelectorError({}, status); } else { // Ignore warnings status = savedStatus; @@ -441,7 +605,8 @@ void MessageFormatter::matchSelectorKeys(const UVector& keys, // Copy the resulting keys (if there was no error) keysOut.removeAllElements(); for (int32_t i = 0; i < prefsLen; i++) { - UnicodeString* k = message2::create(std::move(prefsArr[i]), status); + UnicodeString* k = + message2::create(std::move(keysArr[prefsArr[i]]), status); if (k == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; @@ -449,12 +614,17 @@ void MessageFormatter::matchSelectorKeys(const UVector& keys, keysOut.adoptElement(k, status); CHECK_ERROR(status); } + + uprv_free(prefsArr); } // See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#resolve-preferences // `res` is a vector of FormattedPlaceholders; // `pref` is a vector of vectors of strings -void MessageFormatter::resolvePreferences(MessageContext& context, UVector& res, UVector& pref, UErrorCode &status) const { +void MessageFormatter::resolvePreferences(MessageContext& context, + UVector& res, + UVector& pref, + UErrorCode &status) const { CHECK_ERROR(status); // 1. Let pref be a new empty list of lists of strings. @@ -492,7 +662,7 @@ void MessageFormatter::resolvePreferences(MessageContext& context, UVector& res, } // 2iii. Let `rv` be the resolved value at index `i` of `res`. U_ASSERT(i < res.size()); - InternalValue* rv = static_cast(res[i]); + InternalValue rv = std::move(*(static_cast(res[i]))); // 2iv. Let matches be the result of calling the method MatchSelectorKeys(rv, keys) LocalPointer matches(createUVector(status)); matchSelectorKeys(*keys, context, std::move(rv), *matches, status); @@ -625,7 +795,10 @@ void MessageFormatter::sortVariants(const UVector& pref, UVector& vars, UErrorCo // 7. Select the pattern of `var` } -void MessageFormatter::formatSelectors(MessageContext& context, const Environment& env, UErrorCode &status, UnicodeString& result) const { +void MessageFormatter::formatSelectors(MessageContext& context, + Environment& env, + UErrorCode &status, + UnicodeString& result) const { CHECK_ERROR(status); // See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#pattern-selection @@ -665,28 +838,26 @@ void MessageFormatter::formatSelectors(MessageContext& context, const Environmen formatPattern(context, env, pat, status, result); } -// Note: this is non-const due to the function registry being non-const, which is in turn -// due to the values (`FormatterFactory` objects in the map) having mutable state. -// In other words, formatting a message can mutate the underlying `MessageFormatter` by changing -// state within the factory objects that represent custom formatters. +// Formatting to string +// -------------------- + UnicodeString MessageFormatter::formatToString(const MessageArguments& arguments, UErrorCode &status) { EMPTY_ON_ERROR(status); + // Create a new environment that will store closures for all local variables + Environment* env = Environment::create(status); + // Create a new context with the given arguments and the `errors` structure MessageContext context(arguments, *errors, status); - UnicodeString result; - if (!(errors->hasSyntaxError() || errors->hasDataModelError())) { - // Create a new environment that will store closures for all local variables - // Check for unresolved variable errors - // checkDeclarations needs a reference to the pointer to the environment - // since it uses its `env` argument as an out-parameter. So it needs to be - // temporarily not a LocalPointer... - Environment* env(Environment::create(status)); - checkDeclarations(context, env, status); - // ...and then it's adopted to avoid leaks - LocalPointer globalEnv(env); + // Check for unresolved variable errors + checkDeclarations(context, env, status); + LocalPointer globalEnv(env); + + DynamicErrors& err = context.getErrors(); + UnicodeString result; + if (!(err.hasSyntaxError() || err.hasDataModelError())) { if (dataModel.hasPattern()) { formatPattern(context, *globalEnv, dataModel.getPattern(), status, result); } else { @@ -711,6 +882,57 @@ UnicodeString MessageFormatter::formatToString(const MessageArguments& arguments return result; } +// Markup +// ------ + +// Evaluates `rand` and requires the value to be a string, setting `result` to it +// if so, and setting a bad option error if not +bool MessageFormatter::operandToStringWithBadOptionError(MessageContext& context, + Environment& globalEnv, + const Operand& rand, + UnicodeString& result, + UErrorCode& status) const { + EMPTY_ON_ERROR(status); + + InternalValue& iVal = evalOperand({}, globalEnv, rand, context, status); + EMPTY_ON_ERROR(status); + const FunctionValue* val = iVal.getValue(status); + U_ASSERT(U_SUCCESS(status)); + + result = val->unwrap().getString(status); + if (U_FAILURE(status)) { + status = U_ZERO_ERROR; + context.getErrors().setBadOption({}, status); + return false; + } + return true; +} + +// Validates u: options on markup parts -- see +// https://github.com/unicode-org/message-format-wg/blob/main/spec/u-namespace.md +void MessageFormatter::validateUOptionsOnMarkup(MessageContext& context, + Environment& globalEnv, + const Markup& markupPart, + UErrorCode& status) const { + CHECK_ERROR(status); + + const OptionMap& opts = markupPart.getOptionsInternal(); + for (int32_t i = 0; i < opts.len; i++) { + const Option& opt = opts.options[i]; + const UnicodeString& optionName = opt.getName(); + const Operand& optionValue = opt.getValue(); + + if (optionName == options::U_ID) { + UnicodeString ignore; + operandToStringWithBadOptionError(context, globalEnv, optionValue, ignore, status); + } else if (optionName == options::U_DIR) { + // Can't be set on markup + context.getErrors().setBadOption({}, status); + } + // Any other options are ignored + } +} + // ---------------------------------------- // Checking for resolution errors @@ -775,8 +997,10 @@ void MessageFormatter::checkDeclarations(MessageContext& context, Environment*& // memoizing the value of localEnv up to this point // Add the LHS to the environment for checking the next declaration - env = Environment::create(StandardFunctions::normalizeNFC(decl.getVariable()), - Closure(rhs, *env), + const VariableName& lhs = decl.getVariable(); + env = Environment::create(StandardFunctions::normalizeNFC(lhs), + Closure::create(rhs, *env, status), + varFallback(lhs), env, status); CHECK_ERROR(status); diff --git a/deps/icu-small/source/i18n/messageformat2_allocation.h b/deps/icu-small/source/i18n/messageformat2_allocation.h index 5b06d0851296..394d1e4b6dba 100644 --- a/deps/icu-small/source/i18n/messageformat2_allocation.h +++ b/deps/icu-small/source/i18n/messageformat2_allocation.h @@ -133,6 +133,18 @@ namespace message2 { return result; } + template + inline T* create(const T& node, UErrorCode& status) { + if (U_FAILURE(status)) { + return nullptr; + } + T* result = new T(node); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return result; + } + } // namespace message2 U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/messageformat2_data_model.cpp b/deps/icu-small/source/i18n/messageformat2_data_model.cpp index 56c92d3843aa..7dc546a615be 100644 --- a/deps/icu-small/source/i18n/messageformat2_data_model.cpp +++ b/deps/icu-small/source/i18n/messageformat2_data_model.cpp @@ -432,7 +432,7 @@ const Operator* Expression::getOperator(UErrorCode& status) const { status = U_INVALID_STATE_ERROR; return nullptr; } - U_ASSERT(rator); + U_ASSERT(rator.has_value()); return &(*rator); } diff --git a/deps/icu-small/source/i18n/messageformat2_errors.cpp b/deps/icu-small/source/i18n/messageformat2_errors.cpp index c4a96544fe68..8ed145bdab61 100644 --- a/deps/icu-small/source/i18n/messageformat2_errors.cpp +++ b/deps/icu-small/source/i18n/messageformat2_errors.cpp @@ -33,8 +33,8 @@ namespace message2 { addError(DynamicError(DynamicErrorType::BadOptionError, formatterName), status); } - void DynamicErrors::setRecoverableBadOption(const FunctionName& formatterName, UErrorCode& status) { - addError(DynamicError(DynamicErrorType::RecoverableBadOptionError, formatterName), status); + void DynamicErrors::setBadOption(UErrorCode& status) { + addError(DynamicError(DynamicErrorType::BadOptionError, UnicodeString("unknown formatter")), status); } void DynamicErrors::setOperandMismatchError(const FunctionName& formatterName, UErrorCode& status) { @@ -123,7 +123,7 @@ namespace message2 { } // Just handle the first error - // TODO: Eventually want to return all errors to caller + // TODO(ICU-23427): Eventually want to return all errors to caller if (count() == 0) { return; } @@ -145,8 +145,7 @@ namespace message2 { status = U_MF_FORMATTING_ERROR; break; } - case DynamicErrorType::BadOptionError: - case DynamicErrorType::RecoverableBadOptionError: { + case DynamicErrorType::BadOptionError: { status = U_MF_BAD_OPTION; break; } @@ -246,10 +245,6 @@ namespace message2 { resolutionAndFormattingErrors->adoptElement(errorP, status); break; } - case DynamicErrorType::RecoverableBadOptionError: { - resolutionAndFormattingErrors->adoptElement(errorP, status); - break; - } } } diff --git a/deps/icu-small/source/i18n/messageformat2_errors.h b/deps/icu-small/source/i18n/messageformat2_errors.h index 42cea5b2b123..4421a10eb444 100644 --- a/deps/icu-small/source/i18n/messageformat2_errors.h +++ b/deps/icu-small/source/i18n/messageformat2_errors.h @@ -67,16 +67,6 @@ namespace message2 { UnresolvedVariable, FormattingError, BadOptionError, - /** - This is used to signal errors from :number and :integer when a - bad `select` option is passed. In this case, fallback output - is not used, so it must be distinguished from a regular bad - option error (but it maps to a bad option error in the final - error code). - See https://github.com/unicode-org/message-format-wg/blob/main/spec/functions/number.md#number-selection - "The formatting of the _resolved value_ is not affected by the `select` option.") - */ - RecoverableBadOptionError, OperandMismatchError, SelectorError, UnknownFunction, @@ -141,7 +131,8 @@ namespace message2 { // Used when the name of the offending formatter is unknown void setFormattingError(UErrorCode&); void setBadOption(const FunctionName&, UErrorCode&); - void setRecoverableBadOption(const FunctionName&, UErrorCode&); + // Used when the name of the offending formatter is unknown + void setBadOption(UErrorCode&); void setOperandMismatchError(const FunctionName&, UErrorCode&); bool hasDataModelError() const { return staticErrors.hasDataModelError(); } bool hasFormattingError() const { return formattingError; } diff --git a/deps/icu-small/source/i18n/messageformat2_evaluation.cpp b/deps/icu-small/source/i18n/messageformat2_evaluation.cpp index 1a88ece4724f..64800de7b581 100644 --- a/deps/icu-small/source/i18n/messageformat2_evaluation.cpp +++ b/deps/icu-small/source/i18n/messageformat2_evaluation.cpp @@ -9,6 +9,7 @@ #if !UCONFIG_NO_MF2 +#include "unicode/ubidi.h" #include "messageformat2_allocation.h" #include "messageformat2_evaluation.h" #include "messageformat2_function_registry_internal.h" @@ -23,16 +24,85 @@ namespace message2 { using namespace data_model; +// BaseValue +// --------- + +BaseValue::BaseValue(const Locale& loc, const UnicodeString& fb, const Formattable& source, bool wasCreatedFromLiteral) + : locale(loc), fromLiteral(wasCreatedFromLiteral) { + innerValue = source; + fallback += LEFT_CURLY_BRACE; + fallback += fb; + fallback += RIGHT_CURLY_BRACE; +} + +/* static */ BaseValue* BaseValue::create(const Locale& locale, + const UnicodeString& fallback, + const Formattable& source, + bool wasCreatedFromLiteral, + UErrorCode& errorCode) { + return message2::create(BaseValue(locale, fallback, source, wasCreatedFromLiteral), errorCode); +} + +extern UnicodeString formattableToString(const Locale&, const Formattable&, UErrorCode&); + +UnicodeString BaseValue::formatToString(UErrorCode& errorCode) const { + return formattableToString(locale, innerValue, errorCode); +} + +BaseValue& BaseValue::operator=(BaseValue&& other) noexcept { + innerValue = std::move(other.innerValue); + opts = std::move(other.opts); + dir = other.dir; + inputDir = other.inputDir; + locale = other.locale; + fallback = other.fallback; + fromLiteral = other.fromLiteral; + + return *this; +} + +BaseValue::BaseValue(BaseValue&& other) { + *this = std::move(other); +} + +// VariableValue +// ------------- + +VariableValue::VariableValue(const FunctionValue* v) : underlyingValue(std::move(v)) {} + +/* static */ VariableValue* VariableValue::create(const FunctionValue* v, + UErrorCode& errorCode) { + return message2::create(VariableValue(std::move(v)), errorCode); +} + +VariableValue& VariableValue::operator=(VariableValue&& other) noexcept { + underlyingValue = other.underlyingValue; + + return *this; +} + +VariableValue::VariableValue(VariableValue&& other) { + *this = std::move(other); +} + +VariableValue::~VariableValue() { + underlyingValue = nullptr; // not owned +} + // Functions // ------------- ResolvedFunctionOption::ResolvedFunctionOption(ResolvedFunctionOption&& other) { - name = std::move(other.name); - value = std::move(other.value); - sourceIsLiteral = other.sourceIsLiteral; + *this = std::move(other); } -ResolvedFunctionOption::~ResolvedFunctionOption() {} +ResolvedFunctionOption::ResolvedFunctionOption(const UnicodeString& n, + const FunctionValue& f, + bool b) : name(n), value(&f), thisWasMerged(b) {} + +ResolvedFunctionOption::~ResolvedFunctionOption() { + value = nullptr; // value is not owned +} const ResolvedFunctionOption* FunctionOptions::getResolvedFunctionOptions(int32_t& len) const { @@ -49,59 +119,77 @@ FunctionOptions::FunctionOptions(UVector&& optionsVector, UErrorCode& status) { } // Returns false if option doesn't exist -UBool FunctionOptions::wasSetFromLiteral(const UnicodeString& key) const { +UBool FunctionOptions::wasSetFromLiteral(const std::u16string_view key) const { if (options == nullptr) { U_ASSERT(functionOptionsLen == 0); } for (int32_t i = 0; i < functionOptionsLen; i++) { const ResolvedFunctionOption& opt = options[i]; if (opt.getName() == key) { - return opt.isLiteral(); + // Require both: - opt's value was created from a literal; + // - opt does not originate from merging a previous options map + // with this one + return opt.getValue().wasCreatedFromLiteral() + && (!opt.wasMerged()); } } return false; } -UBool FunctionOptions::getFunctionOption(std::u16string_view key, Formattable& option) const { +const FunctionValue* +FunctionOptions::getFunctionOption(std::u16string_view key, + UErrorCode& status) const { if (options == nullptr) { U_ASSERT(functionOptionsLen == 0); } for (int32_t i = 0; i < functionOptionsLen; i++) { const ResolvedFunctionOption& opt = options[i]; if (opt.getName() == key) { - option = opt.getValue(); - return true; + return &opt.getValue(); } } - return false; + status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; } -UnicodeString FunctionOptions::getStringFunctionOption(std::u16string_view key) const { - Formattable option; - if (getFunctionOption(key, option)) { - if (option.getType() == UFMT_STRING) { - UErrorCode localErrorCode = U_ZERO_ERROR; - UnicodeString val = option.getString(localErrorCode); - U_ASSERT(U_SUCCESS(localErrorCode)); - return val; +UnicodeString +FunctionOptions::getStringFunctionOption(std::u16string_view k, UErrorCode& errorCode) const { + const FunctionValue* option = getFunctionOption(k, errorCode); + if (U_SUCCESS(errorCode)) { + UnicodeString result = option->formatToString(errorCode); + if (U_SUCCESS(errorCode)) { + return result; } } - // For anything else, including non-string values, return "". - // Alternately, could try to stringify the non-string option. - // (Currently, no tests require that.) return {}; } -FunctionOptions& FunctionOptions::operator=(FunctionOptions&& other) noexcept { - functionOptionsLen = other.functionOptionsLen; - options = other.options; - other.functionOptionsLen = 0; - other.options = nullptr; +UnicodeString FunctionOptions::getStringFunctionOption(std::u16string_view key) const { + UErrorCode localStatus = U_ZERO_ERROR; + + UnicodeString result = getStringFunctionOption(key, localStatus); + if (U_FAILURE(localStatus)) { + return {}; + } + return result; +} + +FunctionOptions& FunctionOptions::operator=(FunctionOptions other) noexcept { + swap(*this, other); return *this; } -FunctionOptions::FunctionOptions(FunctionOptions&& other) { - *this = std::move(other); +FunctionOptions::FunctionOptions(const FunctionOptions& other) { + U_ASSERT(!other.bogus); + functionOptionsLen = other.functionOptionsLen; + options = nullptr; + if (functionOptionsLen != 0) { + UErrorCode localStatus = U_ZERO_ERROR; + options = copyArray(other.options, functionOptionsLen, localStatus); + if (U_FAILURE(localStatus)) { + bogus = true; + } + } } FunctionOptions::~FunctionOptions() { @@ -122,19 +210,22 @@ static bool containsOption(const UVector& opts, const ResolvedFunctionOption& op } // Options in `this` take precedence -// `this` can't be used after mergeOptions is called -FunctionOptions FunctionOptions::mergeOptions(FunctionOptions&& other, - UErrorCode& status) { +FunctionOptions FunctionOptions::mergeOptions(const FunctionOptions& other, + UErrorCode& status) const { UVector mergedOptions(status); mergedOptions.setDeleter(uprv_deleteUObject); if (U_FAILURE(status)) { return {}; } + if (bogus || other.bogus) { + status = U_MEMORY_ALLOCATION_ERROR; + return {}; + } // Create a new vector consisting of the options from this `FunctionOptions` for (int32_t i = 0; i < functionOptionsLen; i++) { - mergedOptions.adoptElement(create(std::move(options[i]), status), + mergedOptions.adoptElement(create(options[i], status), status); } @@ -142,19 +233,151 @@ FunctionOptions FunctionOptions::mergeOptions(FunctionOptions&& other, for (int i = 0; i < other.functionOptionsLen; i++) { // Note: this is quadratic in the length of `options` if (!containsOption(mergedOptions, other.options[i])) { - mergedOptions.adoptElement(create(std::move(other.options[i]), - status), - status); + const ResolvedFunctionOption& oldOpt = other.options[i]; + ResolvedFunctionOption newOpt = ResolvedFunctionOption(oldOpt.name, *oldOpt.value, true); + mergedOptions.adoptElement(create(newOpt, status), + status); } } - delete[] options; - options = nullptr; - functionOptionsLen = 0; - return FunctionOptions(std::move(mergedOptions), status); } +// InternalValue +// ------------- + + +InternalValue::~InternalValue() {} + +InternalValue& InternalValue::operator=(InternalValue&& other) { + fallbackString = other.fallbackString; + val = std::move(other.val); + return *this; +} + +InternalValue::InternalValue(InternalValue&& other) { + *this = std::move(other); +} + +InternalValue::InternalValue(UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + + LocalPointer nv(new NullValue()); + if (!nv.isValid()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return; + } + val = std::move(nv); +} + +InternalValue::InternalValue(FunctionValue* v, const UnicodeString& fb) + : fallbackString(fb) { + U_ASSERT(v != nullptr); + val = LocalPointer(v); +} + +const FunctionValue* InternalValue::getValue(UErrorCode& status) const { + if (U_FAILURE(status)) { + return nullptr; + } + // If this is a closure or fallback, error out + if (!isEvaluated()) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + // Follow the indirection to get the value + if (isIndirection()) { + const InternalValue* other = *std::get_if(&val); + U_ASSERT(other != nullptr); + return other->getValue(status); + } + // Otherwise, return the contained FunctionValue + const LocalPointer* result = std::get_if>(&val); + U_ASSERT(result->isValid()); + return (*result).getAlias(); +} + +FunctionValue* InternalValue::wrapInVariableValue(UErrorCode& status) const { + if (U_FAILURE(status)) { + return nullptr; + } + const FunctionValue* inner = getValue(status); + if (U_FAILURE(status)) { + return nullptr; + } + return VariableValue::create(inner, status); +} + +bool InternalValue::isSelectable() const { + UErrorCode localStatus = U_ZERO_ERROR; + const FunctionValue* val = getValue(localStatus); + if (U_FAILURE(localStatus)) { + return false; + } + return val->isSelectable(); +} + +/* static */ LocalPointer InternalValue::null(UErrorCode& status) { + if (U_SUCCESS(status)) { + InternalValue* result = new InternalValue(status); + if (U_SUCCESS(status)) { + return LocalPointer(result); + } + } + return LocalPointer(); +} + +/* static */ LocalPointer InternalValue::fallback(const UnicodeString& s, + UErrorCode& status) { + if (U_SUCCESS(status)) { + InternalValue* result = new InternalValue(s); + if (U_SUCCESS(status)) { + return LocalPointer(result); + } + } + return LocalPointer(); +} + +/* static */ InternalValue InternalValue::closure(Closure* c, const UnicodeString& fb) { + U_ASSERT(c != nullptr); + return InternalValue(c, fb); +} + +bool InternalValue::isClosure() const { + return std::holds_alternative>(val); +} + +bool InternalValue::isEvaluated() const { + return std::holds_alternative>(val) || isIndirection(); +} + +bool InternalValue::isIndirection() const { + return std::holds_alternative(val); +} + +bool InternalValue::isNullOperand() const { + UErrorCode localStatus = U_ZERO_ERROR; + const FunctionValue* val = getValue(localStatus); + if (U_FAILURE(localStatus)) { + return false; + } + return val->isNullOperand(); +} + +void InternalValue::update(InternalValue& newVal) { + fallbackString = newVal.fallbackString; + val = &newVal; +} + +void InternalValue::update(LocalPointer newVal) { + val = std::move(newVal); +} + +void InternalValue::update(const UnicodeString& fb) { + fallbackString = fb; + val = fb; +} + // PrioritizedVariant // ------------------ @@ -169,33 +392,34 @@ PrioritizedVariant::~PrioritizedVariant() {} // ---------------- Environments and closures - Environment* Environment::create(const VariableName& var, Closure&& c, Environment* parent, UErrorCode& errorCode) { + Environment* Environment::create(const VariableName& var, Closure* c, + const UnicodeString& fallbackStr, + Environment* parent, UErrorCode& errorCode) { NULL_ON_ERROR(errorCode); - Environment* result = new NonEmptyEnvironment(var, std::move(c), parent); + Environment* result = new NonEmptyEnvironment(var, InternalValue::closure(c, fallbackStr), parent); if (result == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; - return nullptr; + return parent; } return result; } Environment* Environment::create(UErrorCode& errorCode) { NULL_ON_ERROR(errorCode); - Environment* result = new EmptyEnvironment(); - if (result == nullptr) { + Environment* result = new EmptyEnvironment(errorCode); + if (U_SUCCESS(errorCode) && result == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; return nullptr; } return result; } - const Closure& EmptyEnvironment::lookup(const VariableName& v) const { - (void) v; + InternalValue& EmptyEnvironment::lookup(const VariableName&) { U_ASSERT(false); UPRV_UNREACHABLE_EXIT; } - const Closure& NonEmptyEnvironment::lookup(const VariableName& v) const { + InternalValue& NonEmptyEnvironment::lookup(const VariableName& v) { if (v == var) { return rhs; } @@ -214,290 +438,95 @@ PrioritizedVariant::~PrioritizedVariant() {} return parent->has(v); } - Environment::~Environment() {} - NonEmptyEnvironment::~NonEmptyEnvironment() {} - EmptyEnvironment::~EmptyEnvironment() {} - - Closure::~Closure() {} - - // MessageContext methods - - void MessageContext::checkErrors(UErrorCode& status) const { - CHECK_ERROR(status); - errors.checkErrors(status); - } - - const Formattable* MessageContext::getGlobal(const VariableName& v, - UErrorCode& errorCode) const { - return arguments.getArgument(v, errorCode); - } - - MessageContext::MessageContext(const MessageArguments& args, - const StaticErrors& e, - UErrorCode& status) : arguments(args), errors(e, status) {} - - MessageContext::~MessageContext() {} - - // InternalValue - // ------------- - - bool InternalValue::isFallback() const { - return std::holds_alternative(argument) - && std::get_if(&argument)->isFallback(); - } - - bool InternalValue::hasNullOperand() const { - return std::holds_alternative(argument) - && std::get_if(&argument)->isNullOperand(); - } - - FormattedPlaceholder InternalValue::takeArgument(UErrorCode& errorCode) { - if (U_FAILURE(errorCode)) { - return {}; + InternalValue& EmptyEnvironment::createNull(UErrorCode& status) { + if (U_FAILURE(status)) { + return bogus(); } - - if (std::holds_alternative(argument)) { - return std::move(*std::get_if(&argument)); - } - errorCode = U_ILLEGAL_ARGUMENT_ERROR; - return {}; + LocalPointer val(InternalValue::null(status)); + return addUnnamedValue(std::move(val), status); } - const UnicodeString& InternalValue::getFallback() const { - if (std::holds_alternative(argument)) { - return std::get_if(&argument)->getFallback(); + InternalValue& EmptyEnvironment::createFallback(const UnicodeString& s, UErrorCode& status) { + if (U_FAILURE(status)) { + return bogus(); } - return (*std::get_if(&argument))->getFallback(); + LocalPointer val(InternalValue::fallback(s, status)); + return addUnnamedValue(std::move(val), status); } - const Selector* InternalValue::getSelector(UErrorCode& errorCode) const { - if (U_FAILURE(errorCode)) { - return nullptr; - } - - if (selector == nullptr) { - errorCode = U_ILLEGAL_ARGUMENT_ERROR; - } - return selector; - } - - InternalValue::InternalValue(FormattedPlaceholder&& arg) { - argument = std::move(arg); - selector = nullptr; - formatter = nullptr; - } - - InternalValue::InternalValue(InternalValue* operand, - FunctionOptions&& opts, - const FunctionName& functionName, - const Formatter* f, - const Selector* s) { - argument = operand; - options = std::move(opts); - name = functionName; - selector = s; - formatter = f; - U_ASSERT(selector != nullptr || formatter != nullptr); - } - - // `this` cannot be used after calling this method - void InternalValue::forceSelection(DynamicErrors& errs, - const UnicodeString* keys, - int32_t keysLen, - UnicodeString* prefs, - int32_t& prefsLen, - UErrorCode& errorCode) { - if (U_FAILURE(errorCode)) { - return; - } - - if (!canSelect()) { - errorCode = U_ILLEGAL_ARGUMENT_ERROR; - return; + InternalValue& EmptyEnvironment::createUnnamed(InternalValue&& v, UErrorCode& status) { + if (U_FAILURE(status)) { + return bogus(); } - // Find the argument and complete set of options by traversing `argument` - FunctionOptions opts; - InternalValue* p = this; - FunctionName selectorName = name; - - bool operandSelect = false; - while (std::holds_alternative(p->argument)) { - if (p->name != selectorName) { - // Can only compose calls to the same selector - errorCode = U_ILLEGAL_ARGUMENT_ERROR; - return; - } - // Very special case to detect something like: - // .local $sel = {1 :integer select=exact} .local $bad = {$sel :integer} .match $bad 1 {{ONE}} * {{operand select {$bad}}} - // This can be done better once function composition is fully implemented. - if (p != this && - !p->options.getStringFunctionOption(options::SELECT).isEmpty() - && (selectorName == functions::NUMBER || selectorName == functions::INTEGER)) { - // In this case, we want to call the selector normally but emit a - // `bad-option` error, possibly with the outcome of normal-looking output (with relaxed - // error handling) and an error (with strict error handling). - operandSelect = true; - } - // First argument to mergeOptions takes precedence - opts = opts.mergeOptions(std::move(p->options), errorCode); - if (U_FAILURE(errorCode)) { - return; - } - InternalValue* next = *std::get_if(&p->argument); - p = next; - } - FormattedPlaceholder arg = std::move(*std::get_if(&p->argument)); - - // This condition can't be checked in the selector. - // Effectively, there are two different kinds of "bad option" errors: - // one that can be recovered from (used for select=$var) and one that - // can't (used for bad digit size options and other cases). - // The checking of the recoverable error has to be done here; otherwise, - // the "bad option" signaled by the selector implementation would cause - // fallback output to be used when formatting the `*` pattern. - bool badSelectOption = !checkSelectOption(); - - selector->selectKey(std::move(arg), std::move(opts), - keys, keysLen, - prefs, prefsLen, errorCode); - if (errorCode == U_MF_SELECTOR_ERROR) { - errorCode = U_ZERO_ERROR; - errs.setSelectorError(selectorName, errorCode); - } else if (errorCode == U_MF_BAD_OPTION) { - errorCode = U_ZERO_ERROR; - errs.setBadOption(selectorName, errorCode); - } else if (operandSelect || badSelectOption) { - errs.setRecoverableBadOption(selectorName, errorCode); - // In this case, only the `*` variant should match - prefsLen = 0; + LocalPointer val(new InternalValue(std::move(v))); + if (!val.isValid()) { + return bogus(); } + return addUnnamedValue(std::move(val), status); } - bool InternalValue::checkSelectOption() const { - if (name != UnicodeString("number") && name != UnicodeString("integer")) { - return true; - } - - // Per the spec, if the "select" option is present, it must have been - // set from a literal - - Formattable opt; - // Returns false if the `select` option is present and it was not set from a literal - - // OK if the option wasn't present - if (!options.getFunctionOption(UnicodeString("select"), opt)) { - return true; - } - // Otherwise, return true if the option was set from a literal - return options.wasSetFromLiteral(UnicodeString("select")); + InternalValue& NonEmptyEnvironment::createNull(UErrorCode& status) { + return parent->createNull(status); } - FormattedPlaceholder InternalValue::forceFormatting(DynamicErrors& errs, UErrorCode& errorCode) { - if (U_FAILURE(errorCode)) { - return {}; - } - - if (formatter == nullptr && selector == nullptr) { - U_ASSERT(std::holds_alternative(argument)); - return std::move(*std::get_if(&argument)); - } - if (formatter == nullptr) { - errorCode = U_ILLEGAL_ARGUMENT_ERROR; - return {}; - } + InternalValue& NonEmptyEnvironment::createFallback(const UnicodeString& s, UErrorCode& status) { + return parent->createFallback(s, status); + } - FormattedPlaceholder arg; + InternalValue& NonEmptyEnvironment::createUnnamed(InternalValue&& v, UErrorCode& status) { + return parent->createUnnamed(std::move(v), status); + } - if (std::holds_alternative(argument)) { - arg = std::move(*std::get_if(&argument)); - } else { - arg = (*std::get_if(&argument))->forceFormatting(errs, - errorCode); + InternalValue& EmptyEnvironment::addUnnamedValue(LocalPointer val, + UErrorCode& status) { + if (U_FAILURE(status)) { + return bogus(); } + U_ASSERT(val.isValid()); + InternalValue* v = val.orphan(); + unnamedValues.adoptElement(v, status); + return *v; + } - if (U_FAILURE(errorCode)) { - return {}; - } + EmptyEnvironment::EmptyEnvironment(UErrorCode& status) : unnamedValues(UVector(status)) { + unnamedValues.setDeleter(uprv_deleteUObject); + } - if (arg.isFallback()) { - return arg; - } + Environment::~Environment() {} + NonEmptyEnvironment::~NonEmptyEnvironment() {} + EmptyEnvironment::~EmptyEnvironment() {} - // The fallback for a nullary function call is the function name - UnicodeString fallback; - if (arg.isNullOperand()) { - fallback = u":"; - fallback += name; - } else { - fallback = arg.getFallback(); - } + /* static */ Closure* Closure::create(const Expression& expr, Environment& env, + UErrorCode& status) { + NULL_ON_ERROR(status); - // Very special case for :number select=foo and :integer select=foo - // This check can't be done inside the function implementation because - // it doesn't have a way to both signal an error and return usable output, - // and the spec stipulates that fallback output shouldn't be used in the - // case of a bad `select` option to a formatting call. - bool badSelect = !checkSelectOption(); - - // Call the function with the argument - FormattedPlaceholder result = formatter->format(std::move(arg), std::move(options), errorCode); - if (U_SUCCESS(errorCode) && errorCode == U_USING_DEFAULT_WARNING) { - // Ignore this warning - errorCode = U_ZERO_ERROR; - } - if (U_FAILURE(errorCode)) { - if (errorCode == U_MF_OPERAND_MISMATCH_ERROR) { - errorCode = U_ZERO_ERROR; - errs.setOperandMismatchError(name, errorCode); - } else if (errorCode == U_MF_BAD_OPTION) { - errorCode = U_ZERO_ERROR; - errs.setBadOption(name, errorCode); - } else { - errorCode = U_ZERO_ERROR; - // Convey any other error generated by the formatter - // as a formatting error - errs.setFormattingError(name, errorCode); - } - } - // Ignore the output if any error occurred - // We don't ignore the output in the case of a Bad Option Error, - // because of the select=bad case where we want both an error - // and non-fallback output. - if (errs.hasFormattingError() || errs.hasBadOptionError()) { - return FormattedPlaceholder(fallback); - } - if (badSelect) { - // In this case, we want to set an error but not replace - // the output with a fallback - errs.setRecoverableBadOption(name, errorCode); + Closure* result = new Closure(expr, env); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; } return result; } - InternalValue& InternalValue::operator=(InternalValue&& other) noexcept { - argument = std::move(other.argument); - other.argument = nullptr; - options = std::move(other.options); - name = other.name; - selector = other.selector; - formatter = other.formatter; - other.selector = nullptr; - other.formatter = nullptr; + Closure::~Closure() {} + + // MessageContext methods - return *this; + void MessageContext::checkErrors(UErrorCode& status) const { + CHECK_ERROR(status); + errors.checkErrors(status); } - InternalValue::~InternalValue() { - delete selector; - selector = nullptr; - delete formatter; - formatter = nullptr; - if (std::holds_alternative(argument)) { - delete *std::get_if(&argument); - argument = nullptr; - } + const Formattable* MessageContext::getGlobal(const VariableName& v, + UErrorCode& errorCode) const { + return arguments.getArgument(v, errorCode); } + MessageContext::MessageContext(const MessageArguments& args, + const StaticErrors& e, + UErrorCode& status) : arguments(args), errors(e, status) {} + + MessageContext::~MessageContext() {} + } // namespace message2 U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/messageformat2_evaluation.h b/deps/icu-small/source/i18n/messageformat2_evaluation.h index f73b444229f5..dcbc6ab13066 100644 --- a/deps/icu-small/source/i18n/messageformat2_evaluation.h +++ b/deps/icu-small/source/i18n/messageformat2_evaluation.h @@ -32,11 +32,14 @@ U_NAMESPACE_BEGIN namespace message2 { namespace functions { + static constexpr std::u16string_view CURRENCY = u"currency"; static constexpr std::u16string_view DATETIME = u"datetime"; static constexpr std::u16string_view DATE = u"date"; static constexpr std::u16string_view TIME = u"time"; static constexpr std::u16string_view NUMBER = u"number"; static constexpr std::u16string_view INTEGER = u"integer"; + static constexpr std::u16string_view OFFSET = u"offset"; + static constexpr std::u16string_view PER_CENT = u"percent"; static constexpr std::u16string_view TEST_FUNCTION = u"test:function"; static constexpr std::u16string_view TEST_FORMAT = u"test:format"; static constexpr std::u16string_view TEST_SELECT = u"test:select"; @@ -45,6 +48,149 @@ namespace message2 { using namespace data_model; + class Closure; + class Environment; + + // InternalValue represents an intermediate value in the message + // formatter. + // It has four possible states: + // 1. Fallback Value. A fallback value + // is a string that serves as a replacement for expressions whose evaluation + // caused an error. Fallback values are not passed to functions. + // 2. Closure, representing the unevaluated right-hand side of a declaration. + // 3. Evaluated Value (FunctionValue), representing an evaluated declaration. + // 4. Indirection (const InternalValue*), representing a shared reference to another + // InternalValue. Note that all InternalValues are owned by the global + // environment. + /* + Example: + + .local $x = {$y} + .local $z = {1 :number} + .local $a = {$z} + {{ {$x} {$z} {$a} }} + + If this message is formatted with no arguments, + initially, x, z and a are all bound to Closures. + When the value of x is demanded by the pattern, the contents of x's value + are updated to a Fallback Value (because its RHS contains an unbound variable). + When the value of z is demanded, the contents of z's value are updated to + an Evaluated Value representing the result of :number on the operand. + When the value of a is demanded, the contents of a's value are updated to + an Indirection, pointing to z's value. + + Indirections are used so that a FunctionValue can be uniquely owned by an + InternalValue. Since all InternalValues are owned by the global Environment, + it's safe to use these non-owned pointers. + */ + class InternalValue : public UObject { + public: + bool isFallback() const { return std::holds_alternative(val); } + bool isNullOperand() const; + bool isEvaluated() const; + bool isClosure() const; + virtual bool isSelectable() const; + + Closure& asClosure() { + U_ASSERT(isClosure()); + return **std::get_if>(&val); + } + const FunctionValue* getValue(UErrorCode& status) const; + FunctionValue* wrapInVariableValue(UErrorCode& status) const; + + UnicodeString asFallback() const { return fallbackString; } + + static LocalPointer null(UErrorCode& status); + static LocalPointer fallback(const UnicodeString& s, UErrorCode& status); + // Adopts `c` + static InternalValue closure(Closure* c, const UnicodeString& s); + + // Updates the mutable contents of this InternalValue + void update(InternalValue&); + void update(LocalPointer); + void update(const UnicodeString&); + + InternalValue() : val(UnicodeString()) {} + explicit InternalValue(FunctionValue* v, const UnicodeString& fb); + InternalValue& operator=(InternalValue&&); + InternalValue(InternalValue&&); + virtual ~InternalValue(); + private: + UnicodeString fallbackString; + std::variant, // Unevaluated thunk + LocalPointer, // Evaluated value + const InternalValue*> val; // Indirection to another value -- Not owned + // Null operand constructor + explicit InternalValue(UErrorCode& status); + // Fallback constructor + explicit InternalValue(const UnicodeString& fb) + : fallbackString(fb), val(fb) {} + // Closure (unevaluated) constructor + explicit InternalValue(Closure* c, UnicodeString fallbackStr) + : fallbackString(fallbackStr), val(LocalPointer(c)) {} + bool isIndirection() const; + }; // class InternalValue + + + // A BaseValue wraps a literal value or argument value so it can be used + // in a context that expects a FunctionValue. + class BaseValue : public FunctionValue { + public: + static BaseValue* create(const Locale&, const UnicodeString&, const Formattable&, bool, UErrorCode&); + // Apply default formatters to the argument value + UnicodeString formatToString(UErrorCode&) const override; + UBool isSelectable() const override { return true; } + UBool wasCreatedFromLiteral() const override { return fromLiteral; } + BaseValue() {} + BaseValue(BaseValue&&); + BaseValue& operator=(BaseValue&&) noexcept; + private: + Locale locale; + bool fromLiteral = false; + + BaseValue(const Locale&, const UnicodeString&, const Formattable&, bool); + }; // class BaseValue + + // A NullValue represents the absence of an argument. + class NullValue : public FunctionValue { + public: + virtual UBool isNullOperand() const { return true; } + }; // class NullValue + + // A VariableValue wraps another FunctionValue and its sole purpose + // is to override the wasCreatedFromLiteral() method to always return false. + // This makes it easy to implement .local $foo = {exact}: the RHS returns a BaseValue + // such that wasCreatedFromLiteral() is true, but then we can wrap it in a VariableValue, + // which will always return false for this method. + class VariableValue : public FunctionValue { + public: + static VariableValue* create(const FunctionValue*, UErrorCode&); + UBool wasCreatedFromLiteral() const override { return false; } + UnicodeString formatToString(UErrorCode& status) const override { return underlyingValue->formatToString(status); } + const Formattable& unwrap() const override { return underlyingValue->unwrap(); } + const FunctionOptions& getResolvedOptions() const override { return underlyingValue->getResolvedOptions(); } + UMFDirectionality getDirection() const override { return underlyingValue->getDirection(); } + UMFBidiOption getDirectionAnnotation() const override { return underlyingValue->getDirectionAnnotation(); } + UBool isSelectable() const override { return underlyingValue->isSelectable(); } + UBool isNullOperand() const override { return underlyingValue->isNullOperand(); } + void selectKeys(const UnicodeString* keys, + int32_t keysLen, + int32_t* prefs, + int32_t& prefsLen, + UErrorCode& status) const override { return underlyingValue->selectKeys(keys, keysLen, prefs, prefsLen, status); } + const UnicodeString& getFunctionName() const override { return underlyingValue->getFunctionName(); } + const UnicodeString& getFallback() const override { return underlyingValue->getFallback(); } + VariableValue() {} + virtual ~VariableValue(); + VariableValue(VariableValue&&); + VariableValue& operator=(VariableValue&&) noexcept; + private: + const FunctionValue* underlyingValue; + + VariableValue(const FunctionValue*); + }; // class VariableValue + // PrioritizedVariant // For how this class is used, see the references to (integer, variant) tuples @@ -89,66 +235,106 @@ namespace message2 { const Expression& getExpr() const { return expr; } - const Environment& getEnv() const { + Environment& getEnv() const { return env; } - Closure(const Expression& expression, const Environment& environment) : expr(expression), env(environment) {} Closure(Closure&&) = default; + static Closure* create(const Expression&, Environment&, UErrorCode&); virtual ~Closure(); private: + Closure(const Expression& expression, Environment& environment) : expr(expression), env(environment) {} + // An unevaluated expression const Expression& expr; // The environment mapping names used in this // expression to other expressions - const Environment& env; + Environment& env; }; + class NonEmptyEnvironment; + // An environment is represented as a linked chain of // non-empty environments, terminating at an empty environment. // It's searched using linear search. class Environment : public UMemory { - public: - virtual bool has(const VariableName&) const = 0; - virtual const Closure& lookup(const VariableName&) const = 0; - static Environment* create(UErrorCode&); - static Environment* create(const VariableName&, Closure&&, Environment*, UErrorCode&); - virtual ~Environment(); + public: + virtual bool has(const VariableName&) const = 0; + virtual InternalValue& lookup(const VariableName&) = 0; + virtual InternalValue& bogus() = 0; + // For convenience so that InternalValue::getValue() can return a reference + // in error cases + FunctionValue& bogusFunctionValue() { return bogusFunctionVal; } + virtual InternalValue& createFallback(const UnicodeString&, UErrorCode&) = 0; + virtual InternalValue& createNull(UErrorCode&) = 0; + virtual InternalValue& createUnnamed(InternalValue&&, UErrorCode&) = 0; + static Environment* create(UErrorCode&); + static Environment* create(const VariableName&, Closure*, const UnicodeString&, + Environment*, UErrorCode&); + virtual ~Environment(); + + private: + FunctionValue bogusFunctionVal; }; - class NonEmptyEnvironment; + // The empty environment includes a "bogus" value to use when an + // InternalValue& is needed (e.g. error conditions), + // and a vector of "unnamed" values, so that the environment can + // own all InternalValues (even those arising from expressions + // that appear directly in a pattern and are not named). class EmptyEnvironment : public Environment { public: - EmptyEnvironment() = default; + EmptyEnvironment(UErrorCode& status); virtual ~EmptyEnvironment(); private: friend class Environment; bool has(const VariableName&) const override; - const Closure& lookup(const VariableName&) const override; + InternalValue& lookup(const VariableName&) override; + InternalValue& bogus() override { return bogusValue; } static EmptyEnvironment* create(UErrorCode&); - static NonEmptyEnvironment* create(const VariableName&, Closure&&, Environment*, UErrorCode&); + static NonEmptyEnvironment* create(const VariableName&, InternalValue, + Environment*, UErrorCode&); + + // Creates a fallback value owned by this Environment + InternalValue& createFallback(const UnicodeString&, UErrorCode&) override; + // Creates a null operand owned by this Environment + InternalValue& createNull(UErrorCode&) override; + // Creates an arbitrary value owned by this Environment + InternalValue& createUnnamed(InternalValue&&, UErrorCode&) override; + + InternalValue& addUnnamedValue(LocalPointer, UErrorCode&); + + InternalValue bogusValue; // Used in place of `nullptr` in error conditions + UVector unnamedValues; }; class NonEmptyEnvironment : public Environment { + public: + InternalValue* update(const VariableName&, InternalValue&&); private: friend class Environment; bool has(const VariableName&) const override; - const Closure& lookup(const VariableName&) const override; + InternalValue& lookup(const VariableName&) override; + InternalValue& bogus() override { return parent->bogus(); } static NonEmptyEnvironment* create(const VariableName&, Closure&&, const Environment*, UErrorCode&); virtual ~NonEmptyEnvironment(); private: friend class Environment; - NonEmptyEnvironment(const VariableName& v, Closure&& c, Environment* e) : var(v), rhs(std::move(c)), parent(e) {} + NonEmptyEnvironment(const VariableName& v, InternalValue c, Environment* e) : var(v), rhs(std::move(c)), parent(e) {} + + InternalValue& createFallback(const UnicodeString&, UErrorCode&) override; + InternalValue& createNull(UErrorCode&) override; + InternalValue& createUnnamed(InternalValue&&, UErrorCode&) override; // Maps VariableName onto Closure* // Chain of linked environments VariableName var; - Closure rhs; + InternalValue rhs; const LocalPointer parent; }; @@ -177,45 +363,6 @@ namespace message2 { }; // class MessageContext - // InternalValue - // ---------------- - - class InternalValue : public UObject { - public: - const FunctionName& getFunctionName() const { return name; } - bool canSelect() const { return selector != nullptr; } - const Selector* getSelector(UErrorCode&) const; - FormattedPlaceholder forceFormatting(DynamicErrors& errs, - UErrorCode& errorCode); - void forceSelection(DynamicErrors& errs, - const UnicodeString* keys, - int32_t keysLen, - UnicodeString* prefs, - int32_t& prefsLen, - UErrorCode& errorCode); - // Needs to be deep-copyable and movable - virtual ~InternalValue(); - InternalValue(FormattedPlaceholder&&); - // Formatter and selector may be null - InternalValue(InternalValue*, FunctionOptions&&, const FunctionName&, const Formatter*, - const Selector*); - const UnicodeString& getFallback() const; - bool isFallback() const; - bool hasNullOperand() const; - // Can't be used anymore after calling this - FormattedPlaceholder takeArgument(UErrorCode& errorCode); - InternalValue(InternalValue&& other) { *this = std::move(other); } - InternalValue& operator=(InternalValue&& other) noexcept; - private: - // InternalValue is owned (if present) - std::variant argument; - FunctionOptions options; - FunctionName name; - const Selector* selector; // May be null - const Formatter* formatter; // May be null, but one or the other should be non-null unless argument is a FormattedPlaceholder - bool checkSelectOption() const; - }; // class InternalValue - } // namespace message2 U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/messageformat2_formattable.cpp b/deps/icu-small/source/i18n/messageformat2_formattable.cpp index 0bbecaf25d77..58f12bc0e45a 100644 --- a/deps/icu-small/source/i18n/messageformat2_formattable.cpp +++ b/deps/icu-small/source/i18n/messageformat2_formattable.cpp @@ -10,10 +10,12 @@ #if !UCONFIG_NO_MF2 #include "unicode/messageformat2_formattable.h" +#include "unicode/messageformat2.h" #include "unicode/smpdtfmt.h" +#include "unicode/ubidi.h" #include "messageformat2_allocation.h" -#include "messageformat2_function_registry_internal.h" #include "messageformat2_macros.h" +#include "ubidiimp.h" #include "limits.h" @@ -21,17 +23,6 @@ U_NAMESPACE_BEGIN namespace message2 { - // Fallback values are enclosed in curly braces; - // see https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#formatting-fallback-values - - static UnicodeString fallbackToString(const UnicodeString& s) { - UnicodeString result; - result += LEFT_CURLY_BRACE; - result += s; - result += RIGHT_CURLY_BRACE; - return result; - } - Formattable& Formattable::operator=(Formattable other) noexcept { swap(*this, other); return *this; @@ -163,43 +154,6 @@ namespace message2 { FormattedMessage::~FormattedMessage() {} - FormattedValue::FormattedValue(const UnicodeString& s) { - type = kString; - stringOutput = std::move(s); - } - - FormattedValue::FormattedValue(number::FormattedNumber&& n) { - type = kNumber; - numberOutput = std::move(n); - } - - FormattedValue& FormattedValue::operator=(FormattedValue&& other) noexcept { - type = other.type; - if (type == kString) { - stringOutput = std::move(other.stringOutput); - } else { - numberOutput = std::move(other.numberOutput); - } - return *this; - } - - FormattedValue::~FormattedValue() {} - - FormattedPlaceholder& FormattedPlaceholder::operator=(FormattedPlaceholder&& other) noexcept { - type = other.type; - source = other.source; - if (type == kEvaluated) { - formatted = std::move(other.formatted); - previousOptions = std::move(other.previousOptions); - } - fallback = other.fallback; - return *this; - } - - const Formattable& FormattedPlaceholder::asFormattable() const { - return source; - } - // Default formatters // ------------------ @@ -219,7 +173,7 @@ namespace message2 { return number::NumberFormatter::withLocale(locale).formatDecimal(toFormat, errorCode); } - DateFormat* defaultDateTimeInstance(const Locale& locale, UErrorCode& errorCode) { + static DateFormat* defaultDateTimeInstance(const Locale& locale, UErrorCode& errorCode) { NULL_ON_ERROR(errorCode); LocalPointer df(DateFormat::createDateTimeInstance(DateFormat::SHORT, DateFormat::SHORT, locale)); if (!df.isValid()) { @@ -229,15 +183,41 @@ namespace message2 { return df.orphan(); } - // Called when output is required and the contents are an unevaluated `Formattable`; - // formats the source `Formattable` to a string with defaults, if it can be - // formatted with a default formatter - static FormattedPlaceholder formatWithDefaults(const Locale& locale, const FormattedPlaceholder& input, UErrorCode& status) { - if (U_FAILURE(status)) { - return {}; + TimeZone* createTimeZone(const DateInfo& dateInfo, UErrorCode& errorCode) { + NULL_ON_ERROR(errorCode); + + TimeZone* tz; + if (dateInfo.zoneId.isEmpty()) { + // Floating time value -- use default time zone + tz = TimeZone::createDefault(); + } else { + tz = TimeZone::createTimeZone(dateInfo.zoneId); } + if (tz == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return tz; + } + + void formatDateWithDefaults(const Locale& locale, + const DateInfo& dateInfo, + UnicodeString& result, + UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + + LocalPointer df(defaultDateTimeInstance(locale, errorCode)); + CHECK_ERROR(errorCode); + + df->adoptTimeZone(createTimeZone(dateInfo, errorCode)); + CHECK_ERROR(errorCode); + df->format(dateInfo.date, result, nullptr, errorCode); + } + + UnicodeString formattableToString(const Locale& locale, + const Formattable& toFormat, + UErrorCode& status) { + EMPTY_ON_ERROR(status); - const Formattable& toFormat = input.asFormattable(); // Try as decimal number first if (toFormat.isNumeric()) { // Note: the ICU Formattable has to be created here since the StringPiece @@ -249,38 +229,42 @@ namespace message2 { return {}; } if (asDecimal != nullptr) { - return FormattedPlaceholder(input, FormattedValue(formatNumberWithDefaults(locale, asDecimal, status))); + return formatNumberWithDefaults(locale, asDecimal, status).toString(status); } } UFormattableType type = toFormat.getType(); + UnicodeString result; + switch (type) { case UFMT_DATE: { - UnicodeString result; const DateInfo* dateInfo = toFormat.getDate(status); U_ASSERT(U_SUCCESS(status)); formatDateWithDefaults(locale, *dateInfo, result, status); - return FormattedPlaceholder(input, FormattedValue(std::move(result))); + break; } case UFMT_DOUBLE: { double d = toFormat.getDouble(status); U_ASSERT(U_SUCCESS(status)); - return FormattedPlaceholder(input, FormattedValue(formatNumberWithDefaults(locale, d, status))); + result = formatNumberWithDefaults(locale, d, status).toString(status); + break; } case UFMT_LONG: { int32_t l = toFormat.getLong(status); U_ASSERT(U_SUCCESS(status)); - return FormattedPlaceholder(input, FormattedValue(formatNumberWithDefaults(locale, l, status))); + result = formatNumberWithDefaults(locale, l, status).toString(status); + break; } case UFMT_INT64: { int64_t i = toFormat.getInt64Value(status); U_ASSERT(U_SUCCESS(status)); - return FormattedPlaceholder(input, FormattedValue(formatNumberWithDefaults(locale, i, status))); + result = formatNumberWithDefaults(locale, i, status).toString(status); + break; } case UFMT_STRING: { - const UnicodeString& s = toFormat.getString(status); + result = toFormat.getString(status); U_ASSERT(U_SUCCESS(status)); - return FormattedPlaceholder(input, FormattedValue(UnicodeString(s))); + break; } default: { // No default formatters for other types; use fallback @@ -288,43 +272,11 @@ namespace message2 { // Note: it would be better to set an internal formatting error so that a string // (e.g. the type tag) can be provided. However, this method is called by the // public method formatToString() and thus can't take a MessageContext - return FormattedPlaceholder(input.getFallback()); - } - } - } - - // Called when string output is required; forces output to be produced - // if none is present (including formatting number output as a string) - UnicodeString FormattedPlaceholder::formatToString(const Locale& locale, - UErrorCode& status) const { - if (U_FAILURE(status)) { return {}; } - if (isFallback() || isNullOperand()) { - return fallbackToString(fallback); } - // Evaluated value: either just return the string, or format the number - // as a string and return it - if (isEvaluated()) { - if (formatted.isString()) { - return formatted.getString(); - } else { - return formatted.getNumber().toString(status); - } - } - // Unevaluated value: first evaluate it fully, then format - UErrorCode savedStatus = status; - FormattedPlaceholder evaluated = formatWithDefaults(locale, *this, status); - if (status == U_MF_FORMATTING_ERROR) { - U_ASSERT(evaluated.isFallback()); - return evaluated.getFallback(); - } - // Ignore U_USING_DEFAULT_WARNING - if (status == U_USING_DEFAULT_WARNING) { - status = savedStatus; - } - return evaluated.formatToString(locale, status); + return result; } } // namespace message2 diff --git a/deps/icu-small/source/i18n/messageformat2_formatter.cpp b/deps/icu-small/source/i18n/messageformat2_formatter.cpp index 6c555ecbc0e2..29b782333d7e 100644 --- a/deps/icu-small/source/i18n/messageformat2_formatter.cpp +++ b/deps/icu-small/source/i18n/messageformat2_formatter.cpp @@ -19,11 +19,115 @@ #include "messageformat2_parser.h" #include "messageformat2_serializer.h" #include "uvector.h" // U_ASSERT +#include "mutex.h" +#include "ucln_in.h" U_NAMESPACE_BEGIN namespace message2 { +// Singleton for the standard function registry +class MF2RegistrySingleton : public UObject { +public: + MF2RegistrySingleton(UErrorCode &success); + ~MF2RegistrySingleton(){} + /** @return an alias to the standard registry */ + const MFFunctionRegistry* getStandardFunctionsRegistry() const { + return &standardMFFunctionRegistry; + } +private: + MFFunctionRegistry standardMFFunctionRegistry; +}; + +MF2RegistrySingleton::MF2RegistrySingleton(UErrorCode &success) { + // Set up the standard function registry + MFFunctionRegistry::Builder standardFunctionsBuilder(success); + + LocalPointer dateTime(StandardFunctions::DateTime::dateTime(success)); + LocalPointer date(StandardFunctions::DateTime::date(success)); + LocalPointer time(StandardFunctions::DateTime::time(success)); + LocalPointer currency(StandardFunctions::Number::currency(success)); + LocalPointer number(StandardFunctions::Number::number(success)); + LocalPointer offset(StandardFunctions::Number::offset(success)); + LocalPointer percent(StandardFunctions::Number::percent(success)); + LocalPointer integer(StandardFunctions::Number::integer(success)); + LocalPointer string(StandardFunctions::String::string(success)); + LocalPointer testFunction(StandardFunctions::TestFunction::testFunction(success)); + LocalPointer testFormat(StandardFunctions::TestFunction::testFormat(success)); + LocalPointer testSelect(StandardFunctions::TestFunction::testSelect(success)); + CHECK_ERROR(success); + standardFunctionsBuilder.adoptFunction(FunctionName(functions::DATETIME), + dateTime.orphan(), success) + .adoptFunction(FunctionName(functions::DATE), date.orphan(), success) + .adoptFunction(FunctionName(functions::TIME), time.orphan(), success) + .adoptFunction(FunctionName(functions::CURRENCY), currency.orphan(), success) + .adoptFunction(FunctionName(functions::NUMBER), + number.orphan(), success) + .adoptFunction(FunctionName(functions::OFFSET), + offset.orphan(), success) + .adoptFunction(FunctionName(functions::PER_CENT), + percent.orphan(), success) + .adoptFunction(FunctionName(functions::INTEGER), + integer.orphan(), success) + .adoptFunction(FunctionName(functions::STRING), + string.orphan(), success) + .adoptFunction(FunctionName(functions::TEST_FUNCTION), + testFunction.orphan(), success) + .adoptFunction(FunctionName(functions::TEST_FORMAT), + testFormat.orphan(), success) + .adoptFunction(FunctionName(functions::TEST_SELECT), + testSelect.orphan(), success); + CHECK_ERROR(success); + standardMFFunctionRegistry = standardFunctionsBuilder.build(); + CHECK_ERROR(success); + standardMFFunctionRegistry.checkStandard(); +} + +static MF2RegistrySingleton* mf2RegistrySingleton = nullptr; +static icu::UInitOnce gMF2RegistryInitOnce {}; + + // Clean up shared Registry objects + static UBool mf2_registry_cleanup() { + if (mf2RegistrySingleton != nullptr) { + delete mf2RegistrySingleton; + mf2RegistrySingleton = nullptr; + } + gMF2RegistryInitOnce.reset(); + return true; + } + + static void initRegistryOnce(UErrorCode& errorCode) { + U_ASSERT(mf2RegistrySingleton == nullptr); + + mf2RegistrySingleton = new MF2RegistrySingleton( errorCode); + + if (mf2RegistrySingleton == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + mf2_registry_cleanup(); + return; + } + ucln_i18n_registerCleanup(UCLN_I18N_MF2_REGISTRY, mf2_registry_cleanup); + } + + // ensure the registry is available + static void initRegistry(UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + umtx_initOnce(gMF2RegistryInitOnce, &initRegistryOnce, errorCode); + } + + // API: + const MFFunctionRegistry *MFFunctionRegistry::getStandardFunctionsRegistry(UErrorCode& errorCode) { + initRegistry(errorCode); + if (U_FAILURE(errorCode)) { + return nullptr; + } else if(mf2RegistrySingleton == nullptr) { + // return error if we are about to return nullptr + errorCode = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return mf2RegistrySingleton->getStandardFunctionsRegistry(); + } + // MessageFormatter::Builder // ------------------------------------- @@ -92,6 +196,24 @@ namespace message2 { return *this; } + MessageFormatter::Builder& + MessageFormatter::Builder::setBidiIsolationStrategy(UMFBidiIsolationStrategy strategy) { + bidiIsolationStrategy = strategy; + return *this; + } + + MessageFormatter::Builder& + MessageFormatter::Builder::setBidiContext(MessageFormatter::UMFBidiContext dir) { + msgdir = dir; + return *this; + } + + MessageFormatter::Builder& + MessageFormatter::Builder::setBidiIsolationStyle(UMFBidiIsolationStyle style) { + bidiStyle = style; + return *this; + } + /* This build() method is non-destructive, which entails the risk that its borrowed MFFunctionRegistry and (if the setDataModel() method was called) @@ -117,38 +239,32 @@ namespace message2 { } } + + static UMFDirectionality + resolveDirectionality(MessageFormatter::UMFBidiContext setting, const Locale& locale) { + switch (setting) { + case MessageFormatter::U_MF_BIDI_CONTEXT_LTR: + return U_MF_DIRECTIONALITY_LTR; + case MessageFormatter::U_MF_BIDI_CONTEXT_RTL: + return U_MF_DIRECTIONALITY_RTL; + default: + return locale.isRightToLeft() + ? U_MF_DIRECTIONALITY_RTL + : U_MF_DIRECTIONALITY_LTR; + } + } + // MessageFormatter MessageFormatter::MessageFormatter(const MessageFormatter::Builder& builder, UErrorCode &success) : locale(builder.locale), customMFFunctionRegistry(builder.customMFFunctionRegistry) { + standardMFFunctionRegistry = MFFunctionRegistry::getStandardFunctionsRegistry(success); CHECK_ERROR(success); - // Set up the standard function registry - MFFunctionRegistry::Builder standardFunctionsBuilder(success); - - FormatterFactory* dateTime = StandardFunctions::DateTimeFactory::dateTime(success); - FormatterFactory* date = StandardFunctions::DateTimeFactory::date(success); - FormatterFactory* time = StandardFunctions::DateTimeFactory::time(success); - FormatterFactory* number = new StandardFunctions::NumberFactory(); - FormatterFactory* integer = new StandardFunctions::IntegerFactory(); - standardFunctionsBuilder.adoptFormatter(FunctionName(functions::DATETIME), dateTime, success) - .adoptFormatter(FunctionName(functions::DATE), date, success) - .adoptFormatter(FunctionName(functions::TIME), time, success) - .adoptFormatter(FunctionName(functions::NUMBER), number, success) - .adoptFormatter(FunctionName(functions::INTEGER), integer, success) - .adoptFormatter(FunctionName(functions::TEST_FUNCTION), new StandardFunctions::TestFormatFactory(), success) - .adoptFormatter(FunctionName(functions::TEST_FORMAT), new StandardFunctions::TestFormatFactory(), success) - .adoptSelector(FunctionName(functions::NUMBER), new StandardFunctions::PluralFactory(UPLURAL_TYPE_CARDINAL), success) - .adoptSelector(FunctionName(functions::INTEGER), new StandardFunctions::PluralFactory(StandardFunctions::PluralFactory::integer()), success) - .adoptSelector(FunctionName(functions::STRING), new StandardFunctions::TextFactory(), success) - .adoptSelector(FunctionName(functions::TEST_FUNCTION), new StandardFunctions::TestSelectFactory(), success) - .adoptSelector(FunctionName(functions::TEST_SELECT), new StandardFunctions::TestSelectFactory(), success); - CHECK_ERROR(success); - standardMFFunctionRegistry = standardFunctionsBuilder.build(); - CHECK_ERROR(success); - standardMFFunctionRegistry.checkStandard(); - normalizedInput = builder.normalizedInput; signalErrors = builder.signalErrors; + bidiIsolationStrategy = builder.bidiIsolationStrategy; + bidiIsolationStyle = builder.bidiStyle; + msgdir = resolveDirectionality(builder.msgdir, locale); // Build data model // First, check that there is a data model @@ -196,6 +312,9 @@ namespace message2 { dataModel = std::move(other.dataModel); normalizedInput = std::move(other.normalizedInput); signalErrors = other.signalErrors; + bidiIsolationStrategy = other.bidiIsolationStrategy; + msgdir = other.msgdir; + bidiIsolationStyle = other.bidiIsolationStyle; errors = other.errors; other.errors = nullptr; return *this; @@ -221,138 +340,47 @@ namespace message2 { cleanup(); } - // Selector and formatter lookup - // ----------------------------- - - // Postcondition: selector != nullptr || U_FAILURE(status) - Selector* MessageFormatter::getSelector(MessageContext& context, const FunctionName& functionName, UErrorCode& status) const { - NULL_ON_ERROR(status); - U_ASSERT(isSelector(functionName)); - - const SelectorFactory* selectorFactory = lookupSelectorFactory(context, functionName, status); - NULL_ON_ERROR(status); - if (selectorFactory == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return nullptr; - } - // Create a specific instance of the selector - auto result = selectorFactory->createSelector(getLocale(), status); - NULL_ON_ERROR(status); - return result; - } - - // Returns an owned pointer - Formatter* MessageFormatter::getFormatter(const FunctionName& functionName, UErrorCode& status) const { - NULL_ON_ERROR(status); - - // Create the formatter - - // First, look up the formatter factory for this function - FormatterFactory* formatterFactory = lookupFormatterFactory(functionName, status); - NULL_ON_ERROR(status); - - U_ASSERT(formatterFactory != nullptr); - - // Create a specific instance of the formatter - Formatter* formatter = formatterFactory->createFormatter(locale, status); - NULL_ON_ERROR(status); - if (formatter == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return nullptr; - } - return formatter; - } - - bool MessageFormatter::getDefaultFormatterNameByType(const UnicodeString& type, - FunctionName& name) const { - if (!hasCustomMFFunctionRegistry()) { - return false; - } - const MFFunctionRegistry& reg = getCustomMFFunctionRegistry(); - return reg.getDefaultFormatterNameByType(type, name); - } - // --------------------------------------------------- // Function registry - bool MessageFormatter::isBuiltInSelector(const FunctionName& functionName) const { - return standardMFFunctionRegistry.hasSelector(functionName); - } - - bool MessageFormatter::isBuiltInFormatter(const FunctionName& functionName) const { - return standardMFFunctionRegistry.hasFormatter(functionName); + bool MessageFormatter::isBuiltInFunction(const FunctionName& functionName) const { + return standardMFFunctionRegistry->hasFunction(functionName); } - // https://github.com/unicode-org/message-format-wg/issues/409 - // Unknown function = unknown function error - // Formatter used as selector = selector error - // Selector used as formatter = formatting error - const SelectorFactory* MessageFormatter::lookupSelectorFactory(MessageContext& context, const FunctionName& functionName, UErrorCode& status) const { - DynamicErrors& err = context.getErrors(); + const Function* + MessageFormatter::lookupFunction(const FunctionName& functionName, + UErrorCode& status) const { + NULL_ON_ERROR(status); - if (isBuiltInSelector(functionName)) { - return standardMFFunctionRegistry.getSelector(functionName); - } - if (isBuiltInFormatter(functionName)) { - err.setSelectorError(functionName, status); - return nullptr; - } if (hasCustomMFFunctionRegistry()) { const MFFunctionRegistry& customMFFunctionRegistry = getCustomMFFunctionRegistry(); - const SelectorFactory* selectorFactory = customMFFunctionRegistry.getSelector(functionName); - if (selectorFactory != nullptr) { - return selectorFactory; - } - if (customMFFunctionRegistry.getFormatter(functionName) != nullptr) { - err.setSelectorError(functionName, status); - return nullptr; + const Function* function = customMFFunctionRegistry.getFunction(functionName); + if (function != nullptr) { + return function; } } + if (isBuiltInFunction(functionName)) { + return standardMFFunctionRegistry->getFunction(functionName); + } // Either there is no custom function registry and the function // isn't built-in, or the function doesn't exist in either the built-in // or custom registry. // Unknown function error - err.setUnknownFunction(functionName, status); + status = U_MF_UNKNOWN_FUNCTION_ERROR; return nullptr; } - FormatterFactory* MessageFormatter::lookupFormatterFactory(const FunctionName& functionName, - UErrorCode& status) const { - NULL_ON_ERROR(status); - - if (isBuiltInFormatter(functionName)) { - return standardMFFunctionRegistry.getFormatter(functionName); - } - if (isBuiltInSelector(functionName)) { - status = U_MF_FORMATTING_ERROR; - return nullptr; - } + bool MessageFormatter::getDefaultFormatterNameByType(const UnicodeString& tag, + FunctionName& result) const { if (hasCustomMFFunctionRegistry()) { const MFFunctionRegistry& customMFFunctionRegistry = getCustomMFFunctionRegistry(); - FormatterFactory* formatterFactory = customMFFunctionRegistry.getFormatter(functionName); - if (formatterFactory != nullptr) { - return formatterFactory; - } - if (customMFFunctionRegistry.getSelector(functionName) != nullptr) { - status = U_MF_FORMATTING_ERROR; - return nullptr; - } + return customMFFunctionRegistry.getDefaultFormatterNameByType(tag, result); } - // Either there is no custom function registry and the function - // isn't built-in, or the function doesn't exist in either the built-in - // or custom registry. - // Unknown function error - status = U_MF_UNKNOWN_FUNCTION_ERROR; - return nullptr; - } - - bool MessageFormatter::isCustomFormatter(const FunctionName& fn) const { - return hasCustomMFFunctionRegistry() && getCustomMFFunctionRegistry().getFormatter(fn) != nullptr; + return false; } - - bool MessageFormatter::isCustomSelector(const FunctionName& fn) const { - return hasCustomMFFunctionRegistry() && getCustomMFFunctionRegistry().getSelector(fn) != nullptr; + bool MessageFormatter::isCustomFunction(const FunctionName& fn) const { + return hasCustomMFFunctionRegistry() && getCustomMFFunctionRegistry().getFunction(fn) != nullptr; } } // namespace message2 diff --git a/deps/icu-small/source/i18n/messageformat2_function_registry.cpp b/deps/icu-small/source/i18n/messageformat2_function_registry.cpp index 3e924ce97804..c4b866ef8499 100644 --- a/deps/icu-small/source/i18n/messageformat2_function_registry.cpp +++ b/deps/icu-small/source/i18n/messageformat2_function_registry.cpp @@ -22,6 +22,7 @@ #include "charstr.h" #include "double-conversion.h" #include "messageformat2_allocation.h" +#include "messageformat2_evaluation.h" #include "messageformat2_function_registry_internal.h" #include "messageformat2_macros.h" #include "hash.h" @@ -46,83 +47,73 @@ namespace message2 { // Function registry implementation -Formatter::~Formatter() {} -Selector::~Selector() {} -FormatterFactory::~FormatterFactory() {} -SelectorFactory::~SelectorFactory() {} +Function::~Function() {} +FunctionValue::~FunctionValue() {} MFFunctionRegistry MFFunctionRegistry::Builder::build() { - U_ASSERT(formatters != nullptr && selectors != nullptr && formattersByType != nullptr); - MFFunctionRegistry result = MFFunctionRegistry(formatters, selectors, formattersByType); - formatters = nullptr; - selectors = nullptr; + U_ASSERT(functions != nullptr); + U_ASSERT(formattersByType != nullptr); + MFFunctionRegistry result = MFFunctionRegistry(functions, formattersByType); + functions = nullptr; formattersByType = nullptr; return result; } -MFFunctionRegistry::Builder& MFFunctionRegistry::Builder::adoptSelector(const FunctionName& selectorName, SelectorFactory* selectorFactory, UErrorCode& errorCode) { +MFFunctionRegistry::Builder& +MFFunctionRegistry::Builder::adoptFunction(const FunctionName& functionName, + Function* function, + UErrorCode& errorCode) { if (U_SUCCESS(errorCode)) { - U_ASSERT(selectors != nullptr); - selectors->put(selectorName, selectorFactory, errorCode); + U_ASSERT(functions != nullptr); + functions->put(functionName, function, errorCode); } return *this; } -MFFunctionRegistry::Builder& MFFunctionRegistry::Builder::adoptFormatter(const FunctionName& formatterName, FormatterFactory* formatterFactory, UErrorCode& errorCode) { - if (U_SUCCESS(errorCode)) { - U_ASSERT(formatters != nullptr); - formatters->put(formatterName, formatterFactory, errorCode); - } - return *this; -} - -MFFunctionRegistry::Builder& MFFunctionRegistry::Builder::setDefaultFormatterNameByType(const UnicodeString& type, const FunctionName& functionName, UErrorCode& errorCode) { +MFFunctionRegistry::Builder& +MFFunctionRegistry::Builder::setDefaultFormatterNameByType(const UnicodeString& type, + const FunctionName& functionName, + UErrorCode& errorCode) { if (U_SUCCESS(errorCode)) { U_ASSERT(formattersByType != nullptr); FunctionName* f = create(FunctionName(functionName), errorCode); formattersByType->put(type, f, errorCode); - } - return *this; -} + } + return *this; + } MFFunctionRegistry::Builder::Builder(UErrorCode& errorCode) { CHECK_ERROR(errorCode); - formatters = new Hashtable(); - selectors = new Hashtable(); + functions = new Hashtable(); formattersByType = new Hashtable(); - if (!(formatters != nullptr && selectors != nullptr && formattersByType != nullptr)) { + if (functions == nullptr || formattersByType == nullptr) { errorCode = U_MEMORY_ALLOCATION_ERROR; - } else { - formatters->setValueDeleter(uprv_deleteUObject); - selectors->setValueDeleter(uprv_deleteUObject); - formattersByType->setValueDeleter(uprv_deleteUObject); } + + functions->setValueDeleter(uprv_deleteUObject); + formattersByType->setValueDeleter(uprv_deleteUObject); } MFFunctionRegistry::Builder::~Builder() { - if (formatters != nullptr) { - delete formatters; - } - if (selectors != nullptr) { - delete selectors; + if (functions != nullptr) { + delete functions; + functions = nullptr; } if (formattersByType != nullptr) { delete formattersByType; + formattersByType = nullptr; } } // Returns non-owned pointer. Returns pointer rather than reference because it can fail. -// Returns non-const because FormatterFactory is mutable. -// TODO: This is unsafe because of the cached-formatters map -// (the caller could delete the resulting pointer) -FormatterFactory* MFFunctionRegistry::getFormatter(const FunctionName& formatterName) const { - U_ASSERT(formatters != nullptr); - return static_cast(formatters->get(formatterName)); +const Function* MFFunctionRegistry::getFunction(const FunctionName& functionName) const { + U_ASSERT(functions != nullptr); + return static_cast(functions->get(functionName)); } UBool MFFunctionRegistry::getDefaultFormatterNameByType(const UnicodeString& type, FunctionName& name) const { - U_ASSERT(formatters != nullptr); + U_ASSERT(formattersByType != nullptr); const FunctionName* f = static_cast(formattersByType->get(type)); if (f != nullptr) { name = *f; @@ -131,52 +122,34 @@ UBool MFFunctionRegistry::getDefaultFormatterNameByType(const UnicodeString& typ return false; } -const SelectorFactory* MFFunctionRegistry::getSelector(const FunctionName& selectorName) const { - U_ASSERT(selectors != nullptr); - return static_cast(selectors->get(selectorName)); -} - -bool MFFunctionRegistry::hasFormatter(const FunctionName& f) const { - return getFormatter(f) != nullptr; -} - -bool MFFunctionRegistry::hasSelector(const FunctionName& s) const { - return getSelector(s) != nullptr; +bool MFFunctionRegistry::hasFunction(const FunctionName& f) const { + return getFunction(f) != nullptr; } -void MFFunctionRegistry::checkFormatter(const char* s) const { +void MFFunctionRegistry::checkFunction(std::u16string_view s) const { #if U_DEBUG - U_ASSERT(hasFormatter(FunctionName(UnicodeString(s)))); + U_ASSERT(hasFunction(FunctionName(UnicodeString(s)))); #else (void) s; #endif } -void MFFunctionRegistry::checkSelector(const char* s) const { -#if U_DEBUG - U_ASSERT(hasSelector(FunctionName(UnicodeString(s)))); -#else - (void) s; -#endif -} - // Debugging void MFFunctionRegistry::checkStandard() const { - checkFormatter("datetime"); - checkFormatter("date"); - checkFormatter("time"); - checkFormatter("number"); - checkFormatter("integer"); - checkFormatter("test:function"); - checkFormatter("test:format"); - checkSelector("number"); - checkSelector("integer"); - checkSelector("string"); - checkSelector("test:function"); - checkSelector("test:select"); -} - -// Formatter/selector helpers + checkFunction(functions::DATETIME); + checkFunction(functions::DATE); + checkFunction(functions::TIME); + checkFunction(functions::CURRENCY); + checkFunction(functions::NUMBER); + checkFunction(functions::INTEGER); + checkFunction(functions::OFFSET); + checkFunction(functions::STRING); + checkFunction(functions::TEST_FUNCTION); + checkFunction(functions::TEST_FORMAT); + checkFunction(functions::TEST_SELECT); +} + +// Function/selector helpers // Returns the NFC-normalized version of s, returning s itself // if it's already normalized. @@ -206,9 +179,6 @@ static void strToDouble(const UnicodeString& s, double& result, UErrorCode& erro // Using en-US locale because it happens to correspond to the spec: // https://github.com/unicode-org/message-format-wg/blob/main/spec/registry.md#number-operands - // Ideally, this should re-use the code for parsing number literals (Parser::parseUnquotedLiteral()) - // It's hard to reuse the same code because of how parse errors work. - // TODO: Refactor LocalPointer numberFormat(NumberFormat::createInstance(Locale("en-US"), errorCode)); CHECK_ERROR(errorCode); icu::Formattable asNumber; @@ -250,33 +220,32 @@ static int64_t getInt64Value(const Locale& locale, const Formattable& value, UEr return 0; } -// Adopts its arguments -MFFunctionRegistry::MFFunctionRegistry(FormatterMap* f, SelectorMap* s, Hashtable* byType) : formatters(f), selectors(s), formattersByType(byType) { - U_ASSERT(f != nullptr && s != nullptr && byType != nullptr); +// Adopts its argument +MFFunctionRegistry::MFFunctionRegistry(FunctionMap* f, Hashtable* byType) + : functions(f), formattersByType(byType) { + U_ASSERT(f != nullptr); + U_ASSERT(byType != nullptr); } MFFunctionRegistry& MFFunctionRegistry::operator=(MFFunctionRegistry&& other) noexcept { cleanup(); - formatters = other.formatters; - selectors = other.selectors; + functions = other.functions; + other.functions = nullptr; formattersByType = other.formattersByType; - other.formatters = nullptr; - other.selectors = nullptr; other.formattersByType = nullptr; return *this; } void MFFunctionRegistry::cleanup() noexcept { - if (formatters != nullptr) { - delete formatters; - } - if (selectors != nullptr) { - delete selectors; + if (functions != nullptr) { + delete functions; + functions = nullptr; } if (formattersByType != nullptr) { delete formattersByType; + formattersByType = nullptr; } } @@ -285,7 +254,24 @@ MFFunctionRegistry::~MFFunctionRegistry() { cleanup(); } -// Specific formatter implementations +// Specific function implementations + +UMFDirectionality +outputDirectionalityFromUDir(UMFBidiOption uDir, const Locale& locale) { + switch (uDir) { + case U_MF_BIDI_OPTION_LTR: + return U_MF_DIRECTIONALITY_LTR; + case U_MF_BIDI_OPTION_RTL: + return U_MF_DIRECTIONALITY_RTL; + case U_MF_BIDI_OPTION_AUTO: + case U_MF_BIDI_OPTION_INHERIT: + if (locale.isRightToLeft()) { + return U_MF_DIRECTIONALITY_RTL; + } + return U_MF_DIRECTIONALITY_LTR; + } + return U_MF_DIRECTIONALITY_LTR; +} // --------- Number @@ -328,7 +314,7 @@ bool validateNumberLiteral(const UnicodeString& s) { // Parse integer digits // (%x30 / (%x31-39 *DIGIT)) if (s[i] == '0') { - if (!inBounds(s, i + 1) || s[i + 1] != PERIOD) { + if (inBounds(s, i + 1) && s[i + 1] != PERIOD) { return false; } i++; @@ -395,34 +381,299 @@ bool isInteger(const Formattable& s) { } } -bool isDigitSizeOption(const UnicodeString& s) { - return s == UnicodeString("minimumIntegerDigits") - || s == UnicodeString("minimumFractionDigits") - || s == UnicodeString("maximumFractionDigits") - || s == UnicodeString("minimumSignificantDigits") - || s == UnicodeString("maximumSignificantDigits"); +bool isDigitSizeOption(std::u16string_view s) { + return s == options::FRACTION_DIGITS + || s == options::MINIMUM_INTEGER_DIGITS + || s == options::MINIMUM_FRACTION_DIGITS + || s == options::MAXIMUM_FRACTION_DIGITS + || s == options::MINIMUM_SIGNIFICANT_DIGITS + || s == options::MAXIMUM_SIGNIFICANT_DIGITS + || s == options::ADD + || s == options::SUBTRACT; } /* static */ void StandardFunctions::validateDigitSizeOptions(const FunctionOptions& opts, UErrorCode& status) { CHECK_ERROR(status); - for (int32_t i = 0; i < opts.optionsCount(); i++) { const ResolvedFunctionOption& opt = opts.options[i]; - if (isDigitSizeOption(opt.getName()) && !isInteger(opt.getValue())) { + if (opt.getName() == options::FRACTION_DIGITS) { + UErrorCode localStatus = U_ZERO_ERROR; + auto s = opt.getValue().unwrap().getString(localStatus); + if (U_SUCCESS(localStatus) && s == options::AUTO) { + continue; + } + } + if (isDigitSizeOption(opt.getName()) && !isInteger(opt.getValue().unwrap())) { status = U_MF_BAD_OPTION; return; } } } +static double parseNumberLiteral(const UnicodeString& inputStr, UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return {}; + } + + // Validate string according to `number-literal` production + // in the spec for `:number`. This is because some cases are + // forbidden by this grammar, but allowed by StringToDouble. + if (!validateNumberLiteral(inputStr)) { + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + return 0; + } + + // Convert to double using double_conversion::StringToDoubleConverter + using namespace double_conversion; + int processedCharactersCount = 0; + StringToDoubleConverter converter(0, 0, 0, "", ""); + int32_t len = inputStr.length(); + double result = + converter.StringToDouble(reinterpret_cast(inputStr.getBuffer()), + len, + &processedCharactersCount); + if (processedCharactersCount != len) { + errorCode = U_MF_OPERAND_MISMATCH_ERROR; + } + return result; +} + +static UNumberFormatRoundingMode validateRoundingMode(const UnicodeString& opt, UErrorCode& status) { + if (U_FAILURE(status)) { + return UNumberFormatRoundingMode::UNUM_ROUND_HALFUP; + } + if (opt.isEmpty()) { + return UNumberFormatRoundingMode::UNUM_ROUND_HALFUP; + } + if (opt == options::CEIL) { + return UNumberFormatRoundingMode::UNUM_ROUND_CEILING; + } + if (opt == options::FLOOR) { + return UNumberFormatRoundingMode::UNUM_ROUND_FLOOR; + } + if (opt == options::EXPAND) { + return UNumberFormatRoundingMode::UNUM_ROUND_UP; + } + if (opt == options::TRUNC) { + return UNumberFormatRoundingMode::UNUM_ROUND_DOWN; + } + if (opt == options::HALF_CEIL) { + return UNumberFormatRoundingMode::UNUM_ROUND_HALF_CEILING; + } + if (opt == options::HALF_FLOOR) { + return UNumberFormatRoundingMode::UNUM_ROUND_HALF_FLOOR; + } + if (opt == options::HALF_EXPAND) { + return UNumberFormatRoundingMode::UNUM_ROUND_HALFUP; + } + if (opt == options::HALF_TRUNC) { + return UNumberFormatRoundingMode::UNUM_ROUND_HALFDOWN; + } + if (opt == options::HALF_EVEN) { + return UNumberFormatRoundingMode::UNUM_ROUND_HALFEVEN; + } + status = U_MF_BAD_OPTION; + return UNumberFormatRoundingMode::UNUM_ROUND_HALFUP; +} + +static int validateRoundingIncrement(const UnicodeString& opt, UErrorCode& status) { + if (U_FAILURE(status)) { + return -1; + } + + if (opt.isEmpty()) { + return 1; + } + + double num = parseNumberLiteral(opt, status); + if (U_FAILURE(status)) { + return -1; + } + + int result = std::trunc(num); + + if (num != result) { + status = U_MF_BAD_OPTION; + return -1; + } + + switch (result) { + case 1: + case 2: + case 5: + case 10: + case 20: + case 25: + case 50: + case 100: + case 200: + case 250: + case 500: + case 1000: + case 2000: + case 2500: + case 5000: + return result; + default: { + status = U_MF_BAD_OPTION; + return -1; + } + } +} + +/* static */ StandardFunctions::Number* +StandardFunctions::Number::currency(UErrorCode& success) { + return create(NumberType::kCurrency, success); +} + +/* static */ StandardFunctions::Number* +StandardFunctions::Number::integer(UErrorCode& success) { + return create(NumberType::kInteger, success); +} + +/* static */ StandardFunctions::Number* +StandardFunctions::Number::number(UErrorCode& success) { + return create(NumberType::kNumber, success); +} + +/* static */ StandardFunctions::Number* +StandardFunctions::Number::offset(UErrorCode& success) { + return create(NumberType::kOffset, success); +} + +/* static */ StandardFunctions::Number* +StandardFunctions::Number::percent(UErrorCode& success) { + return create(NumberType::kPercent, success); +} + +/* static */ StandardFunctions::Number* +StandardFunctions::Number::create(StandardFunctions::NumberType numberType, UErrorCode& success) { + NULL_ON_ERROR(success); + + LocalPointer result(new Number(numberType)); + if (!result.isValid()) { + success = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + return result.orphan(); +} + +LocalPointer StandardFunctions::Number::call(const FunctionContext& context, + const FunctionValue& operand, + const FunctionOptions& options, + UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return LocalPointer(); + } + LocalPointer + val(new NumberValue(*this, context, operand, options, errorCode)); + if (!val.isValid()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + return val; +} + +void StandardFunctions::requireNoRoundingIncrement(const FunctionOptions& opts, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + UnicodeString opt = opts.getStringFunctionOption(options::ROUNDING_INCREMENT); + if (!opt.isEmpty()) { + status = U_MF_BAD_OPTION; + } +} + +static number::Precision significantDigits(int32_t min, int32_t max) { + using namespace number; + + Precision p = Precision::unlimited(); + U_ASSERT(min != -1 || max != -1); + if (min != -1 && max != -1) { + p = Precision::minMaxSignificantDigits(min, max); + } else if (min != -1) { + p = Precision::minSignificantDigits(min); + } else { + p = Precision::maxSignificantDigits(max); + } + return p; +} + +static number::Precision significantDigitsWithRoundingPriority(int32_t min, int32_t max, const number::FractionPrecision& p, UNumberRoundingPriority priority) { + using namespace number; + + U_ASSERT(priority == UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_RELAXED || priority == UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_STRICT); + Precision result = Precision::unlimited(); + U_ASSERT(min != -1 || max != -1); + if (min != -1 && max != -1) { + result = p.withSignificantDigits(min, max, priority); + } else if (min != -1) { + // Only the maximum precision value is used for the calculation + } else { + result = p.withSignificantDigits(1, max, priority); + } + return result; +} + +// This function is only used when formatting currency. +// It extracts the user-provided `roundingIncrement` option from the function +// options. If no such option was provided, it returns the default currency formatter. +// If the option was provided, it validates the option's value according to the +// Unicode MessageFormat spec, setting the `status` argument if validation fails. +// If validation succeeds, the option value is divided by 100 to achieve +// cents-based rounding, returning a `number::Precision` object that formats +// numbers with the given rounding increment and minium fraction digits. +// The out-parameter `hasIncrement` is set to true if and only if a valid +// `roundingIncrement` option was provided. +number::Precision StandardFunctions::withRoundingIncrement(const FunctionOptions& opts, bool& hasIncrement, int32_t minFractionDigits, UErrorCode& status) { + using namespace number; + + UErrorCode localStatus = U_ZERO_ERROR; + UnicodeString roundingIncrement = opts.getStringFunctionOption(options::ROUNDING_INCREMENT, localStatus); + int increment = 1; + if (U_SUCCESS(localStatus)) { + increment = validateRoundingIncrement(roundingIncrement, status); + if (U_FAILURE(status)) { + status = U_MF_BAD_OPTION; + return CurrencyPrecision::currency(UCURR_USAGE_STANDARD); + } + } + if (increment != 1) { + hasIncrement = true; + } + // Divide by 100 to get cents-based rounding + double incrementToUse = U_SUCCESS(localStatus) ? increment / 100.0 : 0.01; + return Precision::increment(incrementToUse).withMinFraction(minFractionDigits); +} + /* static */ number::LocalizedNumberFormatter StandardFunctions::formatterForOptions(const Number& number, + const Locale& locale, const FunctionOptions& opts, + bool usePercent, UErrorCode& status) { number::UnlocalizedNumberFormatter nf; using namespace number; + UnicodeString currency; + CurrencyUnit currencyUnit; + if (number.numberType == NumberType::kCurrency) { + currency = opts.getStringFunctionOption(options::CURRENCY); + if (currency.isEmpty()) { + status = U_MF_OPERAND_MISMATCH_ERROR; + return {}; + } + // Validate currency code + currencyUnit = CurrencyUnit(currency.getBuffer(), status); + if (U_FAILURE(status)) { + // Either the operand is numeric (in which case the spec says + // "A numeric operand without a currency option results in a Bad Operand error") + // or it's non-numeric, in which case the error will be U_MF_OPERAND_MISMATCH_ERROR anyway. + status = U_MF_OPERAND_MISMATCH_ERROR; + return {}; + } + } + validateDigitSizeOptions(opts, status); if (U_FAILURE(status)) { return {}; @@ -431,14 +682,13 @@ bool isDigitSizeOption(const UnicodeString& s) { if (U_SUCCESS(status)) { Formattable opt; nf = NumberFormatter::with(); - bool isInteger = number.isInteger; - if (isInteger) { + if (number.numberType == NumberType::kInteger) { nf = nf.precision(Precision::integer()); } // Notation options - if (!isInteger) { + if (number.numberType == NumberType::kNumber || number.numberType == NumberType::kPercent) { // These options only apply to `:number` // Default notation is simple @@ -460,43 +710,145 @@ bool isDigitSizeOption(const UnicodeString& s) { // Already set to default } nf = nf.notation(notation); - } - // Style options -- specific to `:number` - if (!isInteger) { - if (number.usePercent(opts)) { + if (number.numberType == NumberType::kPercent && usePercent) { nf = nf.unit(NoUnit::percent()).scale(Scale::powerOfTen(2)); } } int32_t maxSignificantDigits = number.maximumSignificantDigits(opts); - if (!isInteger) { + if (number.numberType == NumberType::kCurrency || number.numberType == NumberType::kNumber + || number.numberType == NumberType::kPercent) { int32_t minFractionDigits = number.minimumFractionDigits(opts); int32_t maxFractionDigits = number.maximumFractionDigits(opts); int32_t minSignificantDigits = number.minimumSignificantDigits(opts); + FractionPrecision fractionPrecision; Precision p = Precision::unlimited(); bool precisionOptions = false; - + bool noSignificantDigits = minSignificantDigits == -1 && maxSignificantDigits == -1; + if (number.numberType == NumberType::kPercent) { + if (minFractionDigits == -1) { + minFractionDigits = 0; + } + if (maxFractionDigits == -1 && minSignificantDigits == -1) { + maxFractionDigits = minFractionDigits; + } + } // Returning -1 means the option wasn't provided - if (maxFractionDigits != -1 && minFractionDigits != -1) { - precisionOptions = true; - p = Precision::minMaxFraction(minFractionDigits, maxFractionDigits); - } else if (minFractionDigits != -1) { - precisionOptions = true; - p = Precision::minFraction(minFractionDigits); - } else if (maxFractionDigits != -1) { - precisionOptions = true; - p = Precision::maxFraction(maxFractionDigits); + if (number.numberType == NumberType::kNumber || number.numberType == NumberType::kPercent) { + if (maxFractionDigits != -1 && minFractionDigits != -1) { + precisionOptions = true; + fractionPrecision = Precision::minMaxFraction(minFractionDigits, maxFractionDigits); + } else if (minFractionDigits != -1) { + precisionOptions = true; + fractionPrecision = Precision::minFraction(minFractionDigits); + maxFractionDigits = minFractionDigits; + } else if (maxFractionDigits != -1) { + precisionOptions = true; + fractionPrecision = Precision::maxFraction(maxFractionDigits); + minFractionDigits = 0; + } } - if (minSignificantDigits != -1) { - precisionOptions = true; - p = p.minSignificantDigits(minSignificantDigits); + if (number.numberType == NumberType::kNumber || number.numberType == NumberType::kCurrency || number.numberType == NumberType::kPercent) { + bool noFractionDigits = false; + if (number.numberType == NumberType::kCurrency) { + // Determine the minimum fraction digits to use for formatting this currency + // amount. Prefer the non-auto `fractionDigits` option if one exists; + // otherwise, the number of minor unit digits provided by the ISO 4217 + // currency code list; otherwise, U_CURR_DEFAULT_DIGITS (defined in ucurr.h). + DigitSizeOption fractionDigits = number.fractionDigits(opts); + noFractionDigits = fractionDigits.isAuto() || fractionDigits.isInvalid(); + UErrorCode localStatus = U_ZERO_ERROR; + if (fractionDigits.isAuto() || fractionDigits.isInvalid()) { + minFractionDigits = ucurr_getDefaultFractionDigits(currency.getBuffer(), &localStatus); + if (U_FAILURE(localStatus)) { + localStatus = U_ZERO_ERROR; + minFractionDigits = U_CURR_DEFAULT_DIGITS; + } + } else { + minFractionDigits = fractionDigits.value(); + } + maxFractionDigits = minFractionDigits; + } else { + noFractionDigits = (minFractionDigits == 0 || minFractionDigits == -1) && (maxFractionDigits == 0 || maxFractionDigits == -1); + } + + if (!noSignificantDigits) { + // Can't specify rounding increment if significant digits are specified + requireNoRoundingIncrement(opts, status); + if (U_FAILURE(status)) { + status = U_MF_BAD_OPTION; + return {}; + } + } + + // No fraction digits and no significant digits + if (noFractionDigits && noSignificantDigits) { + if (number.numberType == NumberType::kCurrency) { + p = withRoundingIncrement(opts, precisionOptions, minFractionDigits, status); + } else { + p = Precision::fixedFraction(0); + } + if (U_FAILURE(status)) { + status = U_MF_BAD_OPTION; + return {}; + } + } + // No fraction digits and significant digits + else if (noFractionDigits && !noSignificantDigits) { + precisionOptions = true; + p = significantDigits(minSignificantDigits, maxSignificantDigits); + // Can't specify rounding increment if significant digits is specified + requireNoRoundingIncrement(opts, status); + // Fraction digits and significant digits + } else if (!noFractionDigits && !noSignificantDigits) { + // Both fractionDigits and significant digits are specified -- + // use roundingPriority to resolve conflict + + precisionOptions = true; + fractionPrecision = FractionPrecision::minMaxFraction(minFractionDigits, maxFractionDigits); + + UnicodeString roundingPriority = opts.getStringFunctionOption(options::ROUNDING_PRIORITY); + if (roundingPriority == options::MORE_PRECISION) { + precisionOptions = true; + p = significantDigitsWithRoundingPriority(minSignificantDigits, maxSignificantDigits, fractionPrecision, UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_RELAXED); + } else if (roundingPriority == options::LESS_PRECISION) { + precisionOptions = true; + p = significantDigitsWithRoundingPriority(minSignificantDigits, maxSignificantDigits, fractionPrecision, UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_STRICT); + } else { + p = significantDigits(minSignificantDigits, maxSignificantDigits); + } + } else { + precisionOptions = true; + + // Fraction digits and no significant digits + if (number.numberType == NumberType::kCurrency) { + p = withRoundingIncrement(opts, precisionOptions, minFractionDigits, status); + } else { + p = Precision::minMaxFraction(minFractionDigits, maxFractionDigits); + } + + if (U_FAILURE(status)) { + status = U_MF_BAD_OPTION; + return {}; } + + } + } else { + p = fractionPrecision; } - if (maxSignificantDigits != -1) { - precisionOptions = true; - p = p.maxSignificantDigits(maxSignificantDigits); + + if (number.numberType == NumberType::kCurrency) { + UnicodeString trailingZeroDisplay = opts.getStringFunctionOption(options::TRAILING_ZERO_DISPLAY); + if (trailingZeroDisplay == options::STRIP_IF_INTEGER) { + precisionOptions = true; + p = p.trailingZeroDisplay(UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_HIDE_IF_WHOLE); + } else { + p = p.trailingZeroDisplay(UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_AUTO); + } + } + if (precisionOptions) { nf = nf.precision(p); } @@ -511,7 +863,9 @@ bool isDigitSizeOption(const UnicodeString& s) { // All other options apply to both `:number` and `:integer` int32_t minIntegerDigits = number.minimumIntegerDigits(opts); - nf = nf.integerWidth(IntegerWidth::zeroFillTo(minIntegerDigits)); + if (minIntegerDigits != -1) { + nf = nf.integerWidth(IntegerWidth::zeroFillTo(minIntegerDigits)); + } // signDisplay UnicodeString sd = opts.getStringFunctionOption(options::SIGN_DISPLAY); @@ -562,69 +916,40 @@ bool isDigitSizeOption(const UnicodeString& s) { } } } - return nf.locale(number.locale); -} - -Formatter* StandardFunctions::NumberFactory::createFormatter(const Locale& locale, UErrorCode& errorCode) { - NULL_ON_ERROR(errorCode); - - Formatter* result = new Number(locale); - if (result == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - return result; -} - -Formatter* StandardFunctions::IntegerFactory::createFormatter(const Locale& locale, UErrorCode& errorCode) { - NULL_ON_ERROR(errorCode); - - Formatter* result = new Number(Number::integer(locale)); - if (result == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - return result; -} - -StandardFunctions::IntegerFactory::~IntegerFactory() {} -static FormattedPlaceholder notANumber(const FormattedPlaceholder& input) { - return FormattedPlaceholder(input, FormattedValue(UnicodeString("NaN"))); -} - -static double parseNumberLiteral(const Formattable& input, UErrorCode& errorCode) { - if (U_FAILURE(errorCode)) { - return {}; - } + // Currency options + if (number.numberType == NumberType::kCurrency) { + nf = nf.unit(currencyUnit); - // Copying string to avoid GCC dangling-reference warning - // (although the reference is safe) - UnicodeString inputStr = input.getString(errorCode); - // Precondition: `input`'s source Formattable has type string - if (U_FAILURE(errorCode)) { - return {}; - } + UnicodeString currencySign = opts.getStringFunctionOption(options::CURRENCY_SIGN); + if (currencySign == options::ACCOUNTING) { + nf = nf.sign(UNumberSignDisplay::UNUM_SIGN_ACCOUNTING); + } - // Validate string according to `number-literal` production - // in the spec for `:number`. This is because some cases are - // forbidden by this grammar, but allowed by StringToDouble. - if (!validateNumberLiteral(inputStr)) { - errorCode = U_MF_OPERAND_MISMATCH_ERROR; - return 0; + UnicodeString currencyDisplay = opts.getStringFunctionOption(options::CURRENCY_DISPLAY); + if (currencyDisplay == options::NARROW_SYMBOL) { + nf = nf.unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_NARROW); + } else if (currencyDisplay == options::NAME) { + nf = nf.unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME); + } else if (currencyDisplay == options::CODE) { + nf = nf.unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_ISO_CODE); + } else if (currencyDisplay == options::NEVER) { + nf = nf.unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_HIDDEN); + } else { + nf = nf.unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FORMAL); + } } - // Convert to double using double_conversion::StringToDoubleConverter - using namespace double_conversion; - int processedCharactersCount = 0; - StringToDoubleConverter converter(0, 0, 0, "", ""); - int32_t len = inputStr.length(); - double result = - converter.StringToDouble(reinterpret_cast(inputStr.getBuffer()), - len, - &processedCharactersCount); - if (processedCharactersCount != len) { - errorCode = U_MF_OPERAND_MISMATCH_ERROR; + if (number.numberType == NumberType::kCurrency || number.numberType == NumberType::kPercent) { + UnicodeString roundingMode = opts.getStringFunctionOption(options::ROUNDING_MODE); + UNumberFormatRoundingMode mode = validateRoundingMode(roundingMode, status); + if (U_FAILURE(status)) { + status = U_MF_BAD_OPTION; + return {}; + } + nf = nf.roundingMode(mode); } - return result; + return nf.locale(locale); } static UChar32 digitToChar(int32_t val, UErrorCode errorCode) { @@ -659,245 +984,329 @@ static UChar32 digitToChar(int32_t val, UErrorCode errorCode) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return '0'; } + return '0'; } -int32_t StandardFunctions::Number::maximumFractionDigits(const FunctionOptions& opts) const { - Formattable opt; - - if (isInteger) { - return 0; +StandardFunctions::DigitSizeOption StandardFunctions::Number::digitSizeOptionWithAuto(const FunctionOptions& opts, + std::u16string_view k) const { + UErrorCode localStatus = U_ZERO_ERROR; + DigitSizeOption result = digitSizeOption(opts, k, true, localStatus); + if (U_FAILURE(localStatus)) { + return DigitSizeOption::invalid(); } + return result; +} - if (opts.getFunctionOption(options::MAXIMUM_FRACTION_DIGITS, opt)) { - UErrorCode localErrorCode = U_ZERO_ERROR; - int64_t val = getInt64Value(locale, opt, localErrorCode); - if (U_SUCCESS(localErrorCode)) { - return static_cast(val); - } +int32_t StandardFunctions::Number::digitSizeOptionNoAuto(const FunctionOptions& opts, + std::u16string_view k) const { + UErrorCode localStatus = U_ZERO_ERROR; + StandardFunctions::DigitSizeOption result = digitSizeOption(opts, k, false, localStatus); + U_ASSERT(!result.isAuto()); + if (result.isInvalid() || U_FAILURE(localStatus)) { + return -1; } - // Returning -1 indicates that the option wasn't provided or was a non-integer. - // The caller needs to check for that case, since passing -1 to Precision::maxFraction() - // is an error. - return -1; + return result.value(); } -int32_t StandardFunctions::Number::minimumFractionDigits(const FunctionOptions& opts) const { - Formattable opt; +StandardFunctions::DigitSizeOption StandardFunctions::Number::digitSizeOption(const FunctionOptions& opts, + const std::u16string_view k, + bool allowAuto, + UErrorCode& status) const { + if (U_FAILURE(status)) { + return DigitSizeOption::invalid(); + } + UErrorCode localStatus = U_ZERO_ERROR; + const FunctionValue* opt = opts.getFunctionOption(k, localStatus); + if (U_SUCCESS(localStatus)) { + // First try the formatted value + UnicodeString formatted = opt->formatToString(localStatus); + int64_t val = 0; + if (U_SUCCESS(localStatus)) { + if (formatted == options::AUTO && allowAuto) { + return DigitSizeOption::autoVal(); + } + val = getInt64Value(Locale("en-US"), Formattable(formatted), localStatus); + if (U_SUCCESS(localStatus)) { + return DigitSizeOption::intVal(static_cast(val)); + } + } + if (U_FAILURE(localStatus)) { + localStatus = U_ZERO_ERROR; - if (!isInteger) { - if (opts.getFunctionOption(options::MINIMUM_FRACTION_DIGITS, opt)) { - UErrorCode localErrorCode = U_ZERO_ERROR; - int64_t val = getInt64Value(locale, opt, localErrorCode); - if (U_SUCCESS(localErrorCode)) { - return static_cast(val); + // Next try the operand + auto unwrapped = opt->unwrap(); + UnicodeString s = unwrapped.getString(localStatus); + if (U_SUCCESS(localStatus)) { + if (s == options::AUTO && allowAuto) { + return DigitSizeOption::autoVal(); + } + } else { + localStatus = U_ZERO_ERROR; + } + val = getInt64Value(Locale("en-US"), opt->unwrap(), localStatus); + if (U_SUCCESS(localStatus)) { + return DigitSizeOption::intVal(static_cast(val)); } } } // Returning -1 indicates that the option wasn't provided or was a non-integer. - // The caller needs to check for that case, since passing -1 to Precision::minFraction() + // The caller needs to check for that case, since passing -1 to Precision::maxFraction() // is an error. - return -1; + status = U_MF_BAD_OPTION; + return DigitSizeOption::invalid(); } -int32_t StandardFunctions::Number::minimumIntegerDigits(const FunctionOptions& opts) const { - Formattable opt; +StandardFunctions::DigitSizeOption StandardFunctions::Number::fractionDigits(const FunctionOptions& opts) const { + if (numberType != NumberType::kCurrency) { + return DigitSizeOption::invalid(); + } - if (opts.getFunctionOption(options::MINIMUM_INTEGER_DIGITS, opt)) { - UErrorCode localErrorCode = U_ZERO_ERROR; - int64_t val = getInt64Value(locale, opt, localErrorCode); - if (U_SUCCESS(localErrorCode)) { - return static_cast(val); - } + return digitSizeOptionWithAuto(opts, options::FRACTION_DIGITS); +} + +int32_t StandardFunctions::Number::maximumFractionDigits(const FunctionOptions& opts) const { + if (numberType == NumberType::kInteger) { + return 0; } - return 1; + + return digitSizeOptionNoAuto(opts, options::MAXIMUM_FRACTION_DIGITS); } -int32_t StandardFunctions::Number::minimumSignificantDigits(const FunctionOptions& opts) const { +int32_t StandardFunctions::Number::minimumFractionDigits(const FunctionOptions& opts) const { Formattable opt; - if (!isInteger) { - if (opts.getFunctionOption(options::MINIMUM_SIGNIFICANT_DIGITS, opt)) { - UErrorCode localErrorCode = U_ZERO_ERROR; - int64_t val = getInt64Value(locale, opt, localErrorCode); - if (U_SUCCESS(localErrorCode)) { - return static_cast(val); - } - } + if (numberType == NumberType::kInteger) { + return -1; } - // Returning -1 indicates that the option wasn't provided or was a non-integer. - // The caller needs to check for that case, since passing -1 to Precision::minSignificantDigits() - // is an error. - return -1; + return digitSizeOptionNoAuto(opts, options::MINIMUM_FRACTION_DIGITS); } -int32_t StandardFunctions::Number::maximumSignificantDigits(const FunctionOptions& opts) const { - Formattable opt; +int32_t StandardFunctions::Number::minimumIntegerDigits(const FunctionOptions& opts) const { + return digitSizeOptionNoAuto(opts, options::MINIMUM_INTEGER_DIGITS); +} - if (opts.getFunctionOption(options::MAXIMUM_SIGNIFICANT_DIGITS, opt)) { - UErrorCode localErrorCode = U_ZERO_ERROR; - int64_t val = getInt64Value(locale, opt, localErrorCode); - if (U_SUCCESS(localErrorCode)) { - return static_cast(val); - } +int32_t StandardFunctions::Number::minimumSignificantDigits(const FunctionOptions& opts) const { + if (numberType == NumberType::kInteger) { + return -1; } - // Returning -1 indicates that the option wasn't provided or was a non-integer. - // The caller needs to check for that case, since passing -1 to Precision::maxSignificantDigits() - // is an error. - return -1; // Not a valid value for Precision; has to be checked + return digitSizeOptionNoAuto(opts, options::MINIMUM_SIGNIFICANT_DIGITS); } -bool StandardFunctions::Number::usePercent(const FunctionOptions& opts) const { - Formattable opt; - if (isInteger - || !opts.getFunctionOption(options::STYLE, opt) - || opt.getType() != UFMT_STRING) { - return false; - } - UErrorCode localErrorCode = U_ZERO_ERROR; - const UnicodeString& style = opt.getString(localErrorCode); - U_ASSERT(U_SUCCESS(localErrorCode)); - return (style == options::PERCENT_STRING); +int32_t StandardFunctions::Number::maximumSignificantDigits(const FunctionOptions& opts) const { + return digitSizeOptionNoAuto(opts, options::MAXIMUM_SIGNIFICANT_DIGITS); } -/* static */ StandardFunctions::Number StandardFunctions::Number::integer(const Locale& loc) { - return StandardFunctions::Number(loc, true); +int32_t StandardFunctions::Number::addOption(const FunctionOptions& opts, UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return -1; + } + DigitSizeOption result = digitSizeOption(opts, options::ADD, false, errorCode); + U_ASSERT(!result.isAuto()); + if (result.isInvalid()) { + errorCode = U_MF_BAD_OPTION; + return -1; + } + return result.value(); } -FormattedPlaceholder StandardFunctions::Number::format(FormattedPlaceholder&& arg, FunctionOptions&& opts, UErrorCode& errorCode) const { +int32_t StandardFunctions::Number::subtractOption(const FunctionOptions& opts, UErrorCode& errorCode) const { if (U_FAILURE(errorCode)) { - return {}; + return -1; } + DigitSizeOption result = digitSizeOption(opts, options::SUBTRACT, false, errorCode); + U_ASSERT(!result.isAuto()); + if (result.isInvalid()) { + errorCode = U_MF_BAD_OPTION; + return -1; + } + return result.value(); +} - // No argument => return "NaN" - if (!arg.canFormat()) { +StandardFunctions::NumberValue::NumberValue(const Number& parent, + const FunctionContext& context, + const FunctionValue& arg, + const FunctionOptions& options, + UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + // Must have an argument + if (arg.isNullOperand()) { errorCode = U_MF_OPERAND_MISMATCH_ERROR; - return notANumber(arg); + return; + } + + locale = context.getLocale(); + opts = options.mergeOptions(arg.getResolvedOptions(), errorCode); + innerValue = arg.unwrap(); + functionName = functions::NUMBER; + numberType = parent.numberType; + + int64_t offset = 0; + switch (numberType) { + case NumberType::kInteger: + functionName = functions::INTEGER; + break; + case NumberType::kCurrency: + functionName = functions::CURRENCY; + break; + case NumberType::kOffset: { + functionName = functions::OFFSET; + UErrorCode localStatus = U_ZERO_ERROR; + int32_t addOptionValue = parent.addOption(opts, localStatus); + bool hasAdd = U_SUCCESS(localStatus); + localStatus = U_ZERO_ERROR; + int32_t subtractOptionValue = parent.subtractOption(opts, localStatus); + bool hasSubtract = U_SUCCESS(localStatus); + if ((hasAdd && hasSubtract) || (!hasAdd && !hasSubtract)) { + // Either add or subtract must be provided, + // but not both + errorCode = U_MF_BAD_OPTION; + return; + } + offset = hasAdd ? addOptionValue : (-1 * subtractOptionValue); + break; + } + case NumberType::kPercent: { + functionName = functions::PER_CENT; + break; + } + default: + break; } + inputDir = context.getDirection(); + dir = outputDirectionalityFromUDir(inputDir, locale); - number::LocalizedNumberFormatter realFormatter; - realFormatter = formatterForOptions(*this, opts, errorCode); + UErrorCode localStatus = U_ZERO_ERROR; + number::LocalizedNumberFormatter realFormatter = formatterForOptions(parent, locale, opts, false, localStatus); + number::LocalizedNumberFormatter percentFormatter = formatterForOptions(parent, locale, opts, true, localStatus); - number::FormattedNumber numberResult; int64_t integerValue = 0; + double valueWithOffset = 0; + // Need to validate operand before validating options if (U_SUCCESS(errorCode)) { - // Already checked that contents can be formatted - const Formattable& toFormat = arg.asFormattable(); - switch (toFormat.getType()) { + switch (innerValue.getType()) { case UFMT_DOUBLE: { - double d = toFormat.getDouble(errorCode); + double d = innerValue.getDouble(errorCode); U_ASSERT(U_SUCCESS(errorCode)); - numberResult = realFormatter.formatDouble(d, errorCode); - integerValue = static_cast(std::round(d)); + if (U_SUCCESS(localStatus)) { + valueWithOffset = d + offset; + formattedNumber = realFormatter.formatDouble(valueWithOffset, errorCode); + scaledFormattedNumber = realFormatter.formatDouble(valueWithOffset * 100, errorCode); + percentFormattedNumber = percentFormatter.formatDouble(valueWithOffset, errorCode); + integerValue = static_cast(std::round(d)); + } break; } case UFMT_LONG: { - int32_t l = toFormat.getLong(errorCode); + int32_t l = innerValue.getLong(errorCode); U_ASSERT(U_SUCCESS(errorCode)); - numberResult = realFormatter.formatInt(l, errorCode); - integerValue = l; + if (U_SUCCESS(localStatus)) { + valueWithOffset = l + offset; + formattedNumber = realFormatter.formatInt(valueWithOffset, errorCode); + scaledFormattedNumber = realFormatter.formatInt(valueWithOffset * 100, errorCode); + percentFormattedNumber = percentFormatter.formatInt(valueWithOffset, errorCode); + integerValue = l; + } break; } case UFMT_INT64: { - int64_t i = toFormat.getInt64(errorCode); + int64_t i = innerValue.getInt64(errorCode); U_ASSERT(U_SUCCESS(errorCode)); - numberResult = realFormatter.formatInt(i, errorCode); - integerValue = i; + if (U_SUCCESS(localStatus)) { + valueWithOffset = i + offset; + formattedNumber = realFormatter.formatInt(valueWithOffset, errorCode); + scaledFormattedNumber = realFormatter.formatInt(valueWithOffset * 100, errorCode); + percentFormattedNumber = percentFormatter.formatInt(valueWithOffset, errorCode); + integerValue = i; + } break; } case UFMT_STRING: { // Try to parse the string as a number - double d = parseNumberLiteral(toFormat, errorCode); + const UnicodeString& s = innerValue.getString(errorCode); + U_ASSERT(U_SUCCESS(errorCode)); + double d = parseNumberLiteral(s, errorCode); if (U_FAILURE(errorCode)) - return {}; - numberResult = realFormatter.formatDouble(d, errorCode); - integerValue = static_cast(std::round(d)); + return; + if (U_SUCCESS(localStatus)) { + valueWithOffset = d + offset; + formattedNumber = realFormatter.formatDouble(valueWithOffset, errorCode); + scaledFormattedNumber = realFormatter.formatDouble(valueWithOffset * 100, errorCode); + percentFormattedNumber = percentFormatter.formatDouble(valueWithOffset, errorCode); + integerValue = static_cast(std::round(d)); + } break; } default: { // Other types can't be parsed as a number errorCode = U_MF_OPERAND_MISMATCH_ERROR; - return notANumber(arg); + break; } } } - // Need to return the integer value if invoked as :integer - if (isInteger) { - return FormattedPlaceholder(FormattedPlaceholder(Formattable(integerValue), arg.getFallback()), - std::move(opts), - FormattedValue(std::move(numberResult))); + if (U_SUCCESS(errorCode) && U_FAILURE(localStatus)) { + errorCode = localStatus; } - return FormattedPlaceholder(arg, std::move(opts), FormattedValue(std::move(numberResult))); -} -StandardFunctions::Number::~Number() {} -StandardFunctions::NumberFactory::~NumberFactory() {} - -// --------- PluralFactory + // Ignore U_USING_DEFAULT_WARNING + if (errorCode == U_USING_DEFAULT_WARNING) { + errorCode = U_ZERO_ERROR; + } -StandardFunctions::Plural::PluralType StandardFunctions::Plural::pluralType(const FunctionOptions& opts) const { - Formattable opt; + // Need to set the integer value if invoked as :integer + if (numberType == NumberType::kInteger) { + innerValue = Formattable(integerValue); + } - if (opts.getFunctionOption(options::SELECT, opt)) { - UErrorCode localErrorCode = U_ZERO_ERROR; - UnicodeString val = opt.getString(localErrorCode); - if (U_SUCCESS(localErrorCode)) { - if (val == options::ORDINAL) { - return PluralType::PLURAL_ORDINAL; - } - if (val == options::EXACT) { - return PluralType::PLURAL_EXACT; - } - } + // Need to set the offsetted value if invoked as :offset + if (numberType == NumberType::kOffset) { + innerValue = Formattable(valueWithOffset); } - return PluralType::PLURAL_CARDINAL; } -Selector* StandardFunctions::PluralFactory::createSelector(const Locale& locale, UErrorCode& errorCode) const { - NULL_ON_ERROR(errorCode); - - Selector* result; - if (isInteger) { - result = new Plural(Plural::integer(locale, errorCode)); - } else { - result = new Plural(locale, errorCode); - } - NULL_ON_ERROR(errorCode); - if (result == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; +UnicodeString StandardFunctions::NumberValue::formatToString(UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return {}; } - return result; + + return (numberType == kPercent) + ? percentFormattedNumber.toString(errorCode) + : formattedNumber.toString(errorCode); } -void StandardFunctions::Plural::selectKey(FormattedPlaceholder&& toFormat, - FunctionOptions&& opts, - const UnicodeString* keys, - int32_t keysLen, - UnicodeString* prefs, - int32_t& prefsLen, - UErrorCode& errorCode) const { - CHECK_ERROR(errorCode); +StandardFunctions::Number::~Number() {} +StandardFunctions::NumberValue::~NumberValue() {} - // No argument => return "NaN" - if (!toFormat.canFormat()) { - errorCode = U_MF_SELECTOR_ERROR; - return; +/* static */ StandardFunctions::Number::PluralType +StandardFunctions::Number::pluralType(const FunctionOptions& opts) { + UnicodeString val = opts.getStringFunctionOption(options::SELECT); + if (!val.isEmpty()) { + if (val == options::ORDINAL) { + return PluralType::PLURAL_ORDINAL; + } + if (val == options::EXACT) { + return PluralType::PLURAL_EXACT; + } } + return PluralType::PLURAL_CARDINAL; +} - // Handle any formatting options - PluralType type = pluralType(opts); - FormattedPlaceholder resolvedSelector = numberFormatter->format(std::move(toFormat), - std::move(opts), - errorCode); +void StandardFunctions::NumberValue::selectKeys(const UnicodeString* keys, + int32_t keysLen, + int32_t* prefs, + int32_t& prefsLen, + UErrorCode& errorCode) const { CHECK_ERROR(errorCode); - U_ASSERT(resolvedSelector.isEvaluated() && resolvedSelector.output().isNumber()); + Number::PluralType type = Number::pluralType(opts); + + // (resolvedSelector is `this`) // See https://github.com/unicode-org/message-format-wg/blob/main/spec/registry.md#number-selection // 1. Let exact be the JSON string representation of the numeric value of resolvedSelector - const number::FormattedNumber& formattedNumber = resolvedSelector.output().getNumber(); - UnicodeString exact = formattedNumber.toString(errorCode); + const number::FormattedNumber& numberToUse = (numberType == NumberType::kPercent) ? scaledFormattedNumber : formattedNumber; + UnicodeString exact = numberToUse.toString(errorCode); if (U_FAILURE(errorCode)) { // Non-number => selector error @@ -908,13 +1317,13 @@ void StandardFunctions::Plural::selectKey(FormattedPlaceholder&& toFormat, // Step 2. Let keyword be a string which is the result of rule selection on resolvedSelector. // If the option select is set to exact, rule-based selection is not used. Return the empty string. UnicodeString keyword; - if (type != PluralType::PLURAL_EXACT) { - UPluralType t = type == PluralType::PLURAL_ORDINAL ? UPLURAL_TYPE_ORDINAL : UPLURAL_TYPE_CARDINAL; + if (type != Number::PluralType::PLURAL_EXACT) { + UPluralType t = type == Number::PluralType::PLURAL_ORDINAL ? UPLURAL_TYPE_ORDINAL : UPLURAL_TYPE_CARDINAL; // Look up plural rules by locale and type LocalPointer rules(PluralRules::forLocale(locale, t, errorCode)); CHECK_ERROR(errorCode); - keyword = rules->select(formattedNumber, errorCode); + keyword = rules->select(numberToUse, errorCode); } // Steps 3-4 elided: @@ -936,7 +1345,7 @@ void StandardFunctions::Plural::selectKey(FormattedPlaceholder&& toFormat, // 5i(a). If key and exact consist of the same sequence of Unicode code points, then if (exact == keys[i]) { // 5i(a)(a) Append key as the last element of the list resultExact. - prefs[prefsLen] = keys[i]; + prefs[prefsLen] = i; prefsLen++; break; } @@ -944,7 +1353,7 @@ void StandardFunctions::Plural::selectKey(FormattedPlaceholder&& toFormat, } // Return immediately if exact matching was requested - if (prefsLen == keysLen || type == PluralType::PLURAL_EXACT) { + if (prefsLen == keysLen || type == Number::PluralType::PLURAL_EXACT) { return; } @@ -957,7 +1366,7 @@ void StandardFunctions::Plural::selectKey(FormattedPlaceholder&& toFormat, // 5ii(a). If key and keyword consist of the same sequence of Unicode code points, then if (keyword == keys[i]) { // 5ii(a)(a) Append key as the last element of the list resultKeyword. - prefs[prefsLen] = keys[i]; + prefs[prefsLen] = i; prefsLen++; } } @@ -969,116 +1378,58 @@ void StandardFunctions::Plural::selectKey(FormattedPlaceholder&& toFormat, // (Implicit, since `prefs` is an out-parameter) } -StandardFunctions::Plural::Plural(const Locale& loc, UErrorCode& status) : locale(loc) { - CHECK_ERROR(status); +// --------- DateTime - numberFormatter.adoptInstead(new StandardFunctions::Number(loc)); - if (!numberFormatter.isValid()) { - status = U_MEMORY_ALLOCATION_ERROR; - } +/* static */ StandardFunctions::DateTime* +StandardFunctions::DateTime::date(UErrorCode& success) { + return DateTime::create(DateTimeType::kDate, success); } -StandardFunctions::Plural::Plural(const Locale& loc, bool isInt, UErrorCode& status) : locale(loc), isInteger(isInt) { - CHECK_ERROR(status); - - if (isInteger) { - numberFormatter.adoptInstead(new StandardFunctions::Number(loc, true)); - } else { - numberFormatter.adoptInstead(new StandardFunctions::Number(loc)); - } - - if (!numberFormatter.isValid()) { - status = U_MEMORY_ALLOCATION_ERROR; - } +/* static */ StandardFunctions::DateTime* +StandardFunctions::DateTime::time(UErrorCode& success) { + return DateTime::create(DateTimeType::kTime, success); } -StandardFunctions::Plural::~Plural() {} - -StandardFunctions::PluralFactory::~PluralFactory() {} - -// --------- DateTimeFactory - -/* static */ UnicodeString StandardFunctions::getStringOption(const FunctionOptions& opts, - std::u16string_view optionName, - UErrorCode& errorCode) { - if (U_SUCCESS(errorCode)) { - Formattable opt; - if (opts.getFunctionOption(optionName, opt)) { - return opt.getString(errorCode); // In case it's not a string, error code will be set - } else { - errorCode = U_ILLEGAL_ARGUMENT_ERROR; - } - } - // Default is empty string - return {}; +/* static */ StandardFunctions::DateTime* +StandardFunctions::DateTime::dateTime(UErrorCode& success) { + return DateTime::create(DateTimeType::kDateTime, success); } -// Date/time options only -static UnicodeString defaultForOption(std::u16string_view optionName) { - if (optionName == options::DATE_STYLE - || optionName == options::TIME_STYLE - || optionName == options::STYLE) { - return UnicodeString(options::SHORT); - } - return {}; // Empty string is default -} +/* static */ StandardFunctions::DateTime* +StandardFunctions::DateTime::create(DateTime::DateTimeType type, + UErrorCode& success) { + NULL_ON_ERROR(success); -// TODO -// Only DateTime currently uses the function options stored in the placeholder. -// It also doesn't use them very consistently (it looks at the previous set of options, -// and others aren't preserved). This needs to be generalized, -// but that depends on https://github.com/unicode-org/message-format-wg/issues/515 -// Finally, the option value is assumed to be a string, -// which works for datetime options but not necessarily in general. -UnicodeString StandardFunctions::DateTime::getFunctionOption(const FormattedPlaceholder& toFormat, - const FunctionOptions& opts, - std::u16string_view optionName) const { - // Options passed to the current function invocation take priority - Formattable opt; - UnicodeString s; - UErrorCode localErrorCode = U_ZERO_ERROR; - s = getStringOption(opts, optionName, localErrorCode); - if (U_SUCCESS(localErrorCode)) { - return s; - } - // Next try the set of options used to construct `toFormat` - localErrorCode = U_ZERO_ERROR; - s = getStringOption(toFormat.options(), optionName, localErrorCode); - if (U_SUCCESS(localErrorCode)) { - return s; + LocalPointer result(new DateTime(type)); + if (!result.isValid()) { + success = U_MEMORY_ALLOCATION_ERROR; + return nullptr; } - // Finally, use default - return defaultForOption(optionName); + return result.orphan(); } -// Used for options that don't have defaults -UnicodeString StandardFunctions::DateTime::getFunctionOption(const FormattedPlaceholder& toFormat, - const FunctionOptions& opts, - std::u16string_view optionName, - UErrorCode& errorCode) const { - if (U_SUCCESS(errorCode)) { - // Options passed to the current function invocation take priority - Formattable opt; - UnicodeString s; - UErrorCode localErrorCode = U_ZERO_ERROR; - s = getStringOption(opts, optionName, localErrorCode); - if (U_SUCCESS(localErrorCode)) { - return s; - } - // Next try the set of options used to construct `toFormat` - localErrorCode = U_ZERO_ERROR; - s = getStringOption(toFormat.options(), optionName, localErrorCode); - if (U_SUCCESS(localErrorCode)) { - return s; - } - errorCode = U_ILLEGAL_ARGUMENT_ERROR; +LocalPointer +StandardFunctions::DateTime::call(const FunctionContext& context, + const FunctionValue& val, + const FunctionOptions& opts, + UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return LocalPointer(); + } + LocalPointer + result(new DateTimeValue(type, context, val, opts, errorCode)); + if (!result.isValid()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; } - return {}; + return result; } static DateFormat::EStyle stringToStyle(UnicodeString option, UErrorCode& errorCode) { if (U_SUCCESS(errorCode)) { UnicodeString upper = option.toUpper(); + if (upper.isEmpty()) { + return DateFormat::EStyle::kShort; + } if (upper == options::FULL_UPPER) { return DateFormat::EStyle::kFull; } @@ -1099,45 +1450,6 @@ static DateFormat::EStyle stringToStyle(UnicodeString option, UErrorCode& errorC return DateFormat::EStyle::kNone; } -/* static */ StandardFunctions::DateTimeFactory* StandardFunctions::DateTimeFactory::dateTime(UErrorCode& errorCode) { - NULL_ON_ERROR(errorCode); - - DateTimeFactory* result = new StandardFunctions::DateTimeFactory(DateTimeType::DateTime); - if (result == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - return result; -} - -/* static */ StandardFunctions::DateTimeFactory* StandardFunctions::DateTimeFactory::date(UErrorCode& errorCode) { - NULL_ON_ERROR(errorCode); - - DateTimeFactory* result = new DateTimeFactory(DateTimeType::Date); - if (result == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - return result; -} - -/* static */ StandardFunctions::DateTimeFactory* StandardFunctions::DateTimeFactory::time(UErrorCode& errorCode) { - NULL_ON_ERROR(errorCode); - - DateTimeFactory* result = new DateTimeFactory(DateTimeType::Time); - if (result == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - return result; -} - -Formatter* StandardFunctions::DateTimeFactory::createFormatter(const Locale& locale, UErrorCode& errorCode) { - NULL_ON_ERROR(errorCode); - - Formatter* result = new StandardFunctions::DateTime(locale, type); - if (result == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - return result; -} // DateFormat parsers that are shared across threads static DateFormat* dateParser = nullptr; @@ -1164,6 +1476,7 @@ static UBool mf2_date_parsers_cleanup() { delete dateTimeZoneParser; dateTimeZoneParser = nullptr; } + gMF2DateParsersInitOnce.reset(); return true; } @@ -1191,173 +1504,52 @@ static void initDateParsersOnce(UErrorCode& errorCode) { ucln_i18n_registerCleanup(UCLN_I18N_MF2_DATE_PARSERS, mf2_date_parsers_cleanup); } -// Lazily initialize DateFormat objects used for parsing date literals static void initDateParsers(UErrorCode& errorCode) { CHECK_ERROR(errorCode); umtx_initOnce(gMF2DateParsersInitOnce, &initDateParsersOnce, errorCode); } -// From https://github.com/unicode-org/message-format-wg/blob/main/spec/registry.md#date-and-time-operands : -// "A date/time literal value is a non-empty string consisting of an ISO 8601 date, or -// an ISO 8601 datetime optionally followed by a timezone offset." -UDate StandardFunctions::DateTime::tryPatterns(const UnicodeString& sourceStr, - UErrorCode& errorCode) const { - if (U_FAILURE(errorCode)) { - return 0; - } - // Handle ISO 8601 datetime (tryTimeZonePatterns() handles the case - // where a timezone offset follows) - if (sourceStr.length() > 10) { - return dateTimeParser->parse(sourceStr, errorCode); - } - // Handle ISO 8601 date - return dateParser->parse(sourceStr, errorCode); -} - -// See comment on tryPatterns() for spec reference -UDate StandardFunctions::DateTime::tryTimeZonePatterns(const UnicodeString& sourceStr, - UErrorCode& errorCode) const { - if (U_FAILURE(errorCode)) { - return 0; - } - int32_t len = sourceStr.length(); - if (len > 0 && sourceStr[len] == 'Z') { - return dateTimeUTCParser->parse(sourceStr, errorCode); - } - return dateTimeZoneParser->parse(sourceStr, errorCode); -} - -static TimeZone* createTimeZone(const DateInfo& dateInfo, UErrorCode& errorCode) { - NULL_ON_ERROR(errorCode); - - TimeZone* tz; - if (dateInfo.zoneId.isEmpty()) { - // Floating time value -- use default time zone - tz = TimeZone::createDefault(); - } else { - tz = TimeZone::createTimeZone(dateInfo.zoneId); - } - if (tz == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; - } - return tz; -} - -// Returns true iff `sourceStr` ends in an offset like +03:30 or -06:00 -// (This function is just used to determine whether to call tryPatterns() -// or tryTimeZonePatterns(); tryTimeZonePatterns() checks fully that the -// string matches the expected format) -static bool hasTzOffset(const UnicodeString& sourceStr) { - int32_t len = sourceStr.length(); - - if (len <= 6) { - return false; - } - return ((sourceStr[len - 6] == PLUS || sourceStr[len - 6] == HYPHEN) - && sourceStr[len - 3] == COLON); -} - -// Note: `calendar` option to :datetime not implemented yet; -// Gregorian calendar is assumed -DateInfo StandardFunctions::DateTime::createDateInfoFromString(const UnicodeString& sourceStr, - UErrorCode& errorCode) const { - if (U_FAILURE(errorCode)) { - return {}; - } - - UDate absoluteDate; - - // Check if the string has a time zone part - int32_t indexOfZ = sourceStr.indexOf('Z'); - int32_t indexOfPlus = sourceStr.lastIndexOf('+'); - int32_t indexOfMinus = sourceStr.lastIndexOf('-'); - int32_t indexOfSign = indexOfPlus > -1 ? indexOfPlus : indexOfMinus; - bool isTzOffset = hasTzOffset(sourceStr); - bool isGMT = indexOfZ > 0; - UnicodeString offsetPart; - bool hasTimeZone = isTzOffset || isGMT; - - if (!hasTimeZone) { - // No time zone; parse the date and time - absoluteDate = tryPatterns(sourceStr, errorCode); - if (U_FAILURE(errorCode)) { - return {}; - } - } else { - // Try to split into time zone and non-time-zone parts - UnicodeString dateTimePart; - if (isGMT) { - dateTimePart = sourceStr.tempSubString(0, indexOfZ); - } else { - dateTimePart = sourceStr.tempSubString(0, indexOfSign); - } - // Parse the date from the date/time part - tryPatterns(dateTimePart, errorCode); - // Failure -- can't parse this string - if (U_FAILURE(errorCode)) { - return {}; - } - // Success -- now parse the time zone part - if (isGMT) { - dateTimePart += UnicodeString("GMT"); - absoluteDate = tryTimeZonePatterns(dateTimePart, errorCode); - if (U_FAILURE(errorCode)) { - return {}; - } - } else { - // Try to parse time zone in offset format: [+-]nn:nn - absoluteDate = tryTimeZonePatterns(sourceStr, errorCode); - if (U_FAILURE(errorCode)) { - return {}; - } - offsetPart = sourceStr.tempSubString(indexOfSign, sourceStr.length()); - } - } - - // If the time zone was provided, get its canonical ID, - // in order to return it in the DateInfo - UnicodeString canonicalID; - if (hasTimeZone) { - UnicodeString tzID("GMT"); - if (!isGMT) { - tzID += offsetPart; - } - TimeZone::getCanonicalID(tzID, canonicalID, errorCode); - if (U_FAILURE(errorCode)) { - return {}; - } - } +UnicodeString StandardFunctions::DateTimeValue::formatToString(UErrorCode& status) const { + (void) status; - return { absoluteDate, canonicalID }; + return formattedDate; } -void formatDateWithDefaults(const Locale& locale, - const DateInfo& dateInfo, - UnicodeString& result, - UErrorCode& errorCode) { - CHECK_ERROR(errorCode); +extern TimeZone* createTimeZone(const DateInfo&, UErrorCode&); - LocalPointer df(defaultDateTimeInstance(locale, errorCode)); - CHECK_ERROR(errorCode); - - df->adoptTimeZone(createTimeZone(dateInfo, errorCode)); - CHECK_ERROR(errorCode); - df->format(dateInfo.date, result, nullptr, errorCode); -} - -FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& toFormat, - FunctionOptions&& opts, - UErrorCode& errorCode) const { - if (U_FAILURE(errorCode)) { - return {}; - } +StandardFunctions::DateTimeValue::DateTimeValue(DateTime::DateTimeType type, + const FunctionContext& context, + const FunctionValue& arg, + const FunctionOptions& options, + UErrorCode& errorCode) { + CHECK_ERROR(errorCode); + using DateTimeType = DateTime::DateTimeType; - // Argument must be present - if (!toFormat.canFormat()) { + // Function requires an operand + if (arg.isNullOperand()) { errorCode = U_MF_OPERAND_MISMATCH_ERROR; - return std::move(toFormat); + return; + } + + locale = context.getLocale(); + opts = options.mergeOptions(arg.getResolvedOptions(), errorCode); + innerValue = arg.unwrap(); + switch (type) { + case DateTimeType::kDate: + functionName = functions::DATE; + break; + case DateTimeType::kTime: + functionName = functions::TIME; + break; + case DateTimeType::kDateTime: + functionName = functions::DATETIME; + break; } + inputDir = context.getDirection(); + dir = outputDirectionalityFromUDir(inputDir, locale); + + const Formattable* source = &innerValue; LocalPointer df; Formattable opt; @@ -1369,30 +1561,32 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& UnicodeString timeStyleName("timeStyle"); UnicodeString styleName("style"); - bool hasDateStyleOption = opts.getFunctionOption(dateStyleName, opt); - bool hasTimeStyleOption = opts.getFunctionOption(timeStyleName, opt); + UnicodeString dateStyleOption = opts.getStringFunctionOption(dateStyleName); + UnicodeString timeStyleOption = opts.getStringFunctionOption(timeStyleName); + bool hasDateStyleOption = dateStyleOption.length() > 0; + bool hasTimeStyleOption = timeStyleOption.length() > 0; bool noOptions = opts.optionsCount() == 0; - bool useStyle = (type == DateTimeFactory::DateTimeType::DateTime + bool useStyle = (type == DateTimeType::kDateTime && (hasDateStyleOption || hasTimeStyleOption || noOptions)) - || (type != DateTimeFactory::DateTimeType::DateTime); + || (type != DateTimeType::kDateTime); - bool useDate = type == DateTimeFactory::DateTimeType::Date - || (type == DateTimeFactory::DateTimeType::DateTime + bool useDate = type == DateTimeType::kDate + || (type == DateTimeType::kDateTime && hasDateStyleOption); - bool useTime = type == DateTimeFactory::DateTimeType::Time - || (type == DateTimeFactory::DateTimeType::DateTime + bool useTime = type == DateTimeType::kTime + || (type == DateTimeType::kDateTime && hasTimeStyleOption); if (useStyle) { // Extract style options - if (type == DateTimeFactory::DateTimeType::DateTime) { + if (type == DateTimeType::kDateTime) { // Note that the options-getting has to be repeated across the three cases, // since `:datetime` uses "dateStyle"/"timeStyle" and `:date` and `:time` // use "style" - dateStyle = stringToStyle(getFunctionOption(toFormat, opts, dateStyleName), errorCode); - timeStyle = stringToStyle(getFunctionOption(toFormat, opts, timeStyleName), errorCode); + dateStyle = stringToStyle(opts.getStringFunctionOption(dateStyleName), errorCode); + timeStyle = stringToStyle(opts.getStringFunctionOption(timeStyleName), errorCode); if (useDate && !useTime) { df.adoptInstead(DateFormat::createDateInstance(dateStyle, locale)); @@ -1401,12 +1595,12 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& } else { df.adoptInstead(DateFormat::createDateTimeInstance(dateStyle, timeStyle, locale)); } - } else if (type == DateTimeFactory::DateTimeType::Date) { - dateStyle = stringToStyle(getFunctionOption(toFormat, opts, styleName), errorCode); + } else if (type == DateTimeType::kDate) { + dateStyle = stringToStyle(opts.getStringFunctionOption(styleName), errorCode); df.adoptInstead(DateFormat::createDateInstance(dateStyle, locale)); } else { // :time - timeStyle = stringToStyle(getFunctionOption(toFormat, opts, styleName), errorCode); + timeStyle = stringToStyle(opts.getStringFunctionOption(styleName), errorCode); df.adoptInstead(DateFormat::createTimeInstance(timeStyle, locale)); } } else { @@ -1417,7 +1611,7 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& #define ADD_PATTERN(s) skeleton += UnicodeString(s) if (U_SUCCESS(errorCode)) { // Year - UnicodeString year = getFunctionOption(toFormat, opts, options::YEAR, errorCode); + UnicodeString year = opts.getStringFunctionOption(options::YEAR, errorCode); if (U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; } else { @@ -1429,7 +1623,7 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& } } // Month - UnicodeString month = getFunctionOption(toFormat, opts, options::MONTH, errorCode); + UnicodeString month = opts.getStringFunctionOption(options::MONTH, errorCode); if (U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; } else { @@ -1448,7 +1642,7 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& } } // Weekday - UnicodeString weekday = getFunctionOption(toFormat, opts, options::WEEKDAY, errorCode); + UnicodeString weekday = opts.getStringFunctionOption(options::WEEKDAY, errorCode); if (U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; } else { @@ -1462,7 +1656,7 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& } } // Day - UnicodeString day = getFunctionOption(toFormat, opts, options::DAY, errorCode); + UnicodeString day = opts.getStringFunctionOption(options::DAY, errorCode); if (U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; } else { @@ -1474,7 +1668,7 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& } } // Hour - UnicodeString hour = getFunctionOption(toFormat, opts, options::HOUR, errorCode); + UnicodeString hour = opts.getStringFunctionOption(options::HOUR, errorCode); if (U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; } else { @@ -1486,7 +1680,7 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& } } // Minute - UnicodeString minute = getFunctionOption(toFormat, opts, options::MINUTE, errorCode); + UnicodeString minute = opts.getStringFunctionOption(options::MINUTE, errorCode); if (U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; } else { @@ -1498,7 +1692,7 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& } } // Second - UnicodeString second = getFunctionOption(toFormat, opts, options::SECOND, errorCode); + UnicodeString second = opts.getStringFunctionOption(options::SECOND, errorCode); if (U_FAILURE(errorCode)) { errorCode = U_ZERO_ERROR; } else { @@ -1511,7 +1705,7 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& } } /* - TODO + TODO(ICU-22754) fractionalSecondDigits hourCycle timeZoneName @@ -1521,43 +1715,35 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& } if (U_FAILURE(errorCode)) { - return {}; + return; } if (!df.isValid()) { errorCode = U_MEMORY_ALLOCATION_ERROR; - return {}; + return; } UnicodeString result; - const Formattable& source = toFormat.asFormattable(); - switch (source.getType()) { + switch (source->getType()) { case UFMT_STRING: { // Lazily initialize date parsers used for parsing date literals initDateParsers(errorCode); - if (U_FAILURE(errorCode)) { - return {}; - } + CHECK_ERROR(errorCode); - const UnicodeString& sourceStr = source.getString(errorCode); + const UnicodeString& sourceStr = source->getString(errorCode); U_ASSERT(U_SUCCESS(errorCode)); - DateInfo dateInfo = createDateInfoFromString(sourceStr, errorCode); + DateInfo dateInfo = StandardFunctions::DateTime::createDateInfoFromString(sourceStr, errorCode); if (U_FAILURE(errorCode)) { errorCode = U_MF_OPERAND_MISMATCH_ERROR; - return {}; + return; } df->adoptTimeZone(createTimeZone(dateInfo, errorCode)); - - // Use the parsed date as the source value - // in the returned FormattedPlaceholder; this is necessary - // so the date can be re-formatted df->format(dateInfo.date, result, 0, errorCode); - toFormat = FormattedPlaceholder(message2::Formattable(std::move(dateInfo)), - toFormat.getFallback()); + innerValue = message2::Formattable(std::move(dateInfo)); break; } case UFMT_DATE: { - const DateInfo* dateInfo = source.getDate(errorCode); + const DateInfo* dateInfo = source->getDate(errorCode); if (U_SUCCESS(errorCode)) { // If U_SUCCESS(errorCode), then source.getDate() returned // a non-null pointer @@ -1577,86 +1763,256 @@ FormattedPlaceholder StandardFunctions::DateTime::format(FormattedPlaceholder&& break; } } + if (U_FAILURE(errorCode)) { + return; + } + // Ignore U_USING_DEFAULT_WARNING + if (errorCode == U_USING_DEFAULT_WARNING) { + errorCode = U_ZERO_ERROR; + } + formattedDate = result; +} + +// From https://github.com/unicode-org/message-format-wg/blob/main/spec/registry.md#date-and-time-operands : +// "A date/time literal value is a non-empty string consisting of an ISO 8601 date, or +// an ISO 8601 datetime optionally followed by a timezone offset." +UDate StandardFunctions::DateTime::tryPatterns(const UnicodeString& sourceStr, + UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return 0; + } + // Handle ISO 8601 datetime (tryTimeZonePatterns() handles the case + // where a timezone offset follows) + if (sourceStr.length() > 10) { + return dateTimeParser->parse(sourceStr, errorCode); + } + // Handle ISO 8601 date + return dateParser->parse(sourceStr, errorCode); +} + +// See comment on tryPatterns() for spec reference +UDate StandardFunctions::DateTime::tryTimeZonePatterns(const UnicodeString& sourceStr, + UErrorCode& errorCode) { + if (U_FAILURE(errorCode)) { + return 0; + } + int32_t len = sourceStr.length(); + if (len > 0 && sourceStr[len] == 'Z') { + return dateTimeUTCParser->parse(sourceStr, errorCode); + } + return dateTimeZoneParser->parse(sourceStr, errorCode); +} + +// Returns true iff `sourceStr` ends in an offset like +03:30 or -06:00 +// (This function is just used to determine whether to call tryPatterns() +// or tryTimeZonePatterns(); tryTimeZonePatterns() checks fully that the +// string matches the expected format) +static bool hasTzOffset(const UnicodeString& sourceStr) { + int32_t len = sourceStr.length(); + + if (len <= 6) { + return false; + } + return ((sourceStr[len - 6] == PLUS || sourceStr[len - 6] == HYPHEN) + && sourceStr[len - 3] == COLON); +} + +// Note: `calendar` option to :datetime not implemented yet; +// Gregorian calendar is assumed +DateInfo StandardFunctions::DateTime::createDateInfoFromString(const UnicodeString& sourceStr, + UErrorCode& errorCode) { if (U_FAILURE(errorCode)) { return {}; } - return FormattedPlaceholder(toFormat, std::move(opts), FormattedValue(std::move(result))); + + UDate absoluteDate; + + // Check if the string has a time zone part + int32_t indexOfZ = sourceStr.indexOf('Z'); + int32_t indexOfPlus = sourceStr.lastIndexOf('+'); + int32_t indexOfMinus = sourceStr.lastIndexOf('-'); + int32_t indexOfSign = indexOfPlus > -1 ? indexOfPlus : indexOfMinus; + bool isTzOffset = hasTzOffset(sourceStr); + bool isGMT = indexOfZ > 0; + UnicodeString offsetPart; + bool hasTimeZone = isTzOffset || isGMT; + + if (!hasTimeZone) { + // No time zone; parse the date and time + absoluteDate = tryPatterns(sourceStr, errorCode); + if (U_FAILURE(errorCode)) { + return {}; + } + } else { + // Try to split into time zone and non-time-zone parts + UnicodeString dateTimePart; + if (isGMT) { + dateTimePart = sourceStr.tempSubString(0, indexOfZ); + } else { + dateTimePart = sourceStr.tempSubString(0, indexOfSign); + } + // Parse the date from the date/time part + tryPatterns(dateTimePart, errorCode); + // Failure -- can't parse this string + if (U_FAILURE(errorCode)) { + return {}; + } + // Success -- now parse the time zone part + if (isGMT) { + dateTimePart += UnicodeString("GMT"); + absoluteDate = tryTimeZonePatterns(dateTimePart, errorCode); + if (U_FAILURE(errorCode)) { + return {}; + } + } else { + // Try to parse time zone in offset format: [+-]nn:nn + absoluteDate = tryTimeZonePatterns(sourceStr, errorCode); + if (U_FAILURE(errorCode)) { + return {}; + } + offsetPart = sourceStr.tempSubString(indexOfSign, sourceStr.length()); + } + } + + // If the time zone was provided, get its canonical ID, + // in order to return it in the DateInfo + UnicodeString canonicalID; + if (hasTimeZone) { + UnicodeString tzID("GMT"); + if (!isGMT) { + tzID += offsetPart; + } + TimeZone::getCanonicalID(tzID, canonicalID, errorCode); + if (U_FAILURE(errorCode)) { + return {}; + } + } + + return { absoluteDate, canonicalID }; } -StandardFunctions::DateTimeFactory::~DateTimeFactory() {} StandardFunctions::DateTime::~DateTime() {} +StandardFunctions::DateTimeValue::~DateTimeValue() {} -// --------- TextFactory +// --------- String -Selector* StandardFunctions::TextFactory::createSelector(const Locale& locale, UErrorCode& errorCode) const { - Selector* result = new TextSelector(locale); - if (result == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; +/* static */ StandardFunctions::String* +StandardFunctions::String::string(UErrorCode& success) { + NULL_ON_ERROR(success); + + LocalPointer result(new String()); + if (!result.isValid()) { + success = U_MEMORY_ALLOCATION_ERROR; return nullptr; } + return result.orphan(); +} + +extern UnicodeString formattableToString(const Locale&, + const Formattable&, + UErrorCode&); + +LocalPointer +StandardFunctions::String::call(const FunctionContext& context, + const FunctionValue& val, + const FunctionOptions& opts, + UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return LocalPointer(); + } + LocalPointer + result(new StringValue(context, val, opts, errorCode)); + if (!result.isValid()) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } return result; } -void StandardFunctions::TextSelector::selectKey(FormattedPlaceholder&& toFormat, - FunctionOptions&& opts, - const UnicodeString* keys, - int32_t keysLen, - UnicodeString* prefs, - int32_t& prefsLen, - UErrorCode& errorCode) const { +UnicodeString StandardFunctions::StringValue::formatToString(UErrorCode& errorCode) const { + (void) errorCode; + + return formattedString; +} + +UMFDirectionality stringOutputDirection(UMFBidiOption inputDir) { + switch (inputDir) { + case U_MF_BIDI_OPTION_INHERIT: + case U_MF_BIDI_OPTION_AUTO: + return U_MF_DIRECTIONALITY_UNKNOWN; + case U_MF_BIDI_OPTION_LTR: + return U_MF_DIRECTIONALITY_LTR; + case U_MF_BIDI_OPTION_RTL: + return U_MF_DIRECTIONALITY_RTL; + } + + return U_MF_DIRECTIONALITY_LTR; +} + +StandardFunctions::StringValue::StringValue(const FunctionContext& context, + const FunctionValue& val, + const FunctionOptions&, + UErrorCode& status) { + CHECK_ERROR(status); + locale = context.getLocale(); + innerValue = val.unwrap(); + functionName = UnicodeString("string"); + inputDir = context.getDirection(); + dir = stringOutputDirection(inputDir); // No options - (void) opts; + // Convert to string + formattedString = formattableToString(context.getLocale(), innerValue, status); +} +void StandardFunctions::StringValue::selectKeys(const UnicodeString* keys, + int32_t keysLen, + int32_t* prefs, + int32_t& prefsLen, + UErrorCode& errorCode) const { CHECK_ERROR(errorCode); // Just compares the key and value as strings - // Argument must be present - if (!toFormat.canFormat()) { - errorCode = U_MF_SELECTOR_ERROR; - return; - } - prefsLen = 0; - // Convert to string - const UnicodeString& formattedValue = toFormat.formatToString(locale, errorCode); if (U_FAILURE(errorCode)) { return; } // Normalize result - UnicodeString normalized = normalizeNFC(formattedValue); + UnicodeString normalized = normalizeNFC(formattedString); for (int32_t i = 0; i < keysLen; i++) { if (keys[i] == normalized) { - prefs[0] = keys[i]; + prefs[0] = i; prefsLen = 1; break; } } } -StandardFunctions::TextFactory::~TextFactory() {} -StandardFunctions::TextSelector::~TextSelector() {} +StandardFunctions::String::~String() {} +StandardFunctions::StringValue::~StringValue() {} -// ------------ TestFormatFactory +// ------------ TestFunction -Formatter* StandardFunctions::TestFormatFactory::createFormatter(const Locale& locale, UErrorCode& errorCode) { - NULL_ON_ERROR(errorCode); +StandardFunctions::TestFunction::~TestFunction() {} +StandardFunctions::TestFunctionValue::~TestFunctionValue() {} - // Results are not locale-dependent - (void) locale; - Formatter* result = new TestFormat(); - if (result == nullptr) { +LocalPointer StandardFunctions::TestFunction::call(const FunctionContext& context, + const FunctionValue& operand, + const FunctionOptions& options, + UErrorCode& errorCode) const { + if (U_FAILURE(errorCode)) { + return LocalPointer(); + } + LocalPointer + val(new TestFunctionValue(*this, context, operand, options, errorCode)); + if (!val.isValid()) { errorCode = U_MEMORY_ALLOCATION_ERROR; } - return result; + return val; } -StandardFunctions::TestFormatFactory::~TestFormatFactory() {} -StandardFunctions::TestFormat::~TestFormat() {} - // Extract numeric value from a Formattable or, if it's a string, // parse it as a number according to the MF2 `number-literal` grammar production double formattableToNumber(const Formattable& arg, UErrorCode& status) { @@ -1684,7 +2040,9 @@ double formattableToNumber(const Formattable& arg, UErrorCode& status) { } case UFMT_STRING: { // Try to parse the string as a number - result = parseNumberLiteral(arg, status); + const UnicodeString& s = arg.getString(status); + U_ASSERT(U_SUCCESS(status)); + result = parseNumberLiteral(s, status); if (U_FAILURE(status)) { status = U_MF_OPERAND_MISMATCH_ERROR; } @@ -1699,14 +2057,53 @@ double formattableToNumber(const Formattable& arg, UErrorCode& status) { return result; } +static bool isTestFunction(const UnicodeString& s) { + return (s == functions::TEST_FORMAT + || s == functions::TEST_SELECT + || s == functions::TEST_FUNCTION); +} + +static void setFailsFromFunctionValue(const FunctionValue& optionValue, + bool& failsFormat, + bool& failsSelect, + UErrorCode& status) { + UnicodeString failsString = optionValue.unwrap().getString(status); + if (U_SUCCESS(status)) { + // 9i. If its value resolves to the string 'always', then + if (failsString == options::ALWAYS) { + // 9ia. Set FailsFormat to be true + failsFormat = true; + // 9ib. Set FailsSelect to be true. + failsSelect = true; + } + // 9ii. Else if its value resolves to the string "format", then + else if (failsString == options::FORMAT) { + // 9ia. Set FailsFormat to be true + failsFormat = true; + } + // 9iii. Else if its value resolves to the string "select", then + else if (failsString == options::SELECT) { + // 9iiia. Set FailsSelect to be true. + failsSelect = true; + } + // 9iv. Else if its value does not resolve to the string "never", then + else if (failsString != options::NEVER) { + // 9iv(a). Emit "bad-option" Resolution Error. + status = U_MF_BAD_OPTION; + } + } else { + // 9iv. again + status = U_MF_BAD_OPTION; + } +} -/* static */ void StandardFunctions::TestFormat::testFunctionParameters(const FormattedPlaceholder& arg, - const FunctionOptions& options, - int32_t& decimalPlaces, - bool& failsFormat, - bool& failsSelect, - double& input, - UErrorCode& status) { +/* static */ void StandardFunctions::TestFunction::testFunctionParameters(const FunctionValue& arg, + const FunctionOptions& options, + int32_t& decimalPlaces, + bool& failsFormat, + bool& failsSelect, + double& input, + UErrorCode& status) const { CHECK_ERROR(status); // 1. Let DecimalPlaces be 0. @@ -1721,96 +2118,122 @@ double formattableToNumber(const Formattable& arg, UErrorCode& status) { // 4. Let arg be the resolved value of the expression operand. // (already true) - // Step 5 omitted because composition isn't fully implemented yet - // 6. Else if arg is a numerical value or a string matching the number-literal production, then - input = formattableToNumber(arg.asFormattable(), status); - if (U_FAILURE(status)) { - // 7. Else, - // 7i. Emit "bad-input" Resolution Error. - status = U_MF_OPERAND_MISMATCH_ERROR; - // 7ii. Use a fallback value as the resolved value of the expression. - // Further steps of this algorithm are not followed. + // 5. If arg is the resolved value of an expression with a :test:function, :test:select, or :test:format annotation for which resolution has succeeded, then + if (isTestFunction(arg.getFunctionName())) { + // 5i. Let Input be the Input value of arg. + input = formattableToNumber(arg.unwrap(), status); + if (U_FAILURE(status)) { + status = U_MF_OPERAND_MISMATCH_ERROR; + return; + } + const FunctionOptions& opts = arg.getResolvedOptions(); + // 5ii. Set DecimalPlaces to be DecimalPlaces value of arg. + const FunctionValue* decimalPlacesFunctionValue = opts.getFunctionOption(UnicodeString("decimalPlaces"), status); + if (U_SUCCESS(status)) { + decimalPlaces = formattableToNumber(decimalPlacesFunctionValue->unwrap(), status); + if (U_FAILURE(status)) { + status = U_MF_OPERAND_MISMATCH_ERROR; + return; + } + } else { + // Option was not provided -- not an error + status = U_ZERO_ERROR; + } + // 5iii. Set FailsFormat to be FailsFormat value of arg. + const FunctionValue* failsFormatFunctionValue = opts.getFunctionOption(UnicodeString("fails"), status); + if (U_SUCCESS(status)) { + setFailsFromFunctionValue(*failsFormatFunctionValue, failsFormat, failsSelect, status); + if (U_FAILURE(status)) { + status = U_MF_BAD_OPTION; + return; + } + } else { + // Option was not provided -- not an error + status = U_ZERO_ERROR; + } + // 5iv. Set FailsSelect to be FailsSelect value of arg. + // (Done in previous step) + } else { + // 6. Else if arg is a numerical value or a string matching the number-literal production, then + input = formattableToNumber(arg.unwrap(), status); + if (U_FAILURE(status)) { + // 7. Else, + // 7i. Emit "bad-operand" Resolution Error. + status = U_MF_OPERAND_MISMATCH_ERROR; + // 7ii. Use a fallback value as the resolved value of the expression. + // Further steps of this algorithm are not followed. + return; + } } + + const FunctionValue* decimalPlacesOpt = options.getFunctionOption(options::DECIMAL_PLACES, status); // 8. If the decimalPlaces option is set, then - Formattable opt; - if (options.getFunctionOption(options::DECIMAL_PLACES, opt)) { + if (U_SUCCESS(status)) { // 8i. If its value resolves to a numerical integer value 0 or 1 // or their corresponding string representations '0' or '1', then - double decimalPlacesInput = formattableToNumber(opt, status); + double decimalPlacesInput = formattableToNumber(decimalPlacesOpt->unwrap(), status); if (U_SUCCESS(status)) { if (decimalPlacesInput == 0 || decimalPlacesInput == 1) { // 8ia. Set DecimalPlaces to be the numerical value of the option. decimalPlaces = decimalPlacesInput; } - } - // 8ii. Else if its value is not an unresolved value set by option resolution, - else { - // 8iia. Emit "bad-option" Resolution Error. - status = U_MF_BAD_OPTION; - // 8iib. Use a fallback value as the resolved value of the expression. - } - } - // 9. If the fails option is set, then - Formattable failsOpt; - if (options.getFunctionOption(options::FAILS, failsOpt)) { - UnicodeString failsString = failsOpt.getString(status); - if (U_SUCCESS(status)) { - // 9i. If its value resolves to the string 'always', then - if (failsString == u"always") { - // 9ia. Set FailsFormat to be true - failsFormat = true; - // 9ib. Set FailsSelect to be true. - failsSelect = true; - } - // 9ii. Else if its value resolves to the string "format", then - else if (failsString == u"format") { - // 9ia. Set FailsFormat to be true - failsFormat = true; - } - // 9iii. Else if its value resolves to the string "select", then - else if (failsString == u"select") { - // 9iiia. Set FailsSelect to be true. - failsSelect = true; - } - // 9iv. Else if its value does not resolve to the string "never", then - else if (failsString != u"never") { - // 9iv(a). Emit "bad-option" Resolution Error. + // 8ii. Else if its value is not an unresolved value set by option resolution, + else { + // 8iia. Emit "bad-option" Resolution Error. status = U_MF_BAD_OPTION; + return; + // 8iib. Use a fallback value as the resolved value of the expression. } } else { - // 9iv. again status = U_MF_BAD_OPTION; + return; } + } else { + // Option was not provided -- not an error + status = U_ZERO_ERROR; } -} -FormattedPlaceholder StandardFunctions::TestFormat::format(FormattedPlaceholder&& arg, - FunctionOptions&& options, - UErrorCode& status) const{ + const FunctionValue* failsOpt = options.getFunctionOption(UnicodeString("fails"), status); + // 9. If the fails option is set, then + if (U_SUCCESS(status)) { + setFailsFromFunctionValue(*failsOpt, failsFormat, failsSelect, status); + } else { + // Option was not provided -- not an error + status = U_ZERO_ERROR; + } +} - int32_t decimalPlaces; - bool failsFormat; - bool failsSelect; - double input; +StandardFunctions::TestFunctionValue::TestFunctionValue(const TestFunction& parent, + const FunctionContext&, + const FunctionValue& arg, + const FunctionOptions& options, + UErrorCode& status) { + parent.testFunctionParameters(arg, options, decimalPlaces, + failsFormat, failsSelect, input, status); + CHECK_ERROR(status); + opts = options.mergeOptions(arg.getResolvedOptions(), status); + innerValue = arg.unwrap(); + canFormat = parent.canFormat; + canSelect = parent.canSelect; + functionName = UnicodeString(canFormat && canSelect ? + "test:function" + : canFormat ? "test:format" + : "test:select"); - testFunctionParameters(arg, options, decimalPlaces, - failsFormat, failsSelect, input, status); - if (U_FAILURE(status)) { - return FormattedPlaceholder(arg.getFallback()); - } + CHECK_ERROR(status); // If FailsFormat is true, attempting to format the placeholder to any // formatting target will fail. if (failsFormat) { - status = U_MF_FORMATTING_ERROR; - return FormattedPlaceholder(arg.getFallback()); + formattedString = arg.getFallback(); + return; } - UnicodeString result; + // When :test:function is used as a formatter, a placeholder resolving to a value // with a :test:function expression is formatted as a concatenation of the following parts: // 1. If Input is less than 0, the character - U+002D Hyphen-Minus. if (input < 0) { - result += HYPHEN; + formattedString += HYPHEN; } // 2. The truncated absolute integer value of Input, i.e. floor(abs(Input)), formatted as a // sequence of decimal digit characters (U+0030...U+0039). @@ -1826,86 +2249,93 @@ FormattedPlaceholder StandardFunctions::TestFormat::format(FormattedPlaceholder& &ignore, &ignoreLen, &ignorePoint); - result += UnicodeString(buffer); + formattedString += UnicodeString(buffer); // 3. If DecimalPlaces is 1, then if (decimalPlaces == 1) { // 3i. The character . U+002E Full Stop. - result += u"."; + formattedString += u"."; // 3ii. The single decimal digit character representing the value // floor((abs(Input) - floor(abs(Input))) * 10) int32_t val = floor((abs(input) - floor(abs(input)) * 10)); - result += digitToChar(val, status); + formattedString += digitToChar(val, status); U_ASSERT(U_SUCCESS(status)); } - return FormattedPlaceholder(result); } -// ------------ TestSelectFactory - -StandardFunctions::TestSelectFactory::~TestSelectFactory() {} -StandardFunctions::TestSelect::~TestSelect() {} - -Selector* StandardFunctions::TestSelectFactory::createSelector(const Locale& locale, - UErrorCode& errorCode) const { - NULL_ON_ERROR(errorCode); - - // Results are not locale-dependent - (void) locale; - - Selector* result = new TestSelect(); - if (result == nullptr) { - errorCode = U_MEMORY_ALLOCATION_ERROR; +UnicodeString StandardFunctions::TestFunctionValue::formatToString(UErrorCode& status) const { + if (U_FAILURE(status)) { + return {}; } - return result; + if (failsFormat) { + status = U_MF_BAD_OPTION; + } else if (!canFormat) { + status = U_MF_FORMATTING_ERROR; + } + if (!canFormat) { + return {}; + } + return formattedString; } -void StandardFunctions::TestSelect::selectKey(FormattedPlaceholder&& val, - FunctionOptions&& options, - const UnicodeString* keys, - int32_t keysLen, - UnicodeString* prefs, - int32_t& prefsLen, - UErrorCode& status) const { - int32_t decimalPlaces; - bool failsFormat; - bool failsSelect; - double input; - - TestFormat::testFunctionParameters(val, options, decimalPlaces, - failsFormat, failsSelect, input, status); - +void StandardFunctions::TestFunctionValue::selectKeys(const UnicodeString* keys, + int32_t keysLen, + int32_t* prefs, + int32_t& prefsLen, + UErrorCode& status) const { if (U_FAILURE(status)) { return; } - if (failsSelect) { + if (!canSelect || failsSelect) { status = U_MF_SELECTOR_ERROR; return; } + prefsLen = 0; + + if (input != 1) { + return; + } + // If the Input is 1 and DecimalPlaces is 1, the method will return some slice // of the list « '1.0', '1' », depending on whether those values are included in keys. - bool include1point0 = false; - bool include1 = false; if (input == 1 && decimalPlaces == 1) { - include1point0 = true; - include1 = true; - } else if (input == 1 && decimalPlaces == 0) { - include1 = true; + // 1.0 must come first, so search the keys for 1.0 and then 1 + for (int32_t i = 0; i < keysLen; i++) { + if (keys[i] == u"1.0") { + prefs[0] = i; + prefsLen++; + } + } } // If the Input is 1 and DecimalPlaces is 0, the method will return the list « '1' » if // keys includes '1', or an empty list otherwise. // If the Input is any other value, the method will return an empty list. for (int32_t i = 0; i < keysLen; i++) { - if ((keys[i] == u"1" && include1) - || (keys[i] == u"1.0" && include1point0)) { - prefs[prefsLen] = keys[i]; + if (keys[i] == u"1") { + prefs[prefsLen] = i; prefsLen++; } } } +StandardFunctions::TestFunction::TestFunction(bool format, bool select) : canFormat(format), canSelect(select) { + U_ASSERT(format || select); +} + +/* static */ StandardFunctions::TestFunction* StandardFunctions::TestFunction::testFunction(UErrorCode& status) { + return create(TestFunction(true, true), status); +} + +/* static */ StandardFunctions::TestFunction* StandardFunctions::TestFunction::testFormat(UErrorCode& status) { + return create(TestFunction(true, false), status); +} + +/* static */ StandardFunctions::TestFunction* StandardFunctions::TestFunction::testSelect(UErrorCode& status) { + return create(TestFunction(false, true), status); +} + } // namespace message2 U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/messageformat2_function_registry_internal.h b/deps/icu-small/source/i18n/messageformat2_function_registry_internal.h index 25d2a467502d..f7a39766dad6 100644 --- a/deps/icu-small/source/i18n/messageformat2_function_registry_internal.h +++ b/deps/icu-small/source/i18n/messageformat2_function_registry_internal.h @@ -2,6 +2,7 @@ // License & terms of use: http://www.unicode.org/copyright.html #include "unicode/utypes.h" +#include "uvector.h" // U_ASSERT #ifndef U_HIDE_DEPRECATED_API @@ -25,9 +26,17 @@ namespace message2 { // Constants for option names namespace options { +static constexpr std::u16string_view ACCOUNTING = u"accounting"; +static constexpr std::u16string_view ADD = u"add"; static constexpr std::u16string_view ALWAYS = u"always"; +static constexpr std::u16string_view AUTO = u"auto"; +static constexpr std::u16string_view CEIL = u"ceil"; +static constexpr std::u16string_view CODE = u"code"; static constexpr std::u16string_view COMPACT = u"compact"; static constexpr std::u16string_view COMPACT_DISPLAY = u"compactDisplay"; +static constexpr std::u16string_view CURRENCY = u"currency"; +static constexpr std::u16string_view CURRENCY_DISPLAY = u"currencyDisplay"; +static constexpr std::u16string_view CURRENCY_SIGN = u"currencySign"; static constexpr std::u16string_view DATE_STYLE = u"dateStyle"; static constexpr std::u16string_view DAY = u"day"; static constexpr std::u16string_view DECIMAL_PLACES = u"decimalPlaces"; @@ -35,11 +44,23 @@ static constexpr std::u16string_view DEFAULT_UPPER = u"DEFAULT"; static constexpr std::u16string_view ENGINEERING = u"engineering"; static constexpr std::u16string_view EXACT = u"exact"; static constexpr std::u16string_view EXCEPT_ZERO = u"exceptZero"; +static constexpr std::u16string_view EXPAND = u"expand"; static constexpr std::u16string_view FAILS = u"fails"; +static constexpr std::u16string_view FLOOR = u"floor"; +static constexpr std::u16string_view FORMAT = u"format"; +static constexpr std::u16string_view FRACTION_DIGITS = u"fractionDigits"; static constexpr std::u16string_view FULL_UPPER = u"FULL"; +static constexpr std::u16string_view HALF_CEIL = u"halfCeil"; +static constexpr std::u16string_view HALF_EVEN = u"halfEven"; +static constexpr std::u16string_view HALF_EXPAND = u"halfExpand"; +static constexpr std::u16string_view HALF_FLOOR = u"halfFloor"; +static constexpr std::u16string_view HALF_TRUNC = u"halfTrunc"; static constexpr std::u16string_view HOUR = u"hour"; +static constexpr std::u16string_view INHERIT = u"inherit"; +static constexpr std::u16string_view LESS_PRECISION = u"lessPrecision"; static constexpr std::u16string_view LONG = u"long"; static constexpr std::u16string_view LONG_UPPER = u"LONG"; +static constexpr std::u16string_view LTR = u"ltr"; static constexpr std::u16string_view MAXIMUM_FRACTION_DIGITS = u"maximumFractionDigits"; static constexpr std::u16string_view MAXIMUM_SIGNIFICANT_DIGITS = u"maximumSignificantDigits"; static constexpr std::u16string_view MEDIUM_UPPER = u"MEDIUM"; @@ -49,7 +70,10 @@ static constexpr std::u16string_view MINIMUM_INTEGER_DIGITS = u"minimumIntegerDi static constexpr std::u16string_view MINIMUM_SIGNIFICANT_DIGITS = u"minimumSignificantDigits"; static constexpr std::u16string_view MINUTE = u"minute"; static constexpr std::u16string_view MONTH = u"month"; +static constexpr std::u16string_view MORE_PRECISION = u"morePrecision"; +static constexpr std::u16string_view NAME = u"name"; static constexpr std::u16string_view NARROW = u"narrow"; +static constexpr std::u16string_view NARROW_SYMBOL = u"narrowSymbol"; static constexpr std::u16string_view NEGATIVE = u"negative"; static constexpr std::u16string_view NEVER = u"never"; static constexpr std::u16string_view NOTATION = u"notation"; @@ -57,35 +81,70 @@ static constexpr std::u16string_view NUMBERING_SYSTEM = u"numberingSystem"; static constexpr std::u16string_view NUMERIC = u"numeric"; static constexpr std::u16string_view ORDINAL = u"ordinal"; static constexpr std::u16string_view PERCENT_STRING = u"percent"; +static constexpr std::u16string_view ROUNDING_INCREMENT = u"roundingIncrement"; +static constexpr std::u16string_view ROUNDING_MODE = u"roundingMode"; +static constexpr std::u16string_view ROUNDING_PRIORITY = u"roundingPriority"; +static constexpr std::u16string_view RTL = u"rtl"; static constexpr std::u16string_view SCIENTIFIC = u"scientific"; static constexpr std::u16string_view SECOND = u"second"; static constexpr std::u16string_view SELECT = u"select"; static constexpr std::u16string_view SHORT = u"short"; static constexpr std::u16string_view SHORT_UPPER = u"SHORT"; static constexpr std::u16string_view SIGN_DISPLAY = u"signDisplay"; +static constexpr std::u16string_view STRIP_IF_INTEGER = u"stripIfInteger"; static constexpr std::u16string_view STYLE = u"style"; +static constexpr std::u16string_view SUBTRACT = u"subtract"; static constexpr std::u16string_view TIME_STYLE = u"timeStyle"; +static constexpr std::u16string_view TRAILING_ZERO_DISPLAY = u"trailingZeroDisplay"; +static constexpr std::u16string_view TRUNC = u"trunc"; static constexpr std::u16string_view TWO_DIGIT = u"2-digit"; +static constexpr std::u16string_view U_DIR = u"u:dir"; +static constexpr std::u16string_view U_ID = u"u:id"; static constexpr std::u16string_view USE_GROUPING = u"useGrouping"; static constexpr std::u16string_view WEEKDAY = u"weekday"; static constexpr std::u16string_view YEAR = u"year"; } // namespace options // Built-in functions - /* - The standard functions are :datetime, :date, :time, - :number, :integer, and :string, - per https://github.com/unicode-org/message-format-wg/blob/main/spec/registry.md - as of https://github.com/unicode-org/message-format-wg/releases/tag/LDML45-alpha - */ + // See https://github.com/unicode-org/message-format-wg/blob/main/spec/functions/README.md class StandardFunctions { - friend class MessageFormatter; + friend class MF2RegistrySingleton; public: + + typedef enum NumberType { + kCurrency, + kInteger, + kNumber, + kOffset, + kPercent + } NumberType; + + class DigitSizeOption { + public: + bool isAuto() const { return isAutoVal && !isInvalidVal; } + bool isInvalid() const { return isInvalidVal; } + int32_t value() const { + U_ASSERT(!isAutoVal && !isInvalidVal); + return val; + } + static DigitSizeOption autoVal() { return DigitSizeOption(false); } + static DigitSizeOption intVal(int32_t i) { return DigitSizeOption(i); } + static DigitSizeOption invalid() { return DigitSizeOption(true); } + private: + explicit DigitSizeOption(bool invalid) : isAutoVal(true), isInvalidVal(invalid) {} + explicit DigitSizeOption(int32_t i) : isAutoVal(false), isInvalidVal(false), val(i) {} + const bool isAutoVal = false; + const bool isInvalidVal = false; + const int32_t val = 0; + }; + // Used for normalizing variable names and keys for comparison static UnicodeString normalizeNFC(const UnicodeString&); private: + static void requireNoRoundingIncrement(const FunctionOptions&, UErrorCode&); + static number::Precision withRoundingIncrement(const FunctionOptions&, bool&, int32_t, UErrorCode&); static void validateDigitSizeOptions(const FunctionOptions&, UErrorCode&); static void checkSelectOption(const FunctionOptions&, UErrorCode&); static UnicodeString getStringOption(const FunctionOptions& opts, @@ -93,238 +152,228 @@ static constexpr std::u16string_view YEAR = u"year"; UErrorCode& errorCode); class DateTime; + class DateTimeValue; - class DateTimeFactory : public FormatterFactory { - public: - Formatter* createFormatter(const Locale& locale, UErrorCode& status) override; - static DateTimeFactory* date(UErrorCode&); - static DateTimeFactory* time(UErrorCode&); - static DateTimeFactory* dateTime(UErrorCode&); - DateTimeFactory() = delete; - virtual ~DateTimeFactory(); - - private: - friend class DateTime; - - typedef enum DateTimeType { - Date, - Time, - DateTime - } DateTimeType; - - DateTimeType type; - DateTimeFactory(DateTimeType t) : type(t) {} - }; - - class DateTime : public Formatter { + class DateTime : public Function { public: - FormattedPlaceholder format(FormattedPlaceholder&& toFormat, FunctionOptions&& options, UErrorCode& status) const override; + static DateTime* date(UErrorCode&); + static DateTime* time(UErrorCode&); + static DateTime* dateTime(UErrorCode&); + + LocalPointer call(const FunctionContext& context, + const FunctionValue& operand, + const FunctionOptions& options, + UErrorCode& errorCode) const override; virtual ~DateTime(); private: - const Locale& locale; - const DateTimeFactory::DateTimeType type; friend class DateTimeFactory; - DateTime(const Locale& l, DateTimeFactory::DateTimeType t) - : locale(l), type(t) {} - const LocalPointer icuFormatter; + friend class DateTimeValue; // Methods for parsing date literals - UDate tryPatterns(const UnicodeString&, UErrorCode&) const; - UDate tryTimeZonePatterns(const UnicodeString&, UErrorCode&) const; - DateInfo createDateInfoFromString(const UnicodeString&, UErrorCode&) const; - - /* - Looks up an option by name, first checking `opts`, then the cached options - in `toFormat` if applicable, and finally using a default - - Ignores any options with non-string values - */ - UnicodeString getFunctionOption(const FormattedPlaceholder& toFormat, - const FunctionOptions& opts, - std::u16string_view optionName) const; - // Version for options that don't have defaults; sets the error - // code instead of returning a default value - UnicodeString getFunctionOption(const FormattedPlaceholder& toFormat, - const FunctionOptions& opts, - std::u16string_view optionName, - UErrorCode& errorCode) const; + static UDate tryPatterns(const UnicodeString&, UErrorCode&); + static UDate tryTimeZonePatterns(const UnicodeString&, UErrorCode&); + static DateInfo createDateInfoFromString(const UnicodeString&, UErrorCode&); - }; + typedef enum DateTimeType { + kDate, + kTime, + kDateTime + } DateTimeType; - // Note: IntegerFactory doesn't implement SelectorFactory; - // instead, an instance of PluralFactory is registered to the integer - // selector - // TODO - class IntegerFactory : public FormatterFactory { - public: - Formatter* createFormatter(const Locale& locale, UErrorCode& status) override; - virtual ~IntegerFactory(); + const DateTimeType type; + static DateTime* create(DateTimeType, UErrorCode&); + DateTime(DateTimeType t) : type(t) {} + const LocalPointer icuFormatter; }; - class NumberFactory : public FormatterFactory { - public: - Formatter* createFormatter(const Locale& locale, UErrorCode& status) override; - virtual ~NumberFactory(); - private: - friend class IntegerFactory; - static NumberFactory integer(const Locale& locale, UErrorCode& status); - }; + class NumberValue; - class Number : public Formatter { + class Number : public Function { public: - FormattedPlaceholder format(FormattedPlaceholder&& toFormat, FunctionOptions&& options, UErrorCode& status) const override; + static Number* currency(UErrorCode& success); + static Number* integer(UErrorCode& success); + static Number* number(UErrorCode& success); + static Number* offset(UErrorCode& success); + static Number* percent(UErrorCode& success); + + LocalPointer call(const FunctionContext& context, + const FunctionValue& operand, + const FunctionOptions& options, + UErrorCode& errorCode) const override; virtual ~Number(); private: - friend class NumberFactory; + friend class NumberValue; friend class StandardFunctions; - Number(const Locale& loc) : locale(loc), icuFormatter(number::NumberFormatter::withLocale(loc)) {} - Number(const Locale& loc, bool isInt) : locale(loc), isInteger(isInt), icuFormatter(number::NumberFormatter::withLocale(loc)) {} - static Number integer(const Locale& loc); + typedef enum PluralType { + PLURAL_ORDINAL, + PLURAL_CARDINAL, + PLURAL_EXACT + } PluralType; + + static Number* create(NumberType, UErrorCode&); + Number(NumberType t) : numberType(t) {} // These options have their own accessor methods, since they have different default values. + DigitSizeOption digitSizeOption(const FunctionOptions&, std::u16string_view, bool, UErrorCode&) const; + DigitSizeOption digitSizeOptionWithAuto(const FunctionOptions&, + std::u16string_view) const; + int32_t digitSizeOptionNoAuto(const FunctionOptions&, + std::u16string_view) const; + DigitSizeOption fractionDigits(const FunctionOptions& options) const; int32_t maximumFractionDigits(const FunctionOptions& options) const; int32_t minimumFractionDigits(const FunctionOptions& options) const; int32_t minimumSignificantDigits(const FunctionOptions& options) const; int32_t maximumSignificantDigits(const FunctionOptions& options) const; int32_t minimumIntegerDigits(const FunctionOptions& options) const; - + int32_t addOption(const FunctionOptions&, UErrorCode&) const; + int32_t subtractOption(const FunctionOptions&, UErrorCode&) const; bool usePercent(const FunctionOptions& options) const; - const Locale& locale; - const bool isInteger = false; + const NumberType numberType = NumberType::kNumber; const number::LocalizedNumberFormatter icuFormatter; + + static PluralType pluralType(const FunctionOptions& opts); }; static number::LocalizedNumberFormatter formatterForOptions(const Number& number, + const Locale& locale, const FunctionOptions& opts, + bool, UErrorCode& status); - class PluralFactory : public SelectorFactory { - public: - Selector* createSelector(const Locale& locale, UErrorCode& status) const override; - virtual ~PluralFactory(); + class NumberValue : public FunctionValue { + public: + UnicodeString formatToString(UErrorCode&) const override; + void selectKeys(const UnicodeString* keys, + int32_t keysLen, + int32_t* prefs, + int32_t& prefsLen, + UErrorCode& status) const override; + UBool isSelectable() const override { return numberType != NumberType::kCurrency; } + NumberValue(); + const UnicodeString& getFunctionName() const override { return functionName; } + virtual ~NumberValue(); private: - friend class IntegerFactory; - friend class MessageFormatter; - - PluralFactory() {} - PluralFactory(bool isInt) : isInteger(isInt) {} - static PluralFactory integer() { return PluralFactory(true);} - const bool isInteger = false; - }; - - class Plural : public Selector { + friend class Number; + + NumberType numberType = NumberType::kNumber; + number::FormattedNumber formattedNumber; + number::FormattedNumber scaledFormattedNumber; + number::FormattedNumber percentFormattedNumber; + NumberValue(const Number&, + const FunctionContext&, + const FunctionValue&, + const FunctionOptions&, + UErrorCode&); + }; // class NumberValue + + class DateTimeValue : public FunctionValue { public: - void selectKey(FormattedPlaceholder&& val, - FunctionOptions&& options, - const UnicodeString* keys, - int32_t keysLen, - UnicodeString* prefs, - int32_t& prefsLen, - UErrorCode& status) const override; - virtual ~Plural(); - + UnicodeString formatToString(UErrorCode&) const override; + DateTimeValue(); + const UnicodeString& getFunctionName() const override { return functionName; } + virtual ~DateTimeValue(); private: - friend class IntegerFactory; - friend class PluralFactory; - - // Can't use UPluralType for this since we want to include - // exact matching as an option - typedef enum PluralType { - PLURAL_ORDINAL, - PLURAL_CARDINAL, - PLURAL_EXACT - } PluralType; - Plural(const Locale& loc, UErrorCode& errorCode); - Plural(const Locale& loc, bool isInt, UErrorCode& errorCode); - static Plural integer(const Locale& loc, UErrorCode& errorCode) { return Plural(loc, true, errorCode); } - PluralType pluralType(const FunctionOptions& opts) const; - const Locale& locale; - const bool isInteger = false; - LocalPointer numberFormatter; - }; + friend class DateTime; - class TextFactory : public SelectorFactory { - public: - Selector* createSelector(const Locale& locale, UErrorCode& status) const override; - virtual ~TextFactory(); - }; + UnicodeString formattedDate; + DateTimeValue(DateTime::DateTimeType type, const FunctionContext& context, + const FunctionValue&, const FunctionOptions&, UErrorCode&); + }; // class DateTimeValue - class TextSelector : public Selector { + class String : public Function { public: - void selectKey(FormattedPlaceholder&& val, - FunctionOptions&& options, - const UnicodeString* keys, - int32_t keysLen, - UnicodeString* prefs, - int32_t& prefsLen, - UErrorCode& status) const override; - virtual ~TextSelector(); + LocalPointer call(const FunctionContext& context, + const FunctionValue& val, + const FunctionOptions& opts, + UErrorCode& errorCode) const override; + static String* string(UErrorCode& status); + virtual ~String(); private: - friend class TextFactory; + friend class StringFactory; - // Formatting `value` to a string might require the locale - const Locale& locale; - - TextSelector(const Locale& l) : locale(l) {} + String() {} }; // See https://github.com/unicode-org/message-format-wg/blob/main/test/README.md - class TestFormatFactory : public FormatterFactory { - public: - Formatter* createFormatter(const Locale& locale, UErrorCode& status) override; - TestFormatFactory() {} - virtual ~TestFormatFactory(); - }; - - class TestSelect; + class TestFunctionValue; - class TestFormat : public Formatter { + class TestFunction : public Function { public: - FormattedPlaceholder format(FormattedPlaceholder&& toFormat, FunctionOptions&& options, UErrorCode& status) const override; - virtual ~TestFormat(); - + static TestFunction* testFunction(UErrorCode&); + static TestFunction* testFormat(UErrorCode&); + static TestFunction* testSelect(UErrorCode&); + + LocalPointer call(const FunctionContext& context, + const FunctionValue& operand, + const FunctionOptions& options, + UErrorCode& errorCode) const override; + virtual ~TestFunction(); private: - friend class TestFormatFactory; - friend class TestSelect; - TestFormat() {} - static void testFunctionParameters(const FormattedPlaceholder& arg, - const FunctionOptions& options, - int32_t& decimalPlaces, - bool& failsFormat, - bool& failsSelect, - double& input, - UErrorCode& status); - + friend class TestFunctionValue; + + TestFunction(bool, bool); + void testFunctionParameters(const FunctionValue&, + const FunctionOptions&, + int32_t&, + bool&, + bool&, + double&, + UErrorCode&) const; + bool canFormat; // True iff this was invoked as test:function or test:format + bool canSelect; // True iff this was involved as test:function or test:select }; - // See https://github.com/unicode-org/message-format-wg/blob/main/test/README.md - class TestSelectFactory : public SelectorFactory { + class TestFunctionValue : public FunctionValue { public: - Selector* createSelector(const Locale& locale, UErrorCode& status) const override; - TestSelectFactory() {} - virtual ~TestSelectFactory(); + UnicodeString formatToString(UErrorCode&) const override; + void selectKeys(const UnicodeString*, + int32_t, + int32_t*, + int32_t&, + UErrorCode&) const override; + UBool isSelectable() const override { return canSelect; } + TestFunctionValue(); + const UnicodeString& getFunctionName() const override { return functionName; } + virtual ~TestFunctionValue(); + private: + friend class TestFunction; + + TestFunctionValue(const TestFunction&, + const FunctionContext&, + const FunctionValue&, + const FunctionOptions&, + UErrorCode&); + + UnicodeString formattedString; + bool canFormat; + bool canSelect; + int32_t decimalPlaces; + bool failsFormat; // Different from "canFormat" -- derived from "fails" option + bool failsSelect; // Different from "canSelect" -- derived from "fails" option + double input; }; - class TestSelect : public Selector { + class StringValue : public FunctionValue { public: - void selectKey(FormattedPlaceholder&& val, - FunctionOptions&& options, - const UnicodeString* keys, - int32_t keysLen, - UnicodeString* prefs, - int32_t& prefsLen, - UErrorCode& status) const override; - virtual ~TestSelect(); - + UnicodeString formatToString(UErrorCode&) const override; + void selectKeys(const UnicodeString* keys, + int32_t keysLen, + int32_t* prefs, + int32_t& prefsLen, + UErrorCode& status) const override; + UBool isSelectable() const override { return true; } + virtual ~StringValue(); private: - friend class TestSelectFactory; - TestSelect() {} - }; + friend class String; + + UnicodeString formattedString; + StringValue(const FunctionContext&, const FunctionValue&, const FunctionOptions&, UErrorCode&); + }; // class StringValue }; diff --git a/deps/icu-small/source/i18n/messageformat2_macros.h b/deps/icu-small/source/i18n/messageformat2_macros.h index 20e81377d4d5..eafddcd4fd9e 100644 --- a/deps/icu-small/source/i18n/messageformat2_macros.h +++ b/deps/icu-small/source/i18n/messageformat2_macros.h @@ -19,6 +19,7 @@ #include "unicode/format.h" #include "unicode/unistr.h" #include "plurrule_impl.h" +#include "ubidiimp.h" U_NAMESPACE_BEGIN @@ -32,8 +33,6 @@ using namespace pluralimpl; #define LEFT_CURLY_BRACE ((UChar32)0x007B) #define RIGHT_CURLY_BRACE ((UChar32)0x007D) #define HTAB ((UChar32)0x0009) -#define CR ((UChar32)0x000D) -#define LF ((UChar32)0x000A) #define IDEOGRAPHIC_SPACE ((UChar32)0x3000) #define PIPE ((UChar32)0x007C) diff --git a/deps/icu-small/source/i18n/messageformat2_parser.cpp b/deps/icu-small/source/i18n/messageformat2_parser.cpp index 879c7024fc9c..63b1b7fb1e3c 100644 --- a/deps/icu-small/source/i18n/messageformat2_parser.cpp +++ b/deps/icu-small/source/i18n/messageformat2_parser.cpp @@ -90,7 +90,7 @@ static void copyContext(const UChar in[U_PARSE_CONTEXT_LEN], UChar out[U_PARSE_C // Translate absolute to relative offset parseError.offset = index // Start with total number of characters seen - parseError.lengthBeforeCurrentLine; // Subtract all characters before the current line - // TODO: Fill this in with actual pre and post-context + // TODO(ICU-23427): Fill this in with actual pre and post-context parseError.preContext[0] = 0; parseError.postContext[0] = 0; } @@ -487,7 +487,7 @@ bool Parser::isDeclarationStart() { /* - TODO: Since handling the whitespace ambiguities needs to be repeated + TODO(ICU-23427): Since handling the whitespace ambiguities needs to be repeated in several different places and is hard to factor out, it probably would be better to replace the parser with a lexer + parser to separate tokenizing from parsing, which would simplify the code significantly. @@ -1144,12 +1144,6 @@ void Parser::parseOption(OptionAdder& addOption, UErrorCode& errorCode) { } } -/* - Note: there are multiple overloads of parseOptions() for parsing - options within markup, vs. within an expression, vs. parsing - attributes. This should be refactored. TODO - */ - /* Consume optional whitespace followed by a sequence of options (possibly empty), separated by whitespace @@ -1973,7 +1967,7 @@ void Parser::parseSelectors(UErrorCode& status) { // Parse selectors // "Backtracking" is required here. It's not clear if whitespace is // (`[s]` selector) or (`[s]` variant) - while (isWhitespace(peek()) || peek() == DOLLAR) { + while (isWhitespace(peek()) || isBidiControl(peek()) || peek() == DOLLAR) { int32_t whitespaceStart = index; parseRequiredWhitespace(status); // Restore precondition @@ -2006,25 +2000,14 @@ void Parser::parseSelectors(UErrorCode& status) { break; \ } \ - // Parse variants - // matcher = match-statement s variant *(o variant) - - // Parse first variant + // Parse required whitespace before first variant parseRequiredWhitespace(status); - if (!inBounds()) { - ERROR(status); - return; - } - parseVariant(status); - if (!inBounds()) { - // Not an error; there might be only one variant - return; - } + + // Parse variants while (isWhitespace(peek()) || isBidiControl(peek()) || isKeyStart(peek())) { - parseOptionalWhitespace(); - // Restore the precondition. // Trailing whitespace is allowed. + parseOptionalWhitespace(); if (!inBounds()) { return; } @@ -2059,12 +2042,6 @@ void Parser::errorPattern(UErrorCode& status) { // If still in bounds, then add the remaining input as a single text part // to the pattern - /* - TODO: this behavior isn't documented in the spec, but it comes from - https://github.com/messageformat/messageformat/blob/e0087bff312d759b67a9129eac135d318a1f0ce7/packages/mf2-messageformat/src/__fixtures/test-messages.json#L236 - and a pending pull request https://github.com/unicode-org/message-format-wg/pull/462 will clarify - whether this is the intent behind the spec - */ UnicodeString partStr(LEFT_CURLY_BRACE); while (inBounds()) { partStr += peek(); diff --git a/deps/icu-small/source/i18n/messageformat2_serializer.h b/deps/icu-small/source/i18n/messageformat2_serializer.h index f190b255f0d3..36b5bbe59e45 100644 --- a/deps/icu-small/source/i18n/messageformat2_serializer.h +++ b/deps/icu-small/source/i18n/messageformat2_serializer.h @@ -26,8 +26,6 @@ namespace message2 { // Serializer class (private) // Converts a data model back to a string - // TODO: Should be private; made public so tests - // can use it class U_I18N_API Serializer : public UMemory { public: Serializer(const MFDataModel& m, UnicodeString& s) : dataModel(m), result(s) {} diff --git a/deps/icu-small/source/i18n/msgfmt.cpp b/deps/icu-small/source/i18n/msgfmt.cpp index ae6e76c99deb..90b7d100103c 100644 --- a/deps/icu-small/source/i18n/msgfmt.cpp +++ b/deps/icu-small/source/i18n/msgfmt.cpp @@ -1921,7 +1921,7 @@ FormatNameEnumeration::FormatNameEnumeration(LocalPointer nameList, UEr } const UnicodeString* -FormatNameEnumeration::snext(UErrorCode& status) { +FormatNameEnumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { if (U_SUCCESS(status) && pos < fFormatNames->size()) { return static_cast(fFormatNames->elementAt(pos++)); } diff --git a/deps/icu-small/source/i18n/msgfmt_impl.h b/deps/icu-small/source/i18n/msgfmt_impl.h index 84344a3a2519..5ed239e7702b 100644 --- a/deps/icu-small/source/i18n/msgfmt_impl.h +++ b/deps/icu-small/source/i18n/msgfmt_impl.h @@ -30,7 +30,7 @@ class FormatNameEnumeration : public StringEnumeration { virtual ~FormatNameEnumeration(); static UClassID U_EXPORT2 getStaticClassID(); virtual UClassID getDynamicClassID() const override; - virtual const UnicodeString* snext(UErrorCode& status) override; + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override; virtual void reset(UErrorCode& status) override; virtual int32_t count(UErrorCode& status) const override; private: diff --git a/deps/icu-small/source/i18n/nfrs.cpp b/deps/icu-small/source/i18n/nfrs.cpp index 75b279cccef4..b063f7b6d816 100644 --- a/deps/icu-small/source/i18n/nfrs.cpp +++ b/deps/icu-small/source/i18n/nfrs.cpp @@ -134,13 +134,9 @@ static const char16_t gNoparse[] = }; /* "@noparse" */ NFRuleSet::NFRuleSet(RuleBasedNumberFormat *_owner, UnicodeString* descriptions, int32_t index, UErrorCode& status) - : name() - , rules(0) + : rules(0) , owner(_owner) , fractionRules() - , fIsFractionRuleSet(false) - , fIsPublic(false) - , fIsParseable(true) { for (int32_t i = 0; i < NON_NUMERICAL_RULE_LENGTH; ++i) { nonNumericalRules[i] = nullptr; @@ -602,6 +598,9 @@ NFRuleSet::findFractionRuleSetRule(double number) const // all the precision we need, and we can do all of the rest // of the math using integer arithmetic int64_t leastCommonMultiple = rules[0]->getBaseValue(); + if (leastCommonMultiple == 0) { + return nullptr; + } int64_t numerator; { for (uint32_t i = 1; i < rules.size(); ++i) { diff --git a/deps/icu-small/source/i18n/nfrs.h b/deps/icu-small/source/i18n/nfrs.h index 5e448395f7b6..090c02ca25ab 100644 --- a/deps/icu-small/source/i18n/nfrs.h +++ b/deps/icu-small/source/i18n/nfrs.h @@ -68,16 +68,17 @@ class NFRuleSet : public UMemory { const NFRule * findFractionRuleSetRule(double number) const; friend class NFSubstitution; + friend class NFRule; private: UnicodeString name; NFRuleList rules; - NFRule *nonNumericalRules[6]; - RuleBasedNumberFormat *owner; + NFRule *nonNumericalRules[6] { }; + RuleBasedNumberFormat *owner { }; NFRuleList fractionRules; - UBool fIsFractionRuleSet; - UBool fIsPublic; - UBool fIsParseable; + UBool fIsFractionRuleSet { }; + UBool fIsPublic { }; + UBool fIsParseable { true }; NFRuleSet(const NFRuleSet &other); // forbid copying of this class NFRuleSet &operator=(const NFRuleSet &other); // forbid copying of this class diff --git a/deps/icu-small/source/i18n/nfrule.cpp b/deps/icu-small/source/i18n/nfrule.cpp index 3857f9f45f2e..0078159af82b 100644 --- a/deps/icu-small/source/i18n/nfrule.cpp +++ b/deps/icu-small/source/i18n/nfrule.cpp @@ -26,6 +26,7 @@ #include "unicode/upluralrules.h" #include "unicode/coleitr.h" #include "unicode/uchar.h" +#include "unicode/normalizer2.h" #include "nfrs.h" #include "nfrlist.h" #include "nfsubs.h" @@ -34,19 +35,19 @@ U_NAMESPACE_BEGIN +// Characters that lenient parsing treats as ignorable separators in prefixLength. +// Zs = space separators, Pd = dash punctuation, Cf = format characters (soft hyphen, ZWNJ, etc.) +// Plus comma, and period which %%lenient-parse rules historically treated as equivalent. +static inline UBool isLenientSeparator(char16_t c) { + return (U_GET_GC_MASK(c) & (U_GC_ZS_MASK | U_GC_PD_MASK | U_GC_CF_MASK)) || c == u',' || c == u'.'; +} + NFRule::NFRule(const RuleBasedNumberFormat* _rbnf, const UnicodeString &_ruleText, UErrorCode &status) - : baseValue(static_cast(0)) - , radix(10) - , exponent(0) - , decimalPoint(0) - , fRuleText(_ruleText) - , sub1(nullptr) - , sub2(nullptr) + : ruleText(_ruleText) , formatter(_rbnf) - , rulePatternFormat(nullptr) { - if (!fRuleText.isEmpty()) { - parseRuleDescriptor(fRuleText, status); + if (!ruleText.isEmpty()) { + parseRuleDescriptor(ruleText, status); } } @@ -129,7 +130,7 @@ NFRule::makeRules(UnicodeString& description, status = U_MEMORY_ALLOCATION_ERROR; return; } - description = rule1->fRuleText; + description = rule1->ruleText; // check the description to see whether there's text enclosed // in brackets @@ -193,17 +194,17 @@ NFRule::makeRules(UnicodeString& description, } } - // if the description began with "x.x" and contains bracketed - // text, it describes both the improper fraction rule and - // the proper fraction rule else if (rule1->getType() == kImproperFractionRule) { + // if the description began with "x.x" and contains bracketed + // text, it describes both the improper fraction rule and + // the proper fraction rule rule2->setType(kProperFractionRule); } - // if the description began with "x.0" and contains bracketed - // text, it describes both the default rule and the - // improper fraction rule else if (rule1->getType() == kDefaultRule) { + // if the description began with "x.0" and contains bracketed + // text, it describes both the default rule and the + // improper fraction rule rule2->baseValue = rule1->baseValue; rule1->setType(kImproperFractionRule); } @@ -313,11 +314,11 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) // since we don't have Long.parseLong, and this isn't much work anyway, // just build up the value as we encounter the digits. int64_t val = 0; + char16_t c = 0; p = 0; - char16_t c = gSpace; // begin parsing the descriptor: copy digits - // into "tempValue", skip periods, commas, and spaces, + // into "val", skip periods, commas, and spaces, // stop on a slash or > sign (or at the end of the string), // and throw an exception on any other character while (p < descriptorLength) { @@ -345,12 +346,12 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) ++p; } - // we have the base value, so set it + // Set the rule's base value according to what we parsed setBaseValue(val, status); // if we stopped the previous loop on a slash, we're // now parsing the rule's radix. Again, accumulate digits - // in tempValue, skip punctuation, stop on a > mark, and + // in val, skip punctuation, stop on a > mark, and // throw an exception on anything else if (c == gSlash) { val = 0; @@ -380,7 +381,7 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) ++p; } - // tempValue now contain's the rule's radix. Set it + // val now contains the rule's radix. Set it // accordingly, and recalculate the rule's exponent radix = static_cast(val); if (radix == 0) { @@ -453,36 +454,43 @@ NFRule::parseRuleDescriptor(UnicodeString& description, UErrorCode& status) * creates the substitutions, and removes the substitution tokens * from the rule's rule text. * @param owner The rule set containing this rule -* @param predecessor The rule preseding this one in "owners" rule list -* @param ownersOwner The RuleBasedFormat that owns this rule +* @param sourceRuleText The rule text +* @param predecessor The rule preceding this one in "owners" rule list */ void -NFRule::extractSubstitutions(const NFRuleSet* ruleSet, - const UnicodeString &ruleText, +NFRule::extractSubstitutions(const NFRuleSet* owner, + const UnicodeString &sourceRuleText, const NFRule* predecessor, UErrorCode& status) { if (U_FAILURE(status)) { return; } - fRuleText = ruleText; - sub1 = extractSubstitution(ruleSet, predecessor, status); + ruleText = sourceRuleText; + sub1 = extractSubstitution(owner, predecessor, status); if (sub1 == nullptr) { // Small optimization. There is no need to create a redundant NullSubstitution. sub2 = nullptr; } else { - sub2 = extractSubstitution(ruleSet, predecessor, status); + sub2 = extractSubstitution(owner, predecessor, status); + } + + if (sub1 != nullptr && sub2 != nullptr && sub1->getDynamicClassID() == sub2->getDynamicClassID()) { + // Something like << << or >> >> or == == was encountered. + status = U_STATE_OLD_WARNING; + owner->owner->unparseable = true; } - int32_t pluralRuleStart = fRuleText.indexOf(gDollarOpenParenthesis, -1, 0); - int32_t pluralRuleEnd = (pluralRuleStart >= 0 ? fRuleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart) : -1); + + int32_t pluralRuleStart = ruleText.indexOf(gDollarOpenParenthesis, -1, 0); + int32_t pluralRuleEnd = (pluralRuleStart >= 0 ? ruleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart) : -1); if (pluralRuleEnd >= 0) { - int32_t endType = fRuleText.indexOf(gComma, pluralRuleStart); + int32_t endType = ruleText.indexOf(gComma, pluralRuleStart); if (endType < 0) { status = U_PARSE_ERROR; return; } - UnicodeString type(fRuleText.tempSubString(pluralRuleStart + 2, endType - pluralRuleStart - 2)); + UnicodeString type(ruleText.tempSubString(pluralRuleStart + 2, endType - pluralRuleStart - 2)); UPluralType pluralType; if (type.startsWith(UNICODE_STRING_SIMPLE("cardinal"))) { pluralType = UPLURAL_TYPE_CARDINAL; @@ -495,7 +503,7 @@ NFRule::extractSubstitutions(const NFRuleSet* ruleSet, return; } rulePatternFormat = formatter->createPluralFormat(pluralType, - fRuleText.tempSubString(endType + 1, pluralRuleEnd - endType - 1), status); + ruleText.tempSubString(endType + 1, pluralRuleEnd - endType - 1), status); } } @@ -506,13 +514,12 @@ NFRule::extractSubstitutions(const NFRuleSet* ruleSet, * @param owner The rule set containing this rule * @param predecessor The rule preceding this one in the rule set's * rule list -* @param ownersOwner The RuleBasedNumberFormat that owns this rule * @return The newly-created substitution. This is never null; if * the rule text doesn't contain any substitution tokens, this will * be a NullSubstitution. */ NFSubstitution * -NFRule::extractSubstitution(const NFRuleSet* ruleSet, +NFRule::extractSubstitution(const NFRuleSet* owner, const NFRule* predecessor, UErrorCode& status) { @@ -531,16 +538,16 @@ NFRule::extractSubstitution(const NFRuleSet* ruleSet, // special-case the ">>>" token, since searching for the > at the // end will actually find the > in the middle - if (fRuleText.indexOf(gGreaterGreaterGreater, 3, 0) == subStart) { + if (ruleText.indexOf(gGreaterGreaterGreater, 3, 0) == subStart) { subEnd = subStart + 2; // otherwise the substitution token ends with the same character // it began with } else { - char16_t c = fRuleText.charAt(subStart); - subEnd = fRuleText.indexOf(c, subStart + 1); + char16_t c = ruleText.charAt(subStart); + subEnd = ruleText.indexOf(c, subStart + 1); // special case for '<%foo<<' - if (c == gLessThan && subEnd != -1 && subEnd < fRuleText.length() - 1 && fRuleText.charAt(subEnd+1) == c) { + if (c == gLessThan && subEnd != -1 && subEnd < ruleText.length() - 1 && ruleText.charAt(subEnd+1) == c) { // ordinals use "=#,##0==%abbrev=" as their rule. Notice that the '==' in the middle // occurs because of the juxtaposition of two different rules. The check for '<' is a hack // to get around this. Having the duplicate at the front would cause problems with @@ -560,12 +567,12 @@ NFRule::extractSubstitution(const NFRuleSet* ruleSet, // some text bounded by substitution token characters). Use // makeSubstitution() to create the right kind of substitution UnicodeString subToken; - subToken.setTo(fRuleText, subStart, subEnd + 1 - subStart); - result = NFSubstitution::makeSubstitution(subStart, this, predecessor, ruleSet, + subToken.setTo(ruleText, subStart, subEnd + 1 - subStart); + result = NFSubstitution::makeSubstitution(subStart, this, predecessor, owner, this->formatter, subToken, status); // remove the substitution from the rule text - fRuleText.removeBetween(subStart, subEnd+1); + ruleText.removeBetween(subStart, subEnd+1); return result; } @@ -603,9 +610,9 @@ NFRule::setBaseValue(int64_t newBaseValue, UErrorCode& status) sub2->setDivisor(radix, exponent, status); } + } else { // if this is a special rule, its radix and exponent are basically // ignored. Set them to "safe" default values - } else { exponent = 0; } } @@ -649,7 +656,7 @@ NFRule::indexOfAnyRulePrefix() const { int result = -1; for (int i = 0; RULE_PREFIXES[i]; i++) { - int32_t pos = fRuleText.indexOf(*RULE_PREFIXES[i]); + int32_t pos = ruleText.indexOf(*RULE_PREFIXES[i]); if (pos != -1 && (result == -1 || pos < result)) { result = pos; } @@ -685,7 +692,7 @@ NFRule::operator==(const NFRule& rhs) const return baseValue == rhs.baseValue && radix == rhs.radix && exponent == rhs.exponent - && fRuleText == rhs.fRuleText + && ruleText == rhs.ruleText && util_equalSubstitutions(sub1, rhs.sub1) && util_equalSubstitutions(sub2, rhs.sub2); } @@ -738,14 +745,14 @@ NFRule::_appendRuleText(UnicodeString& result) const // if the rule text begins with a space, write an apostrophe // (whitespace after the rule descriptor is ignored; the // apostrophe is used to make the whitespace significant) - if (fRuleText.charAt(0) == gSpace && (sub1 == nullptr || sub1->getPos() != 0)) { + if (ruleText.charAt(0) == gSpace && (sub1 == nullptr || sub1->getPos() != 0)) { result.append(gTick); } // now, write the rule's rule text, inserting appropriate // substitution tokens in the appropriate places UnicodeString ruleTextCopy; - ruleTextCopy.setTo(fRuleText); + ruleTextCopy.setTo(ruleText); UnicodeString temp; if (sub2 != nullptr) { @@ -799,24 +806,24 @@ NFRule::doFormat(int64_t number, UnicodeString& toInsertInto, int32_t pos, int32 // into the right places in toInsertInto (notice we do the // substitutions in reverse order so that the offsets don't get // messed up) - int32_t pluralRuleStart = fRuleText.length(); + int32_t pluralRuleStart = ruleText.length(); int32_t lengthOffset = 0; if (!rulePatternFormat) { - toInsertInto.insert(pos, fRuleText); + toInsertInto.insert(pos, ruleText); } else { - pluralRuleStart = fRuleText.indexOf(gDollarOpenParenthesis, -1, 0); - int pluralRuleEnd = fRuleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart); + pluralRuleStart = ruleText.indexOf(gDollarOpenParenthesis, -1, 0); + int pluralRuleEnd = ruleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart); int initialLength = toInsertInto.length(); - if (pluralRuleEnd < fRuleText.length() - 1) { - toInsertInto.insert(pos, fRuleText.tempSubString(pluralRuleEnd + 2)); + if (pluralRuleEnd < ruleText.length() - 1) { + toInsertInto.insert(pos, ruleText.tempSubString(pluralRuleEnd + 2)); } toInsertInto.insert(pos, rulePatternFormat->format(static_cast(number / util64_pow(radix, exponent)), status)); if (pluralRuleStart > 0) { - toInsertInto.insert(pos, fRuleText.tempSubString(0, pluralRuleStart)); + toInsertInto.insert(pos, ruleText.tempSubString(0, pluralRuleStart)); } - lengthOffset = fRuleText.length() - (toInsertInto.length() - initialLength); + lengthOffset = ruleText.length() - (toInsertInto.length() - initialLength); } if (sub2 != nullptr) { @@ -845,17 +852,17 @@ NFRule::doFormat(double number, UnicodeString& toInsertInto, int32_t pos, int32_ // [again, we have two copies of this routine that do the same thing // so that we don't sacrifice precision in a long by casting it // to a double] - int32_t pluralRuleStart = fRuleText.length(); + int32_t pluralRuleStart = ruleText.length(); int32_t lengthOffset = 0; if (!rulePatternFormat) { - toInsertInto.insert(pos, fRuleText); + toInsertInto.insert(pos, ruleText); } else { - pluralRuleStart = fRuleText.indexOf(gDollarOpenParenthesis, -1, 0); - int pluralRuleEnd = fRuleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart); + pluralRuleStart = ruleText.indexOf(gDollarOpenParenthesis, -1, 0); + int pluralRuleEnd = ruleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart); int initialLength = toInsertInto.length(); - if (pluralRuleEnd < fRuleText.length() - 1) { - toInsertInto.insert(pos, fRuleText.tempSubString(pluralRuleEnd + 2)); + if (pluralRuleEnd < ruleText.length() - 1) { + toInsertInto.insert(pos, ruleText.tempSubString(pluralRuleEnd + 2)); } double pluralVal = number; if (0 <= pluralVal && pluralVal < 1) { @@ -868,9 +875,9 @@ NFRule::doFormat(double number, UnicodeString& toInsertInto, int32_t pos, int32_ } toInsertInto.insert(pos, rulePatternFormat->format(static_cast(pluralVal), status)); if (pluralRuleStart > 0) { - toInsertInto.insert(pos, fRuleText.tempSubString(0, pluralRuleStart)); + toInsertInto.insert(pos, ruleText.tempSubString(0, pluralRuleStart)); } - lengthOffset = fRuleText.length() - (toInsertInto.length() - initialLength); + lengthOffset = ruleText.length() - (toInsertInto.length() - initialLength); } if (sub2 != nullptr) { @@ -908,7 +915,8 @@ NFRule::shouldRollBack(int64_t number) const // a modulus substitution, its base value isn't an even multiple // of 100, and the value we're trying to format _is_ an even // multiple of 100. This is called the "rollback rule." - if ((sub1 != nullptr && sub1->isModulusSubstitution()) || (sub2 != nullptr && sub2->isModulusSubstitution())) { + if (radix != 0 && ((sub1 != nullptr && sub1->isModulusSubstitution()) || + (sub2 != nullptr && sub2->isModulusSubstitution()))) { int64_t re = util64_pow(radix, exponent); return (number % re) == 0 && (baseValue % re) != 0; } @@ -944,10 +952,10 @@ static void dumpUS(FILE* f, const UnicodeString& us) { int len = us.length(); char* buf = (char *)uprv_malloc((len+1)*sizeof(char)); //new char[len+1]; if (buf != nullptr) { - us.extract(0, len, buf); - buf[len] = 0; - fprintf(f, "%s", buf); - uprv_free(buf); //delete[] buf; + us.extract(0, len, buf); + buf[len] = 0; + fprintf(f, "%s", buf); + uprv_free(buf); //delete[] buf; } } #endif @@ -965,15 +973,15 @@ NFRule::doParse(const UnicodeString& text, ParsePosition pp; UnicodeString workText(text); - int32_t sub1Pos = sub1 != nullptr ? sub1->getPos() : fRuleText.length(); - int32_t sub2Pos = sub2 != nullptr ? sub2->getPos() : fRuleText.length(); + int32_t sub1Pos = sub1 != nullptr ? sub1->getPos() : ruleText.length(); + int32_t sub2Pos = sub2 != nullptr ? sub2->getPos() : ruleText.length(); // check to see whether the text before the first substitution // matches the text at the beginning of the string being // parsed. If it does, strip that off the front of workText; // otherwise, dump out with a mismatch UnicodeString prefix; - prefix.setTo(fRuleText, 0, sub1Pos); + prefix.setTo(ruleText, 0, sub1Pos); #ifdef RBNF_DEBUG fprintf(stderr, "doParse %p ", this); @@ -1057,7 +1065,7 @@ NFRule::doParse(const UnicodeString& text, // the substitution, giving us a new partial parse result pp.setIndex(0); - temp.setTo(fRuleText, sub1Pos, sub2Pos - sub1Pos); + temp.setTo(ruleText, sub1Pos, sub2Pos - sub1Pos); double partialResult = matchToDelimiter(workText, start, tempBaseValue, temp, pp, sub1, nonNumericalExecutedRuleMask, @@ -1079,7 +1087,7 @@ NFRule::doParse(const UnicodeString& text, // partial result with whatever it gets back from its // substitution if there's a successful match, giving us // a real result - temp.setTo(fRuleText, sub2Pos, fRuleText.length() - sub2Pos); + temp.setTo(ruleText, sub2Pos, ruleText.length() - sub2Pos); partialResult = matchToDelimiter(workText2, 0, partialResult, temp, pp2, sub2, nonNumericalExecutedRuleMask, @@ -1125,8 +1133,6 @@ NFRule::doParse(const UnicodeString& text, // didn't match-- the ParsePosition is therefore unchanged if // we didn't match anything) parsePosition.setIndex(highWaterMark); - // commented out because ParsePosition doesn't have error index in 1.1.x - // restored for ICU4C port if (highWaterMark > 0) { parsePosition.setErrorIndex(0); } @@ -1166,14 +1172,14 @@ NFRule::stripPrefix(UnicodeString& text, const UnicodeString& prefix, ParsePosit { // if the prefix text is empty, dump out without doing anything if (prefix.length() != 0) { - UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; // use prefixLength() to match the beginning of // "text" against "prefix". This function returns the // number of characters from "text" that matched (or 0 if // we didn't match the whole prefix) int32_t pfl = prefixLength(text, prefix, status); if (U_FAILURE(status)) { // Memory allocation error. - return; + return; } if (pfl != 0) { // if we got a successful match, update the parse position @@ -1224,37 +1230,40 @@ NFRule::matchToDelimiter(const UnicodeString& text, int32_t recursionCount, double upperBound) const { - UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; // if "delimiter" contains real (i.e., non-ignorable) text, search // it for "delimiter" beginning at "start". If that succeeds, then // use "sub"'s doParse() method to match the text before the // instance of "delimiter" we just found. if (!allIgnorable(delimiter, status)) { - if (U_FAILURE(status)) { //Memory allocation error. - return 0; - } + if (U_FAILURE(status)) { //Memory allocation error. + return 0; + } ParsePosition tempPP; Formattable result; + int currPos = startPos; + double bestResult = 0.0; + UBool bestResultSet = false; + + for (;;) { + // use findText() to search for "delimiter". It returns a two- + // element array: element 0 is the position of the match, and + // element 1 is the number of characters that matched + // "delimiter". + tempPP.setIndex(0); + int32_t dLen; + int32_t dPos = findText(text, delimiter, currPos, &dLen); - // use findText() to search for "delimiter". It returns a two- - // element array: element 0 is the position of the match, and - // element 1 is the number of characters that matched - // "delimiter". - int32_t dLen; - int32_t dPos = findText(text, delimiter, startPos, &dLen); - - // if findText() succeeded, isolate the text preceding the - // match, and use "sub" to match that text - while (dPos >= 0) { + if (dPos < 0) { + break; + } + // if findText() succeeded, isolate the text preceding the + // match, and use "sub" to match that text UnicodeString subText; subText.setTo(text, 0, dPos); - if (subText.length() > 0) { + if (!subText.isEmpty()) { UBool success = sub->doParse(subText, tempPP, _baseValue, upperBound, -#if UCONFIG_NO_COLLATION - false, -#else formatter->isLenient(), -#endif nonNumericalExecutedRuleMask, recursionCount, result); @@ -1267,11 +1276,15 @@ NFRule::matchToDelimiter(const UnicodeString& text, // we got from parsing the substitution. if (success && tempPP.getIndex() == dPos) { pp.setIndex(dPos + dLen); - return result.getDouble(); + bestResult = result.getDouble(); + bestResultSet = true; } else { - // commented out because ParsePosition doesn't have error index in 1.1.x - // restored for ICU4C port + if (bestResultSet) { + // We matched the delimiter once already. + // We didn't find a better match. + return bestResult; + } if (tempPP.getErrorIndex() > 0) { pp.setErrorIndex(tempPP.getErrorIndex()); } else { @@ -1283,8 +1296,11 @@ NFRule::matchToDelimiter(const UnicodeString& text, // if we didn't match the substitution, search for another // copy of "delimiter" in "text" and repeat the loop if // we find it + currPos = dPos + dLen; tempPP.setIndex(0); - dPos = findText(text, delimiter, dPos + dLen, &dLen); + } + if (bestResultSet) { + return bestResult; } // if we make it here, this was an unsuccessful match, and we // leave pp unchanged and return 0 @@ -1305,11 +1321,7 @@ NFRule::matchToDelimiter(const UnicodeString& text, // try to match the whole string against the substitution UBool success = sub->doParse(text, tempPP, _baseValue, upperBound, -#if UCONFIG_NO_COLLATION - false, -#else formatter->isLenient(), -#endif nonNumericalExecutedRuleMask, recursionCount, result); @@ -1356,12 +1368,104 @@ NFRule::prefixLength(const UnicodeString& str, const UnicodeString& prefix, UErr return 0; } -#if !UCONFIG_NO_COLLATION - // go through all this grief if we're in lenient-parse mode + // Check if non-lenient rule finds the text before call lenient parsing + if (str.startsWith(prefix)) { + return prefix.length(); + } + if (formatter->isLenient()) { - // Check if non-lenient rule finds the text before call lenient parsing - if (str.startsWith(prefix)) { - return prefix.length(); + // In lenient-parse mode, walk both strings simultaneously: + // skip separator characters in both, and compare the rest case-insensitively. + // NFC normalization is applied incrementally to handle NFC/NFD differences + // (e.g., U+00E9 vs U+0065 U+0301). NFC is used instead of NFD to + // avoid decomposing Hangul syllables into Jamo (which would create false + // prefix matches) and to preserve correct Turkish dotted uppercase i case folding behavior. + UErrorCode err = U_ZERO_ERROR; +#if !UCONFIG_NO_NORMALIZATION + const Normalizer2 *nfc = Normalizer2::getNFCInstance(err); + if (U_SUCCESS(err)) { + // NFC-normalize the prefix up front (it's short rule text). + UnicodeString nfcPrefix; + nfc->normalize(prefix, nfcPrefix, err); + if (U_SUCCESS(err)) { + int32_t strIdx = 0; // position in original str + int32_t prefixIdx = 0; + int32_t strLen = str.length(); + int32_t nfcPrefixLen = nfcPrefix.length(); + UBool matched = true; + + // Buffer for the NFC of the current normalization segment from str. + // We normalize str segments on the fly to avoid normalizing the entire string. + UnicodeString strSeg, strNfc; + int32_t strNfcIdx = 0; + int32_t strNfcLen = 0; + + UBool prefixIsAllSeparators = true; + for (int32_t i = 0; i < nfcPrefixLen; ++i) { + if (!isLenientSeparator(nfcPrefix.charAt(i))) { + prefixIsAllSeparators = false; + break; + } + } + while (prefixIdx < nfcPrefixLen) { + // Skip separators in str only when the NFC buffer is exhausted. + // Separators are NFC-inert and always appear at segment boundaries. + int32_t strSepCount = 0; + while (strNfcIdx >= strNfcLen && strIdx < strLen && isLenientSeparator(str.charAt(strIdx))) { + ++strIdx; + ++strSepCount; + } + while (prefixIdx < nfcPrefixLen && isLenientSeparator(nfcPrefix.charAt(prefixIdx))) { + ++prefixIdx; + } + if (prefixIsAllSeparators && prefixIdx >= nfcPrefixLen && strSepCount == 0) { + matched = false; + break; + } + if (prefixIdx >= nfcPrefixLen) { + break; + } + + // Get the next NFC code unit from str. + if (strNfcIdx >= strNfcLen) { + if (strIdx >= strLen) { + matched = false; + break; + } + // Read the next normalization segment from str up to the next NFC boundary. + strSeg.remove(); + do { + UChar32 cp = str.char32At(strIdx); + strSeg.append(cp); + strIdx += U16_LENGTH(cp); + } while (strIdx < strLen && !nfc->hasBoundaryBefore(str.char32At(strIdx))); + + nfc->normalize(strSeg, strNfc, err); + if (U_FAILURE(err)) { + break; + } + strNfcIdx = 0; + strNfcLen = strNfc.length(); + } + + if (u_foldCase(strNfc.charAt(strNfcIdx++), formatter->caseFoldOption) != u_foldCase(nfcPrefix.charAt(prefixIdx), formatter->caseFoldOption)) { + matched = false; + break; + } + ++prefixIdx; + } + if (matched) { + return strIdx; + } + } + } +#endif + + // go through all this grief if we're in lenient-parse mode +#if !UCONFIG_NO_COLLATION + if (formatter->lenientParseRules == nullptr) { + // Nothing customized. Don't go further. + return 0; } // get the formatter's collator and use it to create two // collation element iterators, one over the target string @@ -1383,7 +1487,7 @@ NFRule::prefixLength(const UnicodeString& str, const UnicodeString& prefix, UErr return 0; } - UErrorCode err = U_ZERO_ERROR; + err = U_ZERO_ERROR; // The original code was problematic. Consider this match: // prefix = "fifty-" @@ -1460,65 +1564,9 @@ NFRule::prefixLength(const UnicodeString& str, const UnicodeString& prefix, UErr fprintf(stderr, "prefix length: %d\n", result); #endif return result; -#if 0 - //---------------------------------------------------------------- - // JDK 1.2-specific API call - // return strIter.getOffset(); - //---------------------------------------------------------------- - // JDK 1.1 HACK (take out for 1.2-specific code) - - // if we make it to here, we have a successful match. Now we - // have to find out HOW MANY characters from the target string - // matched the prefix (there isn't necessarily a one-to-one - // mapping between collation elements and characters). - // In JDK 1.2, there's a simple getOffset() call we can use. - // In JDK 1.1, on the other hand, we have to go through some - // ugly contortions. First, use the collator to compare the - // same number of characters from the prefix and target string. - // If they're equal, we're done. - collator->setStrength(Collator::PRIMARY); - if (str.length() >= prefix.length()) { - UnicodeString temp; - temp.setTo(str, 0, prefix.length()); - if (collator->equals(temp, prefix)) { -#ifdef RBNF_DEBUG - fprintf(stderr, "returning: %d\n", prefix.length()); #endif - return prefix.length(); - } - } - - // if they're not equal, then we have to compare successively - // larger and larger substrings of the target string until we - // get to one that matches the prefix. At that point, we know - // how many characters matched the prefix, and we can return. - int32_t p = 1; - while (p <= str.length()) { - UnicodeString temp; - temp.setTo(str, 0, p); - if (collator->equals(temp, prefix)) { - return p; - } else { - ++p; - } - } - - // SHOULD NEVER GET HERE!!! - return 0; - //---------------------------------------------------------------- -#endif - - // If lenient parsing is turned off, forget all that crap above. - // Just use String.startsWith() and be done with it. - } else -#endif - { - if (str.startsWith(prefix)) { - return prefix.length(); - } else { - return 0; - } - } + } + return 0; } /** @@ -1549,11 +1597,11 @@ NFRule::findText(const UnicodeString& str, rulePatternFormat->parseType(str, this, result, position); int start = position.getBeginIndex(); if (start >= 0) { - int32_t pluralRuleStart = fRuleText.indexOf(gDollarOpenParenthesis, -1, 0); - int32_t pluralRuleSuffix = fRuleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart) + 2; + int32_t pluralRuleStart = ruleText.indexOf(gDollarOpenParenthesis, -1, 0); + int32_t pluralRuleSuffix = ruleText.indexOf(gClosedParenthesisDollar, -1, pluralRuleStart) + 2; int32_t matchLen = position.getEndIndex() - start; - UnicodeString prefix(fRuleText.tempSubString(0, pluralRuleStart)); - UnicodeString suffix(fRuleText.tempSubString(pluralRuleSuffix)); + UnicodeString prefix(ruleText.tempSubString(0, pluralRuleStart)); + UnicodeString suffix(ruleText.tempSubString(pluralRuleSuffix)); if (str.compare(start - prefix.length(), prefix.length(), prefix, 0, prefix.length()) == 0 && str.compare(start + matchLen, suffix.length(), suffix, 0, suffix.length()) == 0) { @@ -1637,45 +1685,10 @@ NFRule::findTextLenient(const UnicodeString& str, * ignorable at the primary-order level. false otherwise. */ UBool -NFRule::allIgnorable(const UnicodeString& str, UErrorCode& status) const +NFRule::allIgnorable(const UnicodeString& str, UErrorCode& /*status*/) const { // if the string is empty, we can just return true - if (str.length() == 0) { - return true; - } - -#if !UCONFIG_NO_COLLATION - // if lenient parsing is turned on, walk through the string with - // a collation element iterator and make sure each collation - // element is 0 (ignorable) at the primary level - if (formatter->isLenient()) { - const RuleBasedCollator* collator = formatter->getCollator(); - if (collator == nullptr) { - status = U_MEMORY_ALLOCATION_ERROR; - return false; - } - LocalPointer iter(collator->createCollationElementIterator(str)); - - // Memory allocation error check. - if (iter.isNull()) { - status = U_MEMORY_ALLOCATION_ERROR; - return false; - } - - UErrorCode err = U_ZERO_ERROR; - int32_t o = iter->next(err); - while (o != CollationElementIterator::NULLORDER - && CollationElementIterator::primaryOrder(o) == 0) { - o = iter->next(err); - } - - return o == CollationElementIterator::NULLORDER; - } -#endif - - // if lenient parsing is turned off, there is no such thing as - // an ignorable character: return true only if the string is empty - return false; + return str.length() == 0; } void diff --git a/deps/icu-small/source/i18n/nfrule.h b/deps/icu-small/source/i18n/nfrule.h index 284d915c9424..fa1571296cff 100644 --- a/deps/icu-small/source/i18n/nfrule.h +++ b/deps/icu-small/source/i18n/nfrule.h @@ -109,15 +109,15 @@ class NFRule : public UMemory { int32_t startingAt, int32_t* resultCount) const; private: - int64_t baseValue; - int32_t radix; - int16_t exponent; - char16_t decimalPoint; - UnicodeString fRuleText; - NFSubstitution* sub1; - NFSubstitution* sub2; - const RuleBasedNumberFormat* formatter; - const PluralFormat* rulePatternFormat; + int64_t baseValue { }; + int32_t radix { 10 }; + int16_t exponent { }; + char16_t decimalPoint { }; + UnicodeString ruleText; + NFSubstitution* sub1 { }; + NFSubstitution* sub2 { }; + const RuleBasedNumberFormat* formatter { }; + const PluralFormat* rulePatternFormat { }; NFRule(const NFRule &other); // forbid copying of this class NFRule &operator=(const NFRule &other); // forbid copying of this class diff --git a/deps/icu-small/source/i18n/nfsubs.cpp b/deps/icu-small/source/i18n/nfsubs.cpp index 5efbd2a72c8e..5fe2d2ed250f 100644 --- a/deps/icu-small/source/i18n/nfsubs.cpp +++ b/deps/icu-small/source/i18n/nfsubs.cpp @@ -972,7 +972,7 @@ ModulusSubstitution::doParse(const UnicodeString& text, // use the specific rule's doParse() method, and then we have to // do some of the other work of NFRuleSet.parse() } else { - ruleToUse->doParse(text, parsePosition, false, upperBound, nonNumericalExecutedRuleMask, recursionCount, result); + ruleToUse->doParse(text, parsePosition, false, upperBound, nonNumericalExecutedRuleMask, recursionCount + 1, result); if (parsePosition.getIndex() != 0) { UErrorCode status = U_ZERO_ERROR; @@ -1305,7 +1305,7 @@ NumeratorSubstitution::doParse(const UnicodeString& text, int32_t zeroCount = 0; UnicodeString workText(text); - if (withZeros) { + if (withZeros && getRuleSet() != nullptr) { ParsePosition workPos(1); Formattable temp; @@ -1343,10 +1343,16 @@ NumeratorSubstitution::doParse(const UnicodeString& text, int64_t n = result.getLong(status); // force conversion! int64_t d = 1; while (d <= n) { + if (d > INT64_MAX / 10) { + return false; + } d *= 10; } // now add the zeros while (zeroCount > 0) { + if (d > INT64_MAX / 10) { + return false; + } d *= 10; --zeroCount; } diff --git a/deps/icu-small/source/i18n/number_capi.cpp b/deps/icu-small/source/i18n/number_capi.cpp index a35680a62003..e9d44412e446 100644 --- a/deps/icu-small/source/i18n/number_capi.cpp +++ b/deps/icu-small/source/i18n/number_capi.cpp @@ -380,6 +380,9 @@ usnumf_formatInt64( return; } auto localResult = formatter->fFormatter.formatInt64(value, *ec); + if (U_FAILURE(*ec)) { + return; + } result->setTo(std::move(localResult)); } diff --git a/deps/icu-small/source/i18n/number_decimalquantity.h b/deps/icu-small/source/i18n/number_decimalquantity.h index 2303186c6d58..78b1a3612c54 100644 --- a/deps/icu-small/source/i18n/number_decimalquantity.h +++ b/deps/icu-small/source/i18n/number_decimalquantity.h @@ -8,7 +8,6 @@ #define __NUMBER_DECIMALQUANTITY_H__ #include -#include "unicode/umachine.h" #include "standardplural.h" #include "plurrule_impl.h" #include "number_types.h" diff --git a/deps/icu-small/source/i18n/number_formatimpl.cpp b/deps/icu-small/source/i18n/number_formatimpl.cpp index 45baa94615ed..09588dadf802 100644 --- a/deps/icu-small/source/i18n/number_formatimpl.cpp +++ b/deps/icu-small/source/i18n/number_formatimpl.cpp @@ -24,6 +24,17 @@ using namespace icu; using namespace icu::number; using namespace icu::number::impl; +namespace { + +// Maximum number of integer or fraction digits we will output during formatting. +// Set to 999,999 to allow valid large-range performance tests (e.g., test21684_Performance +// formatting -1e99999) while preventing runaway loops, allocation spikes, and timeouts +// when formatting numbers with hugely out-of-bounds magnitudes (like scale/1e200000000). +// This value may be tuned to a smaller value later if necessary. +constexpr int32_t kMaxFormattedDigits = 999999; + +} // namespace + NumberFormatterImpl::NumberFormatterImpl(const MacroProps& macros, UErrorCode& status) : NumberFormatterImpl(macros, true, status) { @@ -188,17 +199,15 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, if (macros.symbols.isDecimalFormatSymbols()) { fMicros.simple.symbols = macros.symbols.getDecimalFormatSymbols(); } else { + auto localeWithCurrency = macros.locale; + CharString currency8; + currency8.appendInvariantChars(currency.getISOCurrency(), 3, status); + localeWithCurrency.setKeywordValue("currency", currency8.data(), status); LocalPointer newSymbols( - new DecimalFormatSymbols(macros.locale, *ns, status), status); + new DecimalFormatSymbols(localeWithCurrency, *ns, status), status); if (U_FAILURE(status)) { return nullptr; } - if (isCurrency) { - newSymbols->setCurrency(currency.getISOCurrency(), status); - if (U_FAILURE(status)) { - return nullptr; - } - } fMicros.simple.symbols = newSymbols.getAlias(); fSymbols.adoptInstead(newSymbols.orphan()); } @@ -537,6 +546,11 @@ int32_t NumberFormatterImpl::writeNumber( status); } else { + if (quantity.getUpperDisplayMagnitude() + 1 > kMaxFormattedDigits || + -quantity.getLowerDisplayMagnitude() > kMaxFormattedDigits) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } // Add the integer digits length += writeIntegerDigits( micros, @@ -594,8 +608,13 @@ int32_t NumberFormatterImpl::writeIntegerDigits( FormattedStringBuilder& string, int32_t index, UErrorCode& status) { + if (U_FAILURE(status)) { return 0; } int length = 0; int integerCount = quantity.getUpperDisplayMagnitude() + 1; + if (integerCount > kMaxFormattedDigits) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } for (int i = 0; i < integerCount; i++) { // Add grouping separator if (micros.grouping.groupAtPosition(i, quantity)) { @@ -629,8 +648,13 @@ int32_t NumberFormatterImpl::writeFractionDigits( FormattedStringBuilder& string, int32_t index, UErrorCode& status) { + if (U_FAILURE(status)) { return 0; } int length = 0; int fractionCount = -quantity.getLowerDisplayMagnitude(); + if (fractionCount > kMaxFormattedDigits) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } for (int i = 0; i < fractionCount; i++) { // Get and append the next digit value int8_t nextDigit = quantity.getDigit(-i - 1); diff --git a/deps/icu-small/source/i18n/number_mapper.cpp b/deps/icu-small/source/i18n/number_mapper.cpp index 457fbc0d0712..4de1e566a0c9 100644 --- a/deps/icu-small/source/i18n/number_mapper.cpp +++ b/deps/icu-small/source/i18n/number_mapper.cpp @@ -75,7 +75,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert !properties.currencyUsage.isNull() || warehouse.affixProvider.get().hasCurrencySign()); CurrencyUnit currency; - UCurrencyUsage currencyUsage; + UCurrencyUsage currencyUsage = UCURR_USAGE_STANDARD; if (useCurrency) { currency = resolveCurrency(properties, locale, status); currencyUsage = properties.currencyUsage.getOrDefault(UCURR_USAGE_STANDARD); diff --git a/deps/icu-small/source/i18n/number_skeletons.cpp b/deps/icu-small/source/i18n/number_skeletons.cpp index 67a38dad0737..4138d434103e 100644 --- a/deps/icu-small/source/i18n/number_skeletons.cpp +++ b/deps/icu-small/source/i18n/number_skeletons.cpp @@ -1021,6 +1021,10 @@ blueprint_helpers::parseExponentSignOption(const StringSegment& segment, MacroPr #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdangling-pointer" #endif +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdangling" +#endif void blueprint_helpers::parseCurrencyOption(const StringSegment& segment, MacroProps& macros, UErrorCode& status) { // Unlike ICU4J, have to check length manually because ICU4C CurrencyUnit does not check it for us @@ -1040,6 +1044,9 @@ void blueprint_helpers::parseCurrencyOption(const StringSegment& segment, MacroP // Slicing is OK macros.unit = currency; // NOLINT } +#if defined(__clang__) +#pragma clang diagnostic pop +#endif #if U_GCC_MAJOR_MINOR >= 1204 #pragma GCC diagnostic pop #endif @@ -1072,25 +1079,12 @@ void blueprint_helpers::parseMeasureUnitOption(const StringSegment& segment, Mac CharString subType; SKELETON_UCHAR_TO_CHAR(subType, stemString, firstHyphen + 1, stemString.length(), status); - // Note: the largest type as of this writing (Aug 2020) is "volume", which has 33 units. - static constexpr int32_t CAPACITY = 40; - MeasureUnit units[CAPACITY]; - UErrorCode localStatus = U_ZERO_ERROR; - int32_t numUnits = MeasureUnit::getAvailable(type.data(), units, CAPACITY, localStatus); - if (U_FAILURE(localStatus)) { - // More than 30 units in this type? - status = U_INTERNAL_PROGRAM_ERROR; + MeasureUnit unit; + if (MeasureUnit::validateAndGet(type.toStringPiece(), subType.toStringPiece(), unit)) { + macros.unit = unit; return; } - for (int32_t i = 0; i < numUnits; i++) { - auto& unit = units[i]; - if (uprv_strcmp(subType.data(), unit.getSubtype()) == 0) { - macros.unit = unit; - return; - } - } - - // throw new SkeletonSyntaxException("Unknown measure unit", segment); + status = U_NUMBER_SKELETON_SYNTAX_ERROR; } diff --git a/deps/icu-small/source/i18n/number_usageprefs.cpp b/deps/icu-small/source/i18n/number_usageprefs.cpp index 5c15c1cc3fb8..8d5ad1c6e70f 100644 --- a/deps/icu-small/source/i18n/number_usageprefs.cpp +++ b/deps/icu-small/source/i18n/number_usageprefs.cpp @@ -18,7 +18,6 @@ #include "unicode/numberformatter.h" #include "unicode/platform.h" #include "unicode/unum.h" -#include "unicode/urename.h" #include "units_data.h" using namespace icu; diff --git a/deps/icu-small/source/i18n/number_usageprefs.h b/deps/icu-small/source/i18n/number_usageprefs.h index 7b3dc85959e4..a93562e4e318 100644 --- a/deps/icu-small/source/i18n/number_usageprefs.h +++ b/deps/icu-small/source/i18n/number_usageprefs.h @@ -52,7 +52,7 @@ class UsagePrefsHandler : public MicroPropsGenerator, public UMemory { * The returned pointer should be valid for the lifetime of the * UsagePrefsHandler instance. */ - const MaybeStackVector *getOutputUnits() const { + const MaybeStackVector* getOutputUnits() const U_LIFETIME_BOUND { return fUnitsRouter.getOutputUnits(); } diff --git a/deps/icu-small/source/i18n/numfmt.cpp b/deps/icu-small/source/i18n/numfmt.cpp index 7c877a33ab84..03eff5e4801b 100644 --- a/deps/icu-small/source/i18n/numfmt.cpp +++ b/deps/icu-small/source/i18n/numfmt.cpp @@ -570,6 +570,10 @@ NumberFormat::format(const Formattable& obj, // trying to format a different currency. // Right now, we clone. LocalPointer cloneFmt(this->clone()); + if (cloneFmt.isNull()) { + status = U_MEMORY_ALLOCATION_ERROR; + return appendTo; + } cloneFmt->setCurrency(iso, status); // next line should NOT recurse, because n is numeric whereas obj was a wrapper around currency amount. return cloneFmt->format(*n, appendTo, pos, status); @@ -625,6 +629,10 @@ NumberFormat::format(const Formattable& obj, // trying to format a different currency. // Right now, we clone. LocalPointer cloneFmt(this->clone()); + if (cloneFmt.isNull()) { + status = U_MEMORY_ALLOCATION_ERROR; + return appendTo; + } cloneFmt->setCurrency(iso, status); // next line should NOT recurse, because n is numeric whereas obj was a wrapper around currency amount. return cloneFmt->format(*n, appendTo, posIter, status); diff --git a/deps/icu-small/source/i18n/numparse_currency.h b/deps/icu-small/source/i18n/numparse_currency.h index 4e1466a30535..9c6725c55f49 100644 --- a/deps/icu-small/source/i18n/numparse_currency.h +++ b/deps/icu-small/source/i18n/numparse_currency.h @@ -48,7 +48,7 @@ class U_I18N_API_CLASS CombinedCurrencyMatcher : public NumberParseMatcher, publ UnicodeString fCurrency1; UnicodeString fCurrency2; - bool fUseFullCurrencyData; + bool fUseFullCurrencyData = false; UnicodeString fLocalLongNames[StandardPlural::COUNT]; UnicodeString afterPrefixInsert; diff --git a/deps/icu-small/source/i18n/numparse_symbols.h b/deps/icu-small/source/i18n/numparse_symbols.h index f7810612bb5d..a43dd8bbb95c 100644 --- a/deps/icu-small/source/i18n/numparse_symbols.h +++ b/deps/icu-small/source/i18n/numparse_symbols.h @@ -38,7 +38,7 @@ class U_I18N_API SymbolMatcher : public NumberParseMatcher, public UMemory { protected: UnicodeString fString; - const UnicodeSet* fUniSet; // a reference from numparse_unisets.h; never owned + const UnicodeSet* fUniSet = nullptr; // a reference from numparse_unisets.h; never owned SymbolMatcher(const UnicodeString& symbolString, unisets::Key key); }; @@ -88,7 +88,7 @@ class U_I18N_API MinusSignMatcher : public SymbolMatcher { void accept(StringSegment& segment, ParsedNumber& result) const override; private: - bool fAllowTrailing; + bool fAllowTrailing = false; }; @@ -160,7 +160,7 @@ class U_I18N_API PlusSignMatcher : public SymbolMatcher { void accept(StringSegment& segment, ParsedNumber& result) const override; private: - bool fAllowTrailing; + bool fAllowTrailing = false; }; @@ -177,7 +177,7 @@ class U_I18N_API ApproximatelySignMatcher : public SymbolMatcher { void accept(StringSegment& segment, ParsedNumber& result) const override; private: - bool fAllowTrailing; + bool fAllowTrailing = false; }; } // namespace numparse::impl diff --git a/deps/icu-small/source/i18n/numrange_impl.cpp b/deps/icu-small/source/i18n/numrange_impl.cpp index 0b1590158a4c..bd8e2d0d9a16 100644 --- a/deps/icu-small/source/i18n/numrange_impl.cpp +++ b/deps/icu-small/source/i18n/numrange_impl.cpp @@ -391,6 +391,7 @@ void NumberRangeFormatterImpl::formatRange(UFormattedNumberRangeData& data, FormattedStringBuilder tempString; NumberFormatterImpl::writeNumber(micros2.simple, data.quantity2, tempString, 0, status); length2 += string.insert(UPRV_INDEX_2, tempString, status); + if (U_FAILURE(status)) { return; } // TODO: Support padding? @@ -431,7 +432,8 @@ void NumberRangeFormatterImpl::formatRange(UFormattedNumberRangeData& data, const Modifier& -NumberRangeFormatterImpl::resolveModifierPlurals(const Modifier& first, const Modifier& second) const { +NumberRangeFormatterImpl::resolveModifierPlurals(const Modifier& first U_LIFETIME_BOUND, + const Modifier& second) const { Modifier::Parameters parameters; first.getParameters(parameters); if (parameters.obj == nullptr) { diff --git a/deps/icu-small/source/i18n/numrange_impl.h b/deps/icu-small/source/i18n/numrange_impl.h index 7d024816c436..ccdbe821ce34 100644 --- a/deps/icu-small/source/i18n/numrange_impl.h +++ b/deps/icu-small/source/i18n/numrange_impl.h @@ -72,7 +72,8 @@ class NumberRangeFormatterImpl : public UMemory { MicroProps& micros1, MicroProps& micros2, UErrorCode& status) const; - const Modifier& resolveModifierPlurals(const Modifier& first, const Modifier& second) const; + const Modifier& resolveModifierPlurals(const Modifier& first U_LIFETIME_BOUND, + const Modifier& second) const; }; diff --git a/deps/icu-small/source/i18n/numsys.cpp b/deps/icu-small/source/i18n/numsys.cpp index 3123a5c8da39..cfed7559e510 100644 --- a/deps/icu-small/source/i18n/numsys.cpp +++ b/deps/icu-small/source/i18n/numsys.cpp @@ -335,7 +335,7 @@ NumsysNameEnumeration::NumsysNameEnumeration(UErrorCode& status) : pos(0) { } const UnicodeString* -NumsysNameEnumeration::snext(UErrorCode& status) { +NumsysNameEnumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { if (U_SUCCESS(status) && (gNumsysNames != nullptr) && (pos < gNumsysNames->size())) { return static_cast(gNumsysNames->elementAt(pos++)); } diff --git a/deps/icu-small/source/i18n/numsys_impl.h b/deps/icu-small/source/i18n/numsys_impl.h index 42cf102a1318..56ed76cc3437 100644 --- a/deps/icu-small/source/i18n/numsys_impl.h +++ b/deps/icu-small/source/i18n/numsys_impl.h @@ -31,7 +31,7 @@ class NumsysNameEnumeration : public StringEnumeration { virtual ~NumsysNameEnumeration(); static UClassID U_EXPORT2 getStaticClassID(); virtual UClassID getDynamicClassID() const override; - virtual const UnicodeString* snext(UErrorCode& status) override; + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override; virtual void reset(UErrorCode& status) override; virtual int32_t count(UErrorCode& status) const override; private: diff --git a/deps/icu-small/source/i18n/olsontz.cpp b/deps/icu-small/source/i18n/olsontz.cpp index 7826d47a7d06..54d40ffc38ed 100644 --- a/deps/icu-small/source/i18n/olsontz.cpp +++ b/deps/icu-small/source/i18n/olsontz.cpp @@ -113,7 +113,7 @@ void OlsonTimeZone::constructEmpty() { /** * Construct from a resource bundle * @param top the top-level zoneinfo resource bundle. This is used - * to lookup the rule that `res' may refer to, if there is one. + * to lookup the rule that `res` may refer to, if there is one. * @param res the resource bundle of the zone to be constructed * @param ec input-output error code */ diff --git a/deps/icu-small/source/i18n/olsontz.h b/deps/icu-small/source/i18n/olsontz.h index 33d9f66c3621..4e925a03f792 100644 --- a/deps/icu-small/source/i18n/olsontz.h +++ b/deps/icu-small/source/i18n/olsontz.h @@ -118,7 +118,7 @@ class U_I18N_API_CLASS OlsonTimeZone : public BasicTimeZone { /** * Construct from a resource bundle. * @param top the top-level zoneinfo resource bundle. This is used - * to lookup the rule that `res' may refer to, if there is one. + * to lookup the rule that `res` may refer to, if there is one. * @param res the resource bundle of the zone to be constructed * @param tzid the time zone ID * @param ec input-output error code diff --git a/deps/icu-small/source/i18n/plurfmt.cpp b/deps/icu-small/source/i18n/plurfmt.cpp index 8effc71dff62..e19602de60f6 100644 --- a/deps/icu-small/source/i18n/plurfmt.cpp +++ b/deps/icu-small/source/i18n/plurfmt.cpp @@ -38,27 +38,18 @@ static const char16_t OTHER_STRING[] = { UOBJECT_DEFINE_RTTI_IMPLEMENTATION(PluralFormat) PluralFormat::PluralFormat(UErrorCode& status) - : locale(Locale::getDefault()), - msgPattern(status), - numberFormat(nullptr), - offset(0) { - init(nullptr, UPLURAL_TYPE_CARDINAL, status); + : PluralFormat(Locale::getDefault(), status) +{ } PluralFormat::PluralFormat(const Locale& loc, UErrorCode& status) - : locale(loc), - msgPattern(status), - numberFormat(nullptr), - offset(0) { - init(nullptr, UPLURAL_TYPE_CARDINAL, status); + : PluralFormat(loc, UPLURAL_TYPE_CARDINAL, status) +{ } PluralFormat::PluralFormat(const PluralRules& rules, UErrorCode& status) - : locale(Locale::getDefault()), - msgPattern(status), - numberFormat(nullptr), - offset(0) { - init(&rules, UPLURAL_TYPE_COUNT, status); + : PluralFormat(Locale::getDefault(), rules, status) +{ } PluralFormat::PluralFormat(const Locale& loc, @@ -83,34 +74,22 @@ PluralFormat::PluralFormat(const Locale& loc, PluralFormat::PluralFormat(const UnicodeString& pat, UErrorCode& status) - : locale(Locale::getDefault()), - msgPattern(status), - numberFormat(nullptr), - offset(0) { - init(nullptr, UPLURAL_TYPE_CARDINAL, status); - applyPattern(pat, status); + : PluralFormat(Locale::getDefault(), pat, status) +{ } PluralFormat::PluralFormat(const Locale& loc, const UnicodeString& pat, UErrorCode& status) - : locale(loc), - msgPattern(status), - numberFormat(nullptr), - offset(0) { - init(nullptr, UPLURAL_TYPE_CARDINAL, status); - applyPattern(pat, status); + : PluralFormat(loc, UPLURAL_TYPE_CARDINAL, pat, status) +{ } PluralFormat::PluralFormat(const PluralRules& rules, const UnicodeString& pat, UErrorCode& status) - : locale(Locale::getDefault()), - msgPattern(status), - numberFormat(nullptr), - offset(0) { - init(&rules, UPLURAL_TYPE_COUNT, status); - applyPattern(pat, status); + : PluralFormat(Locale::getDefault(), rules, pat, status) +{ } PluralFormat::PluralFormat(const Locale& loc, @@ -152,7 +131,7 @@ PluralFormat::copyObjects(const PluralFormat& other) { delete numberFormat; delete pluralRulesWrapper.pluralRules; if (other.numberFormat == nullptr) { - numberFormat = NumberFormat::createInstance(locale, status); + numberFormat = nullptr; } else { numberFormat = other.numberFormat->clone(); } @@ -184,7 +163,19 @@ PluralFormat::init(const PluralRules* rules, UPluralType type, UErrorCode& statu } } - numberFormat= NumberFormat::createInstance(locale, status); + initializeNumberFormat(status); +} + +void +PluralFormat::initializeNumberFormat(UErrorCode& status) { + if (U_SUCCESS(status) && numberFormat == nullptr + && (msgPattern.countParts() == 0 || msgPattern.getPatternString().indexOf(u'#') >= 0)) + { + // The pattern may need to format a number later. + // Let's cache this expensive to use number format. + numberFormat = NumberFormat::createInstance(locale, status); + } + // either we failed, we use the existing one, or the pattern doesn't format a number. } void @@ -196,6 +187,7 @@ PluralFormat::applyPattern(const UnicodeString& newPattern, UErrorCode& status) return; } offset = msgPattern.getPluralOffset(0); + initializeNumberFormat(status); } UnicodeString& @@ -270,22 +262,24 @@ PluralFormat::format(const Formattable& numberObject, double number, data.quantity.setToDouble(numberMinusOffset); } UnicodeString numberString; - auto *decFmt = dynamic_cast(numberFormat); - if(decFmt != nullptr) { - const number::LocalizedNumberFormatter* lnf = decFmt->toNumberFormatter(status); - if (U_FAILURE(status)) { - return appendTo; - } - lnf->formatImpl(&data, status); // mutates &data - if (U_FAILURE(status)) { - return appendTo; - } - numberString = data.getStringRef().toUnicodeString(); - } else { - if (offset == 0) { - numberFormat->format(numberObject, numberString, status); + if (numberFormat != nullptr) { + auto *decFmt = dynamic_cast(numberFormat); + if(decFmt != nullptr) { + const number::LocalizedNumberFormatter* lnf = decFmt->toNumberFormatter(status); + if (U_FAILURE(status)) { + return appendTo; + } + lnf->formatImpl(&data, status); // mutates &data + if (U_FAILURE(status)) { + return appendTo; + } + numberString = data.getStringRef().toUnicodeString(); } else { - numberFormat->format(numberMinusOffset, numberString, status); + if (offset == 0) { + numberFormat->format(numberObject, numberString, status); + } else { + numberFormat->format(numberMinusOffset, numberString, status); + } } } @@ -341,6 +335,7 @@ PluralFormat::setLocale(const Locale& loc, UErrorCode& status) { numberFormat = nullptr; pluralRulesWrapper.reset(); init(nullptr, UPLURAL_TYPE_CARDINAL, status); + initializeNumberFormat(status); } void @@ -348,12 +343,18 @@ PluralFormat::setNumberFormat(const NumberFormat* format, UErrorCode& status) { if (U_FAILURE(status)) { return; } - NumberFormat* nf = format->clone(); - if (nf != nullptr) { + if (format == nullptr) { delete numberFormat; - numberFormat = nf; - } else { - status = U_MEMORY_ALLOCATION_ERROR; + numberFormat = nullptr; + } + else { + NumberFormat* nf = format->clone(); + if (nf != nullptr) { + delete numberFormat; + numberFormat = nf; + } else { + status = U_MEMORY_ALLOCATION_ERROR; + } } } diff --git a/deps/icu-small/source/i18n/plurrule.cpp b/deps/icu-small/source/i18n/plurrule.cpp index cfb50a83fbba..04b324f32431 100644 --- a/deps/icu-small/source/i18n/plurrule.cpp +++ b/deps/icu-small/source/i18n/plurrule.cpp @@ -1597,7 +1597,7 @@ PluralKeywordEnumeration::PluralKeywordEnumeration(RuleChain *header, UErrorCode } const UnicodeString* -PluralKeywordEnumeration::snext(UErrorCode& status) { +PluralKeywordEnumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { if (U_SUCCESS(status) && pos < fKeywordNames.size()) { return static_cast(fKeywordNames.elementAt(pos++)); } @@ -1981,7 +1981,9 @@ PluralAvailableLocalesEnumeration::~PluralAvailableLocalesEnumeration() { fRes = nullptr; } -const char *PluralAvailableLocalesEnumeration::next(int32_t *resultLength, UErrorCode &status) { +const char* +PluralAvailableLocalesEnumeration::next(int32_t* resultLength, + UErrorCode& status) U_LIFETIME_BOUND { if (U_FAILURE(status)) { return nullptr; } diff --git a/deps/icu-small/source/i18n/plurrule_impl.h b/deps/icu-small/source/i18n/plurrule_impl.h index e57f931af3c4..6880341bdd4b 100644 --- a/deps/icu-small/source/i18n/plurrule_impl.h +++ b/deps/icu-small/source/i18n/plurrule_impl.h @@ -412,7 +412,7 @@ class PluralKeywordEnumeration : public StringEnumeration { virtual ~PluralKeywordEnumeration(); static UClassID U_EXPORT2 getStaticClassID(); virtual UClassID getDynamicClassID() const override; - virtual const UnicodeString* snext(UErrorCode& status) override; + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override; virtual void reset(UErrorCode& status) override; virtual int32_t count(UErrorCode& status) const override; private: @@ -425,7 +425,7 @@ class U_I18N_API PluralAvailableLocalesEnumeration: public StringEnumeration { public: PluralAvailableLocalesEnumeration(UErrorCode &status); virtual ~PluralAvailableLocalesEnumeration(); - virtual const char* next(int32_t *resultLength, UErrorCode& status) override; + virtual const char* next(int32_t* resultLength, UErrorCode& status) U_LIFETIME_BOUND override; virtual void reset(UErrorCode& status) override; virtual int32_t count(UErrorCode& status) const override; private: diff --git a/deps/icu-small/source/i18n/rbnf.cpp b/deps/icu-small/source/i18n/rbnf.cpp index 97017f031739..66cc4ceb9b38 100644 --- a/deps/icu-small/source/i18n/rbnf.cpp +++ b/deps/icu-small/source/i18n/rbnf.cpp @@ -35,6 +35,7 @@ #include "uresimp.h" #include "nfrs.h" #include "number_decimalquantity.h" +#include // debugging // #define RBNF_DEBUG @@ -52,10 +53,11 @@ static const char16_t gPercentPercent[] = // All urbnf objects are created through openRules, so we init all of the // Unicode string constants required by rbnf, nfrs, or nfr here. -static const char16_t gLenientParse[] = +static constexpr char16_t gLenientParse[] = { 0x25, 0x25, 0x6C, 0x65, 0x6E, 0x69, 0x65, 0x6E, 0x74, 0x2D, 0x70, 0x61, 0x72, 0x73, 0x65, 0x3A, 0 }; /* "%%lenient-parse:" */ +static constexpr auto gLenientParseLen = std::u16string_view(gLenientParse).length(); static const char16_t gSemiColon = 0x003B; static const char16_t gSemiPercent[] = { @@ -140,21 +142,21 @@ LocalizationInfo::operator==(const LocalizationInfo* rhs) const { int32_t rsc = getNumberOfRuleSets(); if (rsc == rhs->getNumberOfRuleSets()) { - for (int i = 0; i < rsc; ++i) { + for (int32_t i = 0; i < rsc; ++i) { if (!streq(getRuleSetName(i), rhs->getRuleSetName(i))) { return false; } } int32_t dlc = getNumberOfDisplayLocales(); if (dlc == rhs->getNumberOfDisplayLocales()) { - for (int i = 0; i < dlc; ++i) { + for (int32_t i = 0; i < dlc; ++i) { const char16_t* locale = getLocaleName(i); int32_t ix = rhs->indexForLocale(locale); // if no locale, ix is -1, getLocaleName returns null, so streq returns false if (!streq(locale, rhs->getLocaleName(ix))) { return false; } - for (int j = 0; j < rsc; ++j) { + for (int32_t j = 0; j < rsc; ++j) { if (!streq(getDisplayName(i, j), rhs->getDisplayName(ix, j))) { return false; } @@ -169,7 +171,7 @@ LocalizationInfo::operator==(const LocalizationInfo* rhs) const { int32_t LocalizationInfo::indexForLocale(const char16_t* locale) const { - for (int i = 0; i < getNumberOfDisplayLocales(); ++i) { + for (int32_t i = 0; i < getNumberOfDisplayLocales(); ++i) { if (streq(locale, getLocaleName(i))) { return i; } @@ -180,7 +182,7 @@ LocalizationInfo::indexForLocale(const char16_t* locale) const { int32_t LocalizationInfo::indexForRuleSet(const char16_t* ruleset) const { if (ruleset) { - for (int i = 0; i < getNumberOfRuleSets(); ++i) { + for (int32_t i = 0; i < getNumberOfRuleSets(); ++i) { if (streq(ruleset, getRuleSetName(i))) { return i; } @@ -193,18 +195,18 @@ LocalizationInfo::indexForRuleSet(const char16_t* ruleset) const { typedef void (*Fn_Deleter)(void*); class VArray { - void** buf; - int32_t cap; - int32_t size; - Fn_Deleter deleter; + void** buf { }; + int32_t cap { }; + int32_t size { }; + Fn_Deleter deleter { }; public: - VArray() : buf(nullptr), cap(0), size(0), deleter(nullptr) {} + VArray() {} - VArray(Fn_Deleter del) : buf(nullptr), cap(0), size(0), deleter(del) {} + VArray(Fn_Deleter del) : deleter(del) {} ~VArray() { if (deleter) { - for (int i = 0; i < size; ++i) { + for (int32_t i = 0; i < size; ++i) { (*deleter)(buf[i]); } } @@ -298,16 +300,16 @@ enum { * Utility for parsing a localization string and returning a StringLocalizationInfo*. */ class LocDataParser { - char16_t* data; - const char16_t* e; - char16_t* p; - char16_t ch; + char16_t* data { }; + const char16_t* e { }; + char16_t* p { }; + char16_t ch { 0xffff }; UParseError& pe; UErrorCode& ec; - + public: LocDataParser(UParseError& parseError, UErrorCode& status) - : data(nullptr), e(nullptr), p(nullptr), ch(0xffff), pe(parseError), ec(status) {} + : pe(parseError), ec(status) {} ~LocDataParser() {} /* @@ -686,150 +688,48 @@ StringLocalizationInfo::getDisplayName(int32_t localeIndex, int32_t ruleIndex) c RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, const UnicodeString& locs, const Locale& alocale, UParseError& perror, UErrorCode& status) - : fRuleSets(nullptr) - , ruleSetDescriptions(nullptr) - , numRuleSets(0) - , defaultRuleSet(nullptr) - , locale(alocale) - , collator(nullptr) - , decimalFormatSymbols(nullptr) - , defaultInfinityRule(nullptr) - , defaultNaNRule(nullptr) - , fRoundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) - , lenient(false) - , lenientParseRules(nullptr) - , localizations(nullptr) - , capitalizationInfoSet(false) - , capitalizationForUIListMenu(false) - , capitalizationForStandAlone(false) - , capitalizationBrkIter(nullptr) + : RuleBasedNumberFormat(description, StringLocalizationInfo::create(locs, perror, status), alocale, perror, status) { - LocalizationInfo* locinfo = StringLocalizationInfo::create(locs, perror, status); - init(description, locinfo, perror, status); } RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, const UnicodeString& locs, UParseError& perror, UErrorCode& status) - : fRuleSets(nullptr) - , ruleSetDescriptions(nullptr) - , numRuleSets(0) - , defaultRuleSet(nullptr) - , locale(Locale::getDefault()) - , collator(nullptr) - , decimalFormatSymbols(nullptr) - , defaultInfinityRule(nullptr) - , defaultNaNRule(nullptr) - , fRoundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) - , lenient(false) - , lenientParseRules(nullptr) - , localizations(nullptr) - , capitalizationInfoSet(false) - , capitalizationForUIListMenu(false) - , capitalizationForStandAlone(false) - , capitalizationBrkIter(nullptr) + : RuleBasedNumberFormat(description, locs, Locale::getDefault(), perror, status) { - LocalizationInfo* locinfo = StringLocalizationInfo::create(locs, perror, status); - init(description, locinfo, perror, status); } RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, LocalizationInfo* info, const Locale& alocale, UParseError& perror, UErrorCode& status) - : fRuleSets(nullptr) - , ruleSetDescriptions(nullptr) - , numRuleSets(0) - , defaultRuleSet(nullptr) - , locale(alocale) - , collator(nullptr) - , decimalFormatSymbols(nullptr) - , defaultInfinityRule(nullptr) - , defaultNaNRule(nullptr) - , fRoundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) - , lenient(false) - , lenientParseRules(nullptr) - , localizations(nullptr) - , capitalizationInfoSet(false) - , capitalizationForUIListMenu(false) - , capitalizationForStandAlone(false) - , capitalizationBrkIter(nullptr) + : locale(alocale) { - init(description, info, perror, status); + init(description, info, perror, status); } RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, UParseError& perror, UErrorCode& status) - : fRuleSets(nullptr) - , ruleSetDescriptions(nullptr) - , numRuleSets(0) - , defaultRuleSet(nullptr) - , locale(Locale::getDefault()) - , collator(nullptr) - , decimalFormatSymbols(nullptr) - , defaultInfinityRule(nullptr) - , defaultNaNRule(nullptr) - , fRoundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) - , lenient(false) - , lenientParseRules(nullptr) - , localizations(nullptr) - , capitalizationInfoSet(false) - , capitalizationForUIListMenu(false) - , capitalizationForStandAlone(false) - , capitalizationBrkIter(nullptr) + : RuleBasedNumberFormat(description, nullptr, Locale::getDefault(), perror, status) { - init(description, nullptr, perror, status); } RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, const Locale& aLocale, UParseError& perror, UErrorCode& status) - : fRuleSets(nullptr) - , ruleSetDescriptions(nullptr) - , numRuleSets(0) - , defaultRuleSet(nullptr) - , locale(aLocale) - , collator(nullptr) - , decimalFormatSymbols(nullptr) - , defaultInfinityRule(nullptr) - , defaultNaNRule(nullptr) - , fRoundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) - , lenient(false) - , lenientParseRules(nullptr) - , localizations(nullptr) - , capitalizationInfoSet(false) - , capitalizationForUIListMenu(false) - , capitalizationForStandAlone(false) - , capitalizationBrkIter(nullptr) + : RuleBasedNumberFormat(description, nullptr, aLocale, perror, status) { - init(description, nullptr, perror, status); } RuleBasedNumberFormat::RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& alocale, UErrorCode& status) - : fRuleSets(nullptr) - , ruleSetDescriptions(nullptr) - , numRuleSets(0) - , defaultRuleSet(nullptr) - , locale(alocale) - , collator(nullptr) - , decimalFormatSymbols(nullptr) - , defaultInfinityRule(nullptr) - , defaultNaNRule(nullptr) - , fRoundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) - , lenient(false) - , lenientParseRules(nullptr) - , localizations(nullptr) - , capitalizationInfoSet(false) - , capitalizationForUIListMenu(false) - , capitalizationForStandAlone(false) - , capitalizationBrkIter(nullptr) + : locale(alocale) { if (U_FAILURE(status)) { return; } - const char* rules_tag = "RBNFRules"; + constexpr auto rules_tag = "RBNFRules"; const char* fmt_tag = ""; switch (tag) { case URBNF_SPELLOUT: fmt_tag = "SpelloutRules"; break; @@ -847,50 +747,19 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& setLocaleIDs(ures_getLocaleByType(nfrb, ULOC_VALID_LOCALE, &status), ures_getLocaleByType(nfrb, ULOC_ACTUAL_LOCALE, &status)); - UResourceBundle* rbnfRules = ures_getByKeyWithFallback(nfrb, rules_tag, nullptr, &status); - if (U_FAILURE(status)) { - ures_close(nfrb); - } - UResourceBundle* ruleSets = ures_getByKeyWithFallback(rbnfRules, fmt_tag, nullptr, &status); - if (U_FAILURE(status)) { - ures_close(rbnfRules); - ures_close(nfrb); - return; - } - - UnicodeString desc; - while (ures_hasNext(ruleSets)) { - desc.append(ures_getNextUnicodeString(ruleSets,nullptr,&status)); + nfrb = ures_getByKeyWithFallback(nfrb, rules_tag, nfrb, &status); + nfrb = ures_getByKeyWithFallback(nfrb, fmt_tag, nfrb, &status); + if (U_SUCCESS(status)) { + UParseError perror; + init(ures_getUnicodeString(nfrb, &status), locinfo, perror, status); } - UParseError perror; - - init(desc, locinfo, perror, status); - - ures_close(ruleSets); - ures_close(rbnfRules); } ures_close(nfrb); } RuleBasedNumberFormat::RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs) : NumberFormat(rhs) - , fRuleSets(nullptr) - , ruleSetDescriptions(nullptr) - , numRuleSets(0) - , defaultRuleSet(nullptr) , locale(rhs.locale) - , collator(nullptr) - , decimalFormatSymbols(nullptr) - , defaultInfinityRule(nullptr) - , defaultNaNRule(nullptr) - , fRoundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) - , lenient(false) - , lenientParseRules(nullptr) - , localizations(nullptr) - , capitalizationInfoSet(false) - , capitalizationForUIListMenu(false) - , capitalizationForStandAlone(false) - , capitalizationBrkIter(nullptr) { this->operator=(rhs); } @@ -908,6 +777,7 @@ RuleBasedNumberFormat::operator=(const RuleBasedNumberFormat& rhs) dispose(); locale = rhs.locale; lenient = rhs.lenient; + unparseable = rhs.unparseable; UParseError perror; setDecimalFormatSymbols(*rhs.getDecimalFormatSymbols()); @@ -915,6 +785,10 @@ RuleBasedNumberFormat::operator=(const RuleBasedNumberFormat& rhs) setDefaultRuleSet(rhs.getDefaultRuleSetName(), status); setRoundingMode(rhs.getRoundingMode()); + if (lenient) { + initializeCollator(status); + } + capitalizationInfoSet = rhs.capitalizationInfoSet; capitalizationForUIListMenu = rhs.capitalizationForUIListMenu; capitalizationForStandAlone = rhs.capitalizationForStandAlone; @@ -1332,7 +1206,11 @@ RuleBasedNumberFormat::adjustForCapitalizationContext(int32_t startPos, (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_STANDALONE && capitalizationForStandAlone)) ) { // titlecase first word of currentResult, here use sentence iterator unlike current implementations // in LocaleDisplayNamesImpl::adjustForUsageAndContext and RelativeDateFormat::format - currentResult.toTitle(capitalizationBrkIter, locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); + // Clone the break iterator to avoid mutating it in a const method (thread safety). + LocalPointer iter(capitalizationBrkIter->clone()); + if (iter.isValid()) { + currentResult.toTitle(iter.getAlias(), locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); + } } } #endif @@ -1345,7 +1223,7 @@ RuleBasedNumberFormat::parse(const UnicodeString& text, Formattable& result, ParsePosition& parsePosition) const { - if (!fRuleSets) { + if (!fRuleSets || unparseable) { parsePosition.setErrorIndex(0); return; } @@ -1394,21 +1272,23 @@ RuleBasedNumberFormat::parse(const UnicodeString& text, } } -#if !UCONFIG_NO_COLLATION - void RuleBasedNumberFormat::setLenient(UBool enabled) { lenient = enabled; +#if !UCONFIG_NO_COLLATION if (!enabled && collator) { delete collator; collator = nullptr; + } else if (enabled && collator == nullptr) { + // Eagerly initialize the collator so that getCollator() is thread-safe. + UErrorCode status = U_ZERO_ERROR; + initializeCollator(status); } -} - #endif +} -void +void RuleBasedNumberFormat::setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status) { if (U_SUCCESS(status)) { if (ruleSetName.isEmpty()) { @@ -1485,6 +1365,11 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali return; } + // Use Turkic case folding for Turkish and Azerbaijani locales. + const char* lang = locale.getLanguage(); + caseFoldOption = (uprv_strcmp(lang, "tr") == 0 || uprv_strcmp(lang, "az") == 0) + ? U_FOLD_CASE_EXCLUDE_SPECIAL_I : U_FOLD_CASE_DEFAULT; + initializeDecimalFormatSymbols(status); initializeDefaultInfinityRule(status); initializeDefaultNaNRule(status); @@ -1511,7 +1396,7 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali // is, pull them out into our temporary holding place for them, // and delete them from the description before the real desciption- // parsing code sees them - int32_t lp = description.indexOf(gLenientParse, -1, 0); + int32_t lp = description.indexOf(gLenientParse, gLenientParseLen, 0); if (lp != -1) { // we've got to make sure we're not in the middle of a rule // (where "%%lenient-parse" would actually get treated as @@ -1520,25 +1405,24 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali // locate the beginning and end of the actual collation // rules (there may be whitespace between the name and // the first token in the description) - int lpEnd = description.indexOf(gSemiPercent, 2, lp); + int32_t lpEnd = description.indexOf(gSemiPercent, 2, lp); if (lpEnd == -1) { lpEnd = description.length() - 1; } - int lpStart = lp + u_strlen(gLenientParse); + int32_t lpStart = lp + gLenientParseLen; while (PatternProps::isWhiteSpace(description.charAt(lpStart))) { ++lpStart; } // copy out the lenient-parse rules and delete them // from the description - lenientParseRules = new UnicodeString(); + lenientParseRules = new UnicodeString(description, lpStart, lpEnd - lpStart); /* test for nullptr */ if (lenientParseRules == nullptr) { status = U_MEMORY_ALLOCATION_ERROR; return; } - lenientParseRules->setTo(description, lpStart, lpEnd - lpStart); description.remove(lp, lpEnd + 1 - lp); } @@ -1562,7 +1446,7 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali return; } - for (int i = 0; i <= numRuleSets; ++i) { + for (int32_t i = 0; i <= numRuleSets; ++i) { fRuleSets[i] = nullptr; } @@ -1585,7 +1469,7 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali } { - int curRuleSet = 0; + int32_t curRuleSet = 0; int32_t start = 0; for (int32_t p = description.indexOf(gSemiPercent, 2, 0); p != -1; p = description.indexOf(gSemiPercent, 2, start)) { ruleSetDescriptions[curRuleSet].setTo(description, start, p + 1 - start); @@ -1623,12 +1507,10 @@ RuleBasedNumberFormat::init(const UnicodeString& rules, LocalizationInfo* locali // Now that we know all the rule names, we can go back through // the temporary descriptions list and finish setting up the substructure // (and we throw away the temporary descriptions as we go) - { - for (int i = 0; i < numRuleSets; i++) { - fRuleSets[i]->parseRules(ruleSetDescriptions[i], status); - if (U_FAILURE(status)) { - return; - } + for (int32_t i = 0; i < numRuleSets; i++) { + fRuleSets[i]->parseRules(ruleSetDescriptions[i], status); + if (U_FAILURE(status)) { + return; } } @@ -1692,7 +1574,7 @@ void RuleBasedNumberFormat::initCapitalizationContextInfo(const Locale& thelocale) { #if !UCONFIG_NO_BREAK_ITERATION - const char * localeID = (thelocale != nullptr)? thelocale.getBaseName(): nullptr; + const char * localeID = thelocale.getBaseName(); UErrorCode status = U_ZERO_ERROR; UResourceBundle *rb = ures_open(nullptr, localeID, &status); rb = ures_getByKeyWithFallback(rb, "contextTransforms", rb, &status); @@ -1712,10 +1594,31 @@ RuleBasedNumberFormat::initCapitalizationContextInfo(const Locale& thelocale) void RuleBasedNumberFormat::stripWhitespace(UnicodeString& description) { - // iterate through the characters... - UnicodeString result; + // Find the first semicolon followed by whitespace or another semicolon, + // or leading whitespace/semicolons. Everything before that point is already clean. + int32_t len = description.length(); + int32_t start = 0; + if (len > 0) { + UChar ch = description.charAt(0); + if (!PatternProps::isWhiteSpace(ch) && ch != gSemiColon) { + for (int32_t i = 0; i < len - 1; ++i) { + if (description.charAt(i) == gSemiColon) { + UChar next = description.charAt(i + 1); + if (PatternProps::isWhiteSpace(next) || next == gSemiColon) { + start = i + 1; + break; + } + } + } + if (start == 0) { + return; // No whitespace to strip anywhere. + } + } + } + + // Copy the clean prefix, then strip whitespace from the rest. + UnicodeString result(description, 0, start); - int start = 0; UChar ch; while (start < description.length()) { // Seek to the first non-whitespace character... @@ -1798,55 +1701,52 @@ RuleBasedNumberFormat::dispose() //----------------------------------------------------------------------- /** - * Returns the collator to use for lenient parsing. The collator is lazily created: - * this function creates it the first time it's called. - * @return The collator to use for lenient parsing, or null if lenient parsing - * is turned off. -*/ -const RuleBasedCollator* -RuleBasedNumberFormat::getCollator() const + * Initializes the collator for lenient parsing. Must be called from + * non-const methods (setLenient, operator=) so that getCollator() can + * be thread-safe. + */ +void +RuleBasedNumberFormat::initializeCollator(UErrorCode &status) { #if !UCONFIG_NO_COLLATION - if (!fRuleSets) { - return nullptr; + if (collator != nullptr || !fRuleSets) { + return; } - // lazy-evaluate the collator - if (collator == nullptr && lenient) { - // create a default collator based on the formatter's locale, - // then pull out that collator's rules, append any additional - // rules specified in the description, and create a _new_ - // collator based on the combination of those rules - - UErrorCode status = U_ZERO_ERROR; + Collator* temp = Collator::createInstance(locale, status); + RuleBasedCollator* newCollator; + if (U_SUCCESS(status) && (newCollator = dynamic_cast(temp)) != nullptr) { + if (lenientParseRules) { + UnicodeString rules(newCollator->getRules()); + rules.append(*lenientParseRules); - Collator* temp = Collator::createInstance(locale, status); - RuleBasedCollator* newCollator; - if (U_SUCCESS(status) && (newCollator = dynamic_cast(temp)) != nullptr) { - if (lenientParseRules) { - UnicodeString rules(newCollator->getRules()); - rules.append(*lenientParseRules); - - newCollator = new RuleBasedCollator(rules, status); - // Exit if newCollator could not be created. - if (newCollator == nullptr) { - return nullptr; - } - } else { - temp = nullptr; - } - if (U_SUCCESS(status)) { - newCollator->setAttribute(UCOL_DECOMPOSITION_MODE, UCOL_ON, status); - // cast away const - const_cast(this)->collator = newCollator; - } else { - delete newCollator; + newCollator = new RuleBasedCollator(rules, status); + // Exit if newCollator could not be created. + if (newCollator == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; } + } else { + temp = nullptr; + } + if (U_SUCCESS(status)) { + newCollator->setAttribute(UCOL_DECOMPOSITION_MODE, UCOL_ON, status); + collator = newCollator; + } else { + delete newCollator; } - delete temp; } + delete temp; #endif +} +/** + * Returns the collator to use for lenient parsing, or null if lenient parsing + * is turned off. +*/ +const RuleBasedCollator* +RuleBasedNumberFormat::getCollator() const +{ // if lenient-parse mode is off, this will be null // (see setLenientParseMode()) return collator; diff --git a/deps/icu-small/source/i18n/rbt_pars.cpp b/deps/icu-small/source/i18n/rbt_pars.cpp index e2dbb058d5c5..c05f078f0fa4 100644 --- a/deps/icu-small/source/i18n/rbt_pars.cpp +++ b/deps/icu-small/source/i18n/rbt_pars.cpp @@ -150,6 +150,8 @@ class ParseData : public UMemory, public SymbolTable { virtual const UnicodeString* lookup(const UnicodeString& s) const override; + virtual const UnicodeSet* lookupSet(const UnicodeString& s) const override; + virtual const UnicodeFunctor* lookupMatcher(UChar32 ch) const override; virtual UnicodeString parseReference(const UnicodeString& text, @@ -185,6 +187,20 @@ const UnicodeString* ParseData::lookup(const UnicodeString& name) const { return static_cast(variableNames->get(name)); } + +const UnicodeSet* ParseData::lookupSet(const UnicodeString& name) const { + const auto value = static_cast(variableNames->get(name)); + if (value == nullptr || value->length() != 1) { + return nullptr; + } + const int32_t i = value->charAt(0) - data->variablesBase; + if (0 <= i && i < variablesVector->size()) { + return dynamic_cast( + static_cast(variablesVector->elementAt(i))); + } + return nullptr; +} + /** * Implement SymbolTable API. */ @@ -369,10 +385,10 @@ int32_t RuleHalf::parse(const UnicodeString& rule, int32_t pos, int32_t limit, U if (cursorOffset > 0 && cursor != cursorOffsetPos) { return syntaxError(U_MISPLACED_CURSOR_OFFSET, rule, start, status); } - + return pos; } - + /** * Parse a section of one side of a rule, stopping at either * the limit, the END_OF_RULE character, an operator, or a @@ -409,7 +425,7 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l int32_t varStart = -1; // Most recent $variableReference int32_t varLimit = -1; int32_t bufStart = buf.length(); - + while (pos < limit && !done) { // Since all syntax characters are in the BMP, fetching // 16-bit code units suffices here. @@ -437,7 +453,7 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l if (U_FAILURE(status)) { return syntaxError(U_MALFORMED_SET, rule, start, status); } - pos = pp.getIndex(); + pos = pp.getIndex(); continue; } // Handle escapes @@ -505,7 +521,7 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l } switch (c) { - + //------------------------------------------------------ // Elements allowed within and out of segments //------------------------------------------------------ @@ -522,15 +538,15 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l // bufSegStart is the offset in buf to the first // character of the segment we are parsing. int32_t bufSegStart = buf.length(); - + // Record segment number now, since nextSegmentNumber // will be incremented during the call to parseSection // if there are nested segments. int32_t segmentNumber = nextSegmentNumber++; // 1-based - + // Parse the segment pos = parseSection(rule, pos, limit, buf, UnicodeString(true, ILLEGAL_SEG, -1), true, status); - + // After parsing a segment, the relevant characters are // in buf, starting at offset bufSegStart. Extract them // into a string matcher, and replace them with a @@ -540,7 +556,7 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l if (U_FAILURE(status)) { return syntaxError(U_MEMORY_ALLOCATION_ERROR, rule, start, status); } - + // Record and associate object and segment number parser.setSegmentObject(segmentNumber, m.orphan(), status); buf.truncate(bufSegStart); @@ -558,20 +574,20 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l !ICU_Utility::parseChar(rule, iref, SEGMENT_OPEN)) { return syntaxError(U_INVALID_FUNCTION, rule, start, status); } - + Transliterator *t = single->createInstance(); delete single; if (t == nullptr) { return syntaxError(U_INVALID_FUNCTION, rule, start, status); } - + // bufSegStart is the offset in buf to the first // character of the segment we are parsing. int32_t bufSegStart = buf.length(); - + // Parse the segment pos = parseSection(rule, iref, limit, buf, UnicodeString(true, ILLEGAL_FUNC, -1), true, status); - + // After parsing a segment, the relevant characters are // in buf, starting at offset bufSegStart. UnicodeString output; @@ -581,7 +597,7 @@ int32_t RuleHalf::parseSection(const UnicodeString& rule, int32_t pos, int32_t l if (U_FAILURE(status)) { return syntaxError(U_MEMORY_ALLOCATION_ERROR, rule, start, status); } - + // Replace the buffer contents with a stand-in buf.truncate(bufSegStart); buf.append(parser.generateStandInFor(r.orphan(), status)); @@ -867,7 +883,7 @@ TransliteratorParser::parse(const UnicodeString& rules, /** * Return the compound filter parsed by parse(). Caller owns result. - */ + */ UnicodeSet* TransliteratorParser::orphanCompoundFilter() { UnicodeSet* f = compoundFilter; compoundFilter = nullptr; @@ -896,7 +912,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, UBool parsingIDs = true; int32_t ruleCount = 0; - + while (!dataVector.isEmpty()) { delete static_cast(dataVector.orphanElementAt(0)); } @@ -959,7 +975,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, // keep track of how many rules we've seen ++ruleCount; - + // We've found the start of a rule or ID. c is its first // character, and pos points past c. --pos; @@ -975,7 +991,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, } int32_t p = pos; - + if (!parsingIDs) { if (curData != nullptr) { U_ASSERT(!dataVector.hasDeleter()); @@ -1102,7 +1118,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, curData = nullptr; } } - + if (U_SUCCESS(status)) { // Convert the set vector to an array int32_t i, dataVectorSize = dataVector.size(); @@ -1125,7 +1141,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, data->variables[j] = static_cast(variablesVector.elementAt(j)); } - + data->variableNames.removeAll(); int32_t p = UHASH_FIRST; const UHashElement* he = variableNames.nextElement(p); @@ -1148,7 +1164,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, (direction == UTRANS_REVERSE && compoundFilterOffset != ruleCount)) { status = U_MISPLACED_COMPOUND_FILTER; } - } + } for (i = 0; i < dataVectorSize; i++) { TransliterationRuleData* data = static_cast(dataVector.elementAt(i)); @@ -1168,7 +1184,7 @@ void TransliteratorParser::setVariableRange(int32_t start, int32_t end, UErrorCo status = U_MALFORMED_PRAGMA; return; } - + curData->variablesBase = static_cast(start); if (dataVector.size() == 0) { variableNext = static_cast(start); @@ -1233,12 +1249,12 @@ UBool TransliteratorParser::resemblesPragma(const UnicodeString& rule, int32_t p */ int32_t TransliteratorParser::parsePragma(const UnicodeString& rule, int32_t pos, int32_t limit, UErrorCode& status) { int32_t array[2]; - + // resemblesPragma() has already returned true, so we // know that pos points to /use\s/i; we can skip 4 characters // immediately pos += 4; - + // Here are the pragmas we recognize: // use variable range 0xE000 0xEFFF; // use maximum backup 16; @@ -1249,25 +1265,25 @@ int32_t TransliteratorParser::parsePragma(const UnicodeString& rule, int32_t pos setVariableRange(array[0], array[1], status); return p; } - + p = ICU_Utility::parsePattern(rule, pos, limit, UnicodeString(true, PRAGMA_MAXIMUM_BACKUP, -1), array); if (p >= 0) { pragmaMaximumBackup(array[0]); return p; } - + p = ICU_Utility::parsePattern(rule, pos, limit, UnicodeString(true, PRAGMA_NFD_RULES, -1), nullptr); if (p >= 0) { pragmaNormalizeRules(UNORM_NFD); return p; } - + p = ICU_Utility::parsePattern(rule, pos, limit, UnicodeString(true, PRAGMA_NFC_RULES, -1), nullptr); if (p >= 0) { pragmaNormalizeRules(UNORM_NFC); return p; } - + // Syntax error: unable to parse pragma return -1; } @@ -1364,7 +1380,7 @@ int32_t TransliteratorParser::parseRule(const UnicodeString& rule, int32_t pos, if (left->anchorStart || left->anchorEnd || right->anchorStart || right->anchorEnd) { return syntaxError(U_MALFORMED_VARIABLE_DEFINITION, rule, start, status); - } + } // We allow anything on the right, including an empty string. LocalPointer value(new UnicodeString(right->text), status); // nullptr pointer check @@ -1398,7 +1414,7 @@ int32_t TransliteratorParser::parseRule(const UnicodeString& rule, int32_t pos, syntaxError(U_INTERNAL_TRANSLITERATOR_ERROR, rule, start, status); // will never happen } } - + // If the direction we want doesn't match the rule // direction, do nothing. if (op != FWDREV_RULE_OP && @@ -1498,20 +1514,20 @@ int32_t TransliteratorParser::syntaxError(UErrorCode parseErrorCode, { parseError.offset = pos; parseError.line = 0 ; /* we are not using line numbers */ - + // for pre-context const int32_t LEN = U_PARSE_CONTEXT_LEN - 1; int32_t start = uprv_max(pos - LEN, 0); int32_t stop = pos; - + rule.extract(start,stop-start,parseError.preContext); //null terminate the buffer parseError.preContext[stop-start] = 0; - + //for post-context start = pos; stop = uprv_min(pos + LEN, rule.length()); - + rule.extract(start,stop-start,parseError.postContext); //null terminate the buffer parseError.postContext[stop-start]= 0; @@ -1544,7 +1560,7 @@ char16_t TransliteratorParser::parseSet(const UnicodeString& rule, */ char16_t TransliteratorParser::generateStandInFor(UnicodeFunctor* adopted, UErrorCode& status) { // assert(obj != null); - + // Look up previous stand-in, if any. This is a short list // (typical n is 0, 1, or 2); linear search is optimal. for (int32_t i=0; i(curData->variablesBase + i); } } - + if (variableNext >= variableLimit) { delete adopted; status = U_VARIABLE_RANGE_EXHAUSTED; diff --git a/deps/icu-small/source/i18n/rbt_rule.cpp b/deps/icu-small/source/i18n/rbt_rule.cpp index a39bb98772c0..6a7774c3337b 100644 --- a/deps/icu-small/source/i18n/rbt_rule.cpp +++ b/deps/icu-small/source/i18n/rbt_rule.cpp @@ -64,10 +64,7 @@ TransliterationRule::TransliterationRule(const UnicodeString& input, UBool anchorStart, UBool anchorEnd, const TransliterationRuleData* theData, UErrorCode& status) : - UMemory(), - segments(nullptr), - data(theData) { - + data(theData) { if (U_FAILURE(status)) { return; } @@ -162,18 +159,12 @@ TransliterationRule::TransliterationRule(const UnicodeString& input, * Copy constructor. */ TransliterationRule::TransliterationRule(TransliterationRule& other) : - UMemory(other), - anteContext(nullptr), - key(nullptr), - postContext(nullptr), - pattern(other.pattern), - anteContextLength(other.anteContextLength), - keyLength(other.keyLength), - flags(other.flags), - data(other.data) { - - segments = nullptr; - segmentsCount = 0; + UMemory(other), + pattern(other.pattern), + anteContextLength(other.anteContextLength), + keyLength(other.keyLength), + flags(other.flags), + data(other.data) { if (other.segmentsCount > 0) { segments = static_cast(uprv_malloc(other.segmentsCount * sizeof(UnicodeFunctor*))); uprv_memcpy(segments, other.segments, (size_t)other.segmentsCount*sizeof(segments[0])); diff --git a/deps/icu-small/source/i18n/rbt_rule.h b/deps/icu-small/source/i18n/rbt_rule.h index 755fc8d0506f..ba81cd3c8c78 100644 --- a/deps/icu-small/source/i18n/rbt_rule.h +++ b/deps/icu-small/source/i18n/rbt_rule.h @@ -68,24 +68,24 @@ class TransliterationRule : public UMemory { * The match that must occur before the key, or null if there is no * preceding context. */ - StringMatcher *anteContext; + StringMatcher *anteContext = nullptr; /** * The matcher object for the key. If null, then the key is empty. */ - StringMatcher *key; + StringMatcher *key = nullptr; /** * The match that must occur after the key, or null if there is no * following context. */ - StringMatcher *postContext; + StringMatcher *postContext = nullptr; /** * The object that performs the replacement if the key, * anteContext, and postContext are matched. Never null. */ - UnicodeFunctor* output; + UnicodeFunctor* output = nullptr; /** * The string that must be matched, consisting of the anteContext, key, @@ -105,31 +105,31 @@ class TransliterationRule : public UMemory { * * The array is owned, but the pointers within it are not. */ - UnicodeFunctor** segments; + UnicodeFunctor** segments = nullptr; /** * The number of elements in segments[] or zero if segments is nullptr. */ - int32_t segmentsCount; + int32_t segmentsCount = 0; /** * The length of the string that must match before the key. If * zero, then there is no matching requirement before the key. * Substring [0,anteContextLength) of pattern is the anteContext. */ - int32_t anteContextLength; + int32_t anteContextLength = 0; /** * The length of the key. Substring [anteContextLength, * anteContextLength + keyLength) is the key. */ - int32_t keyLength; + int32_t keyLength = 0; /** * Miscellaneous attributes. */ - int8_t flags; + int8_t flags = 0; /** * Flag attributes. @@ -143,7 +143,7 @@ class TransliterationRule : public UMemory { * An alias pointer to the data for this rule. The data provides * lookup services for matchers and segments. */ - const TransliterationRuleData* data; + const TransliterationRuleData* data = nullptr; public: diff --git a/deps/icu-small/source/i18n/region.cpp b/deps/icu-small/source/i18n/region.cpp index ad5bdbe0115d..157226a86350 100644 --- a/deps/icu-small/source/i18n/region.cpp +++ b/deps/icu-small/source/i18n/region.cpp @@ -736,7 +736,7 @@ RegionNameEnumeration::RegionNameEnumeration(UVector *nameList, UErrorCode& stat } const UnicodeString* -RegionNameEnumeration::snext(UErrorCode& status) { +RegionNameEnumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { if (U_FAILURE(status) || (fRegionNames==nullptr)) { return nullptr; } diff --git a/deps/icu-small/source/i18n/region_impl.h b/deps/icu-small/source/i18n/region_impl.h index edabc6d0fe35..7fd0983e8efe 100644 --- a/deps/icu-small/source/i18n/region_impl.h +++ b/deps/icu-small/source/i18n/region_impl.h @@ -34,7 +34,7 @@ class RegionNameEnumeration : public StringEnumeration { virtual ~RegionNameEnumeration(); static UClassID U_EXPORT2 getStaticClassID(); virtual UClassID getDynamicClassID() const override; - virtual const UnicodeString* snext(UErrorCode& status) override; + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override; virtual void reset(UErrorCode& status) override; virtual int32_t count(UErrorCode& status) const override; private: diff --git a/deps/icu-small/source/i18n/rulebasedcollator.cpp b/deps/icu-small/source/i18n/rulebasedcollator.cpp index 3d91b3c592b8..7f64e9038c4a 100644 --- a/deps/icu-small/source/i18n/rulebasedcollator.cpp +++ b/deps/icu-small/source/i18n/rulebasedcollator.cpp @@ -665,8 +665,9 @@ RuleBasedCollator::setReorderCodes(const int32_t *reorderCodes, int32_t length, if(length == 1 && reorderCodes[0] == UCOL_REORDER_CODE_NONE) { length = 0; } - if(length == settings->reorderCodesLength && - uprv_memcmp(reorderCodes, settings->reorderCodes, length * 4) == 0) { + if (length == settings->reorderCodesLength && + (length == 0 || + uprv_memcmp(reorderCodes, settings->reorderCodes, length * 4) == 0)) { return; } const CollationSettings &defaultSettings = getDefaultSettings(); diff --git a/deps/icu-small/source/i18n/scriptset.cpp b/deps/icu-small/source/i18n/scriptset.cpp index 2bdb32d6fead..91801cfedef8 100644 --- a/deps/icu-small/source/i18n/scriptset.cpp +++ b/deps/icu-small/source/i18n/scriptset.cpp @@ -225,9 +225,8 @@ ScriptSet &ScriptSet::parseScripts(const UnicodeString &scriptString, UErrorCode } } if (oneScriptName.length() > 0) { - char buf[40]; + char buf[40] = {}; oneScriptName.extract(0, oneScriptName.length(), buf, sizeof(buf)-1, US_INV); - buf[sizeof(buf)-1] = 0; int32_t sc = u_getPropertyValueEnum(UCHAR_SCRIPT, buf); if (sc == UCHAR_INVALID_CODE) { status = U_ILLEGAL_ARGUMENT_ERROR; diff --git a/deps/icu-small/source/i18n/smpdtfmt.cpp b/deps/icu-small/source/i18n/smpdtfmt.cpp index 2549f0cd453d..de6d8b808ae8 100644 --- a/deps/icu-small/source/i18n/smpdtfmt.cpp +++ b/deps/icu-small/source/i18n/smpdtfmt.cpp @@ -56,6 +56,7 @@ #include "unicode/brkiter.h" #include "unicode/rbnf.h" #include "unicode/dtptngen.h" +#include "unicode/plurrule.h" #include "uresimp.h" #include "olsontz.h" #include "patternprops.h" @@ -80,6 +81,7 @@ #include "chnsecal.h" #include "dangical.h" #include "japancal.h" +#include "standardplural.h" #include #if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) @@ -236,6 +238,7 @@ static const int32_t gFieldRangeBias[] = { // offset the years within the current millennium down to 1-999 static const int32_t HEBREW_CAL_CUR_MILLENIUM_START_YEAR = 5000; static const int32_t HEBREW_CAL_CUR_MILLENIUM_END_YEAR = 6000; +static constexpr const char16_t HEBREW_CALENDAR_VALUE[] = u"hebr"; /** * Maximum range for detecting daylight offset of a time zone when parsed time zone @@ -338,6 +341,7 @@ SimpleDateFormat::~SimpleDateFormat() } delete fTimeZoneFormat; delete fSimpleNumberFormatter; + delete fOrdinalPluralRules; #if !UCONFIG_NO_BREAK_ITERATION delete fCapitalizationBrkIter; @@ -565,6 +569,12 @@ SimpleDateFormat& SimpleDateFormat::operator=(const SimpleDateFormat& other) fHasMinute = other.fHasMinute; fHasSecond = other.fHasSecond; + delete fOrdinalPluralRules; + fOrdinalPluralRules = nullptr; + if (other.fOrdinalPluralRules != nullptr) { + fOrdinalPluralRules = other.fOrdinalPluralRules->clone(); + } + fLocale = other.fLocale; // TimeZoneFormat can now be set independently via setter. @@ -1483,8 +1493,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const { - static const int32_t maxIntCount = 10; - static const UnicodeString hebr(u"hebr"); + static constexpr int32_t maxIntCount = 10; if (U_FAILURE(status)) { return; @@ -1565,7 +1574,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, //AD 12345 12345 45 12345 12345 12345 case UDAT_YEAR_FIELD: case UDAT_YEAR_WOY_FIELD: - if (fDateOverride.compare(hebr)==0 && value>HEBREW_CAL_CUR_MILLENIUM_START_YEAR && valueHEBREW_CAL_CUR_MILLENIUM_START_YEAR && value= 3 && value >= 1) { + UnicodeString dayStr; + // day of month name: First check if there's a "type" element for the current date and use it if there is + int32_t cardinalCount = 0; + const UnicodeString* cardinalNames = fSymbols->getDayOfMonthCardinalNames( + cardinalCount, DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED); + if (cardinalNames != nullptr && value >= 1 && value < cardinalCount && !cardinalNames[value].isEmpty()) { + dayStr += cardinalNames[value]; + } else { + // if there was no "type" element, look up the date's ordinal plural category and use the appropriate + // "ordinal" element if there is one, or the "other" element if there isn't (the "ordinal" strings + // are SimpleFormat patterns, where {0} gets filled in with the day number) + const UnicodeString* ordNames = fSymbols->getDayOfMonthOrdinalNames( + DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED); + if (ordNames != nullptr && fOrdinalPluralRules != nullptr) { + UnicodeString keyword = fOrdinalPluralRules->select(value); + StandardPlural::Form form = StandardPlural::orOtherFromString(keyword); + UnicodeString pattern = ordNames[(int32_t)form]; + if (pattern.isEmpty()) { + pattern = ordNames[(int32_t)StandardPlural::OTHER]; + } + if (!pattern.isEmpty()) { + UnicodeString dayNum; + zeroPaddingNumber(currentNumberFormat, dayNum, value, 1, maxIntCount); + SimpleFormatter(pattern, status).format(dayNum, dayStr, status); + } + } + } + // if we didn't find any relevant dayOfMonths resources, treat "ddd" the same as "d" + if (dayStr.isEmpty()) { + zeroPaddingNumber(currentNumberFormat, dayStr, value, 1, maxIntCount); + } + appendTo += dayStr; + } else { + // and, of course, handle "d" and "dd" the way we were before we added "ddd"... + zeroPaddingNumber(currentNumberFormat, appendTo, value, count, maxIntCount); + } + break; + // all of the other pattern symbols can be formatted as simple numbers with // appropriate zero padding default: @@ -3055,7 +3095,6 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, ch return -start; } UCalendarDateFields field = fgPatternIndexToCalendarField[patternCharIndex]; // UCAL_FIELD_COUNT if irrelevant - UnicodeString hebr("hebr", 4, US_INV); if (numericLeapMonthFormatter != nullptr) { numericLeapMonthFormatter->setFormats(reinterpret_cast(¤tNumberFormat), 1); @@ -3223,7 +3262,7 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, ch // we made adjustments to place the 2-digit year in the proper // century, for parsed strings from "00" to "99". Any other string // is treated literally: "2250", "-1", "1", "002". - if (fDateOverride.compare(hebr)==0 && value < 1000) { + if (fDateOverride == HEBREW_CALENDAR_VALUE && value < 1000) { value += HEBREW_CAL_CUR_MILLENIUM_START_YEAR; } else if (text.moveIndex32(start, 2) == pos.getIndex() && !isChineseCalendar && u_isdigit(text.char32At(start)) @@ -3263,7 +3302,7 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, ch case UDAT_YEAR_WOY_FIELD: // Comment is the same as for UDAT_Year_FIELDs - look above - if (fDateOverride.compare(hebr)==0 && value < 1000) { + if (fDateOverride == HEBREW_CALENDAR_VALUE && value < 1000) { value += HEBREW_CAL_CUR_MILLENIUM_START_YEAR; } else if (text.moveIndex32(start, 2) == pos.getIndex() && u_isdigit(text.char32At(start)) @@ -3823,6 +3862,63 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, ch return -start; } + case UDAT_DATE_FIELD: + if (count >= 3) { + // Try to match cardinal day-of-month names (e.g., 初一, 初二, ... for Chinese calendar) + int32_t cardinalCount = 0; + const UnicodeString* cardinalNames = fSymbols->getDayOfMonthCardinalNames( + cardinalCount, DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED); + if (cardinalNames != nullptr && cardinalCount > 0) { + int32_t newStart = matchString(text, start, UCAL_DATE, cardinalNames, cardinalCount, nullptr, cal); + if (newStart > 0) { + return newStart; + } + } + // Try to parse as ordinal: match prefix, parse number, match suffix + const UnicodeString* ordNames = fSymbols->getDayOfMonthOrdinalNames( + DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED); + if (ordNames != nullptr) { + for (int32_t i = 0; i < StandardPlural::COUNT; i++) { + if (ordNames[i].isEmpty()) { + continue; + } + int32_t placeholderPos = ordNames[i].indexOf(UnicodeString(u"{0}")); + if (placeholderPos < 0) { + continue; + } + UnicodeString prefix(ordNames[i], 0, placeholderPos); + UnicodeString suffix(ordNames[i], placeholderPos + 3); + // Match prefix + int32_t numStart = start; + if (prefix.length() > 0) { + int32_t prefixLen = matchStringWithOptionalDot(text, start, prefix); + if (prefixLen == 0) { + continue; + } + numStart = start + prefixLen; + } + // Parse number after prefix + ParsePosition numPos(numStart); + parseInt(text, number, numPos, allowNegative, currentNumberFormat); + if (numPos.getIndex() <= numStart) { + continue; + } + // Match suffix + int32_t numEnd = numPos.getIndex(); + int32_t suffixLen = 0; + if (suffix.length() > 0) { + suffixLen = matchStringWithOptionalDot(text, numEnd, suffix); + if (suffixLen == 0) { + continue; + } + } + cal.set(UCAL_DATE, number.getLong()); + return numEnd + suffixLen; + } + } + } + break; + default: // Handle "generic" fields // this is now handled below, outside the switch block @@ -4410,9 +4506,12 @@ void SimpleDateFormat::parsePattern() { fHasMinute = false; fHasSecond = false; fHasHanYearChar = false; + delete fOrdinalPluralRules; + fOrdinalPluralRules = nullptr; int len = fPattern.length(); UBool inQuote = false; + int32_t dCount = 0; for (int32_t i = 0; i < len; ++i) { char16_t ch = fPattern[i]; if (ch == QUOTE) { @@ -4428,6 +4527,15 @@ void SimpleDateFormat::parsePattern() { if (ch == 0x73) { // 0x73 == 's' fHasSecond = true; } + if (ch == 0x64) { // 'd' + dCount++; + if (dCount >= 3 && fOrdinalPluralRules == nullptr) { + UErrorCode localStatus = U_ZERO_ERROR; + fOrdinalPluralRules = PluralRules::forLocale(fLocale, UPLURAL_TYPE_ORDINAL, localStatus); + } + } else { + dCount = 0; + } } } } diff --git a/deps/icu-small/source/i18n/timezone.cpp b/deps/icu-small/source/i18n/timezone.cpp index 8028c4ecf5cb..20e72bf68e88 100644 --- a/deps/icu-small/source/i18n/timezone.cpp +++ b/deps/icu-small/source/i18n/timezone.cpp @@ -739,7 +739,9 @@ void TimeZone::getOffset(UDate date, UBool local, int32_t& rawOffset, static_cast(dow), millis, Grego::monthLength(year, month), ec) - rawOffset; - + if (U_FAILURE(ec)) { + return; + } // Recompute if local==true, dstOffset!=0. if (pass!=0 || !local || dstOffset == 0) { break; @@ -959,7 +961,7 @@ class TZEnumeration : public StringEnumeration { return U_FAILURE(status) ? 0 : len; } - virtual const UnicodeString* snext(UErrorCode& status) override { + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override { if (U_SUCCESS(status) && map != nullptr && pos < len) { getID(map[pos], status); ++pos; @@ -1564,7 +1566,9 @@ TimeZone::getCanonicalID(const UnicodeString& id, UnicodeString& canonicalID, UB } UnicodeString& -TimeZone::getIanaID(const UnicodeString& id, UnicodeString& ianaID, UErrorCode& status) +TimeZone::getIanaID(const UnicodeString& id, + UnicodeString& ianaID U_LIFETIME_BOUND, + UErrorCode& status) { ianaID.remove(); if (U_FAILURE(status)) { diff --git a/deps/icu-small/source/i18n/tmutfmt.cpp b/deps/icu-small/source/i18n/tmutfmt.cpp index f96ab4322647..20ee2bd28f2e 100644 --- a/deps/icu-small/source/i18n/tmutfmt.cpp +++ b/deps/icu-small/source/i18n/tmutfmt.cpp @@ -722,6 +722,10 @@ TimeUnitFormat::copyHash(const Hashtable* source, Hashtable* target, UErrorCode& const UHashTok valueTok = element->value; const MessageFormat** value = static_cast(valueTok.pointer); MessageFormat** newVal = static_cast(uprv_malloc(UTMUTFMT_FORMAT_STYLE_COUNT * sizeof(MessageFormat*))); + if (newVal == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } newVal[0] = value[0]->clone(); newVal[1] = value[1]->clone(); target->put(UnicodeString(*key), newVal, status); diff --git a/deps/icu-small/source/i18n/transreg.cpp b/deps/icu-small/source/i18n/transreg.cpp index 5f050f2e2bd3..d6e5d6a54a00 100644 --- a/deps/icu-small/source/i18n/transreg.cpp +++ b/deps/icu-small/source/i18n/transreg.cpp @@ -542,6 +542,7 @@ TransliteratorRegistry::TransliteratorRegistry(UErrorCode& status) : variantList.adoptElement(emptyString, status); } specDAG.setValueDeleter(uhash_deleteHashtable); + fBogus.setToBogus(); } TransliteratorRegistry::~TransliteratorRegistry() { @@ -754,13 +755,14 @@ const UnicodeString& TransliteratorRegistry::getAvailableID(int32_t index) const return *static_cast(e->key.pointer); } - // If the code reaches here, the hash table was likely modified during iteration. - // Return an statically initialized empty string due to reference return type. - static UnicodeString empty; - return empty; + // If the code reaches here, the hash table was likely modified during iteration, + // or the requested index is out of bounds. + // Return a bogus string due to reference return type, + // and inability to return a UErrorCode from this API. + return fBogus; } -StringEnumeration* TransliteratorRegistry::getAvailableIDs() const { +StringEnumeration* TransliteratorRegistry::getAvailableIDs() const U_LIFETIME_BOUND { return new Enumeration(*this); } @@ -867,7 +869,7 @@ UnicodeString& TransliteratorRegistry::getAvailableVariant(int32_t index, // class TransliteratorRegistry::Enumeration //---------------------------------------------------------------------- -TransliteratorRegistry::Enumeration::Enumeration(const TransliteratorRegistry& _reg) : +TransliteratorRegistry::Enumeration::Enumeration(const TransliteratorRegistry& _reg U_LIFETIME_BOUND) : pos(UHASH_FIRST), size(_reg.availableIDs.count()), reg(_reg) { } @@ -878,7 +880,7 @@ int32_t TransliteratorRegistry::Enumeration::count(UErrorCode& /*status*/) const return size; } -const UnicodeString* TransliteratorRegistry::Enumeration::snext(UErrorCode& status) { +const UnicodeString* TransliteratorRegistry::Enumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { // This is sloppy but safe -- if we get out of sync with the underlying // registry, we will still return legal strings, but they might not // correspond to the snapshot at construction time. So there could be diff --git a/deps/icu-small/source/i18n/transreg.h b/deps/icu-small/source/i18n/transreg.h index 3862be881d62..79c323d41b84 100644 --- a/deps/icu-small/source/i18n/transreg.h +++ b/deps/icu-small/source/i18n/transreg.h @@ -258,7 +258,7 @@ class TransliteratorRegistry : public UMemory { * with the system. * @internal */ - StringEnumeration* getAvailableIDs() const; + StringEnumeration* getAvailableIDs() const U_LIFETIME_BOUND; /** * == OBSOLETE - remove in ICU 3.4 == @@ -415,10 +415,10 @@ class TransliteratorRegistry : public UMemory { */ class Enumeration : public StringEnumeration { public: - Enumeration(const TransliteratorRegistry& reg); + Enumeration(const TransliteratorRegistry& reg U_LIFETIME_BOUND); virtual ~Enumeration(); virtual int32_t count(UErrorCode& status) const override; - virtual const UnicodeString* snext(UErrorCode& status) override; + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override; virtual void reset(UErrorCode& status) override; static UClassID U_EXPORT2 getStaticClassID(); virtual UClassID getDynamicClassID() const override; @@ -455,6 +455,8 @@ class TransliteratorRegistry : public UMemory { */ Hashtable availableIDs; + UnicodeString fBogus; + TransliteratorRegistry(const TransliteratorRegistry &other); // forbid copying of this class TransliteratorRegistry &operator=(const TransliteratorRegistry &other); // forbid copying of this class }; diff --git a/deps/icu-small/source/i18n/tzfmt.cpp b/deps/icu-small/source/i18n/tzfmt.cpp index aaec9f31c42e..2771581dbe4f 100644 --- a/deps/icu-small/source/i18n/tzfmt.cpp +++ b/deps/icu-small/source/i18n/tzfmt.cpp @@ -76,7 +76,7 @@ static const char16_t UNKNOWN_SHORT_ZONE_ID[] = {0x0075, 0x006E, 0x006B, 0}; / static const char16_t UNKNOWN_LOCATION[] = {0x0055, 0x006E, 0x006B, 0x006E, 0x006F, 0x0077, 0x006E, 0}; // Unknown static const char16_t DEFAULT_GMT_PATTERN[] = {0x0047, 0x004D, 0x0054, 0x007B, 0x0030, 0x007D, 0}; // GMT{0} -//static const char16_t DEFAULT_GMT_ZERO[] = {0x0047, 0x004D, 0x0054, 0}; // GMT +static const char16_t DEFAULT_GMT_ZERO[] = {0x0047, 0x004D, 0x0054, 0}; // GMT static const char16_t DEFAULT_GMT_POSITIVE_HM[] = {0x002B, 0x0048, 0x003A, 0x006D, 0x006D, 0}; // +H:mm static const char16_t DEFAULT_GMT_POSITIVE_HMS[] = {0x002B, 0x0048, 0x003A, 0x006D, 0x006D, 0x003A, 0x0073, 0x0073, 0}; // +H:mm:ss static const char16_t DEFAULT_GMT_NEGATIVE_HM[] = {0x002D, 0x0048, 0x003A, 0x006D, 0x006D, 0}; // -H:mm @@ -356,8 +356,14 @@ TimeZoneFormat::TimeZoneFormat(const Locale& locale, UErrorCode& status) gmtPattern = resStr; } resStr = ures_getStringByKeyWithFallback(zoneStringsArray, gGmtZeroFormatTag, &len, &status); - if (len > 0) { + if (U_SUCCESS(status) && len > 0) { fGMTZeroFormat.setTo(true, resStr, len); + } else { + // gmtZeroFormat may be absent in newer CLDR data; fall back to "GMT" + // (DEFAULT_GMT_ZERO was the original fallback, commented out in ICU-9292 + // as unused when the resource was always present in the data) + fGMTZeroFormat.setTo(true, DEFAULT_GMT_ZERO, -1); + status = U_ZERO_ERROR; } resStr = ures_getStringByKeyWithFallback(zoneStringsArray, gHourFormatTag, &len, &status); if (len > 0) { @@ -697,8 +703,8 @@ TimeZoneFormat::format(UTimeZoneFormatStyle style, const TimeZone& tz, UDate dat UErrorCode status = U_ZERO_ERROR; int32_t rawOffset, dstOffset; tz.getOffset(date, false, rawOffset, dstOffset, status); - int32_t offset = rawOffset + dstOffset; if (U_SUCCESS(status)) { + int32_t offset = rawOffset + dstOffset; switch (style) { case UTZFMT_STYLE_GENERIC_LOCATION: case UTZFMT_STYLE_GENERIC_LONG: diff --git a/deps/icu-small/source/i18n/tzgnames.cpp b/deps/icu-small/source/i18n/tzgnames.cpp index b513843208bb..1fa0381ad4a5 100644 --- a/deps/icu-small/source/i18n/tzgnames.cpp +++ b/deps/icu-small/source/i18n/tzgnames.cpp @@ -1173,9 +1173,11 @@ TimeZoneGenericNames::TimeZoneGenericNames() TimeZoneGenericNames::~TimeZoneGenericNames() { umtx_lock(&gTZGNLock); { - U_ASSERT(fRef->refCount > 0); - // Just decrement the reference count - fRef->refCount--; + if (fRef != nullptr) { + U_ASSERT(fRef->refCount > 0); + // Just decrement the reference count + fRef->refCount--; + } } umtx_unlock(&gTZGNLock); } diff --git a/deps/icu-small/source/i18n/tznames_impl.cpp b/deps/icu-small/source/i18n/tznames_impl.cpp index cbcfb98e849b..5aa465a90119 100644 --- a/deps/icu-small/source/i18n/tznames_impl.cpp +++ b/deps/icu-small/source/i18n/tznames_impl.cpp @@ -862,12 +862,12 @@ ZNames::ZNamesLoader::~ZNamesLoader() {} class MetaZoneIDsEnumeration : public StringEnumeration { public: MetaZoneIDsEnumeration(); - MetaZoneIDsEnumeration(const UVector& mzIDs); + MetaZoneIDsEnumeration(const UVector& mzIDs U_LIFETIME_BOUND); MetaZoneIDsEnumeration(LocalPointer mzIDs); virtual ~MetaZoneIDsEnumeration(); static UClassID U_EXPORT2 getStaticClassID(); virtual UClassID getDynamicClassID() const override; - virtual const UnicodeString* snext(UErrorCode& status) override; + virtual const UnicodeString* snext(UErrorCode& status) U_LIFETIME_BOUND override; virtual void reset(UErrorCode& status) override; virtual int32_t count(UErrorCode& status) const override; private: @@ -883,7 +883,7 @@ MetaZoneIDsEnumeration::MetaZoneIDsEnumeration() : fLen(0), fPos(0), fMetaZoneIDs(nullptr), fLocalVector(nullptr) { } -MetaZoneIDsEnumeration::MetaZoneIDsEnumeration(const UVector& mzIDs) +MetaZoneIDsEnumeration::MetaZoneIDsEnumeration(const UVector& mzIDs U_LIFETIME_BOUND) : fPos(0), fMetaZoneIDs(&mzIDs), fLocalVector(nullptr) { fLen = fMetaZoneIDs->size(); } @@ -897,7 +897,7 @@ MetaZoneIDsEnumeration::MetaZoneIDsEnumeration(LocalPointer mzIDs) } const UnicodeString* -MetaZoneIDsEnumeration::snext(UErrorCode& status) { +MetaZoneIDsEnumeration::snext(UErrorCode& status) U_LIFETIME_BOUND { if (U_SUCCESS(status) && fMetaZoneIDs != nullptr && fPos < fLen) { unistr.setTo(static_cast(fMetaZoneIDs->elementAt(fPos++)), -1); return &unistr; @@ -1695,17 +1695,10 @@ void TimeZoneNamesImpl::internalLoadAllDisplayNames(UErrorCode& status) { -static const char16_t gEtcPrefix[] = { 0x45, 0x74, 0x63, 0x2F }; // "Etc/" -static const int32_t gEtcPrefixLen = 4; -static const char16_t gSystemVPrefix[] = { 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x56, 0x2F }; // "SystemV/ -static const int32_t gSystemVPrefixLen = 8; -static const char16_t gRiyadh8[] = { 0x52, 0x69, 0x79, 0x61, 0x64, 0x68, 0x38 }; // "Riyadh8" -static const int32_t gRiyadh8Len = 7; - UnicodeString& U_EXPORT2 TimeZoneNamesImpl::getDefaultExemplarLocationName(const UnicodeString& tzID, UnicodeString& name) { - if (tzID.isEmpty() || tzID.startsWith(gEtcPrefix, gEtcPrefixLen) - || tzID.startsWith(gSystemVPrefix, gSystemVPrefixLen) || tzID.indexOf(gRiyadh8, gRiyadh8Len, 0) > 0) { + UnicodeString country; + if (tzID.isEmpty() || ZoneMeta::getCanonicalCountry(tzID, country).isEmpty()) { name.setToBogus(); return name; } diff --git a/deps/icu-small/source/i18n/ucln_in.h b/deps/icu-small/source/i18n/ucln_in.h index 722a1aaf5693..0bb557b2c5f9 100644 --- a/deps/icu-small/source/i18n/ucln_in.h +++ b/deps/icu-small/source/i18n/ucln_in.h @@ -65,6 +65,7 @@ typedef enum ECleanupI18NType { UCLN_I18N_NUMSYS, UCLN_I18N_MF2_UNISETS, UCLN_I18N_MF2_DATE_PARSERS, + UCLN_I18N_MF2_REGISTRY, UCLN_I18N_COUNT /* This must be last */ } ECleanupI18NType; diff --git a/deps/icu-small/source/i18n/ucol_sit.cpp b/deps/icu-small/source/i18n/ucol_sit.cpp index f8fa02fad719..bca901c08432 100644 --- a/deps/icu-small/source/i18n/ucol_sit.cpp +++ b/deps/icu-small/source/i18n/ucol_sit.cpp @@ -578,7 +578,10 @@ ucol_normalizeShortDefinitionString(const char *definition, if(U_FAILURE(*status)) { return 0; } - + if(!destination && capacity != 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } if(destination) { uprv_memset(destination, 0, capacity*sizeof(char)); } diff --git a/deps/icu-small/source/i18n/ucsdet.cpp b/deps/icu-small/source/i18n/ucsdet.cpp index c3f6737feeed..d90f0aea26b2 100644 --- a/deps/icu-small/source/i18n/ucsdet.cpp +++ b/deps/icu-small/source/i18n/ucsdet.cpp @@ -109,7 +109,7 @@ ucsdet_setDeclaredEncoding(UCharsetDetector *ucsd, const char *encoding, int32_t return; } - ((CharsetDetector *) ucsd)->setDeclaredEncoding(encoding,length); + ((CharsetDetector *) ucsd)->setDeclaredEncoding(encoding,length, *status); } U_CAPI const UCharsetMatch** diff --git a/deps/icu-small/source/i18n/udat.cpp b/deps/icu-small/source/i18n/udat.cpp index 6f9cc95299e1..756b1759c4bb 100644 --- a/deps/icu-small/source/i18n/udat.cpp +++ b/deps/icu-small/source/i18n/udat.cpp @@ -128,7 +128,16 @@ udat_unregisterOpener(UDateFormatOpener opener, UErrorCode *status) return oldOpener; } +namespace { +UBool isValidStyle(int32_t style) { + return (style >= UDAT_FULL && style <= UDAT_SHORT) || + (style >= UDAT_FULL_RELATIVE && style <= UDAT_SHORT_RELATIVE) || + style == UDAT_NONE || + style == UDAT_PATTERN; +} + +} // namespace U_CAPI UDateFormat* U_EXPORT2 udat_open(UDateFormatStyle timeStyle, @@ -138,12 +147,19 @@ udat_open(UDateFormatStyle timeStyle, int32_t tzIDLength, const char16_t *pattern, int32_t patternLength, - UErrorCode *status) + UErrorCode *status) UPRV_NO_SANITIZE_UNDEFINED { DateFormat *fmt; if(U_FAILURE(*status)) { return nullptr; } + int32_t timeStyleInt = timeStyle; + int32_t dateStyleInt = dateStyle; + + if (!isValidStyle(timeStyleInt) || !isValidStyle(dateStyleInt)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } if(gOpener!=nullptr) { // if it's registered fmt = (DateFormat*) (*gOpener)(timeStyle,dateStyle,locale,tzID,tzIDLength,pattern,patternLength,status); if(fmt!=nullptr) { @@ -1283,7 +1299,7 @@ udat_setSymbols( UDateFormat *format, default: *status = U_UNSUPPORTED_ERROR; break; - + } } diff --git a/deps/icu-small/source/i18n/udatpg.cpp b/deps/icu-small/source/i18n/udatpg.cpp index 666dfba0aeda..e183023202b2 100644 --- a/deps/icu-small/source/i18n/udatpg.cpp +++ b/deps/icu-small/source/i18n/udatpg.cpp @@ -248,7 +248,7 @@ udatpg_getDateTimeFormatForStyle(const UDateTimePatternGenerator *udtpg, } // Note: The UnicodeString for the dateTimeFormat string in the DateTimePatternGenerator // was NUL-terminated what it was set, to avoid doing it here which could re-allocate - // the buffe and affect and cont references to the string or its buffer. + // the buffer and affect const references to the string or its buffer. return result.getBuffer(); } diff --git a/deps/icu-small/source/i18n/uitercollationiterator.cpp b/deps/icu-small/source/i18n/uitercollationiterator.cpp index e0d91514852c..17e8184d6fb6 100644 --- a/deps/icu-small/source/i18n/uitercollationiterator.cpp +++ b/deps/icu-small/source/i18n/uitercollationiterator.cpp @@ -215,7 +215,8 @@ FCDUIterCollationIterator::previousCodePoint(UErrorCode &errorCode) { if(CollationFCD::hasLccc(c)) { UChar32 prev = U_SENTINEL; if(CollationFCD::maybeTibetanCompositeVowel(c) || - CollationFCD::hasTccc(prev = iter.previous(&iter))) { + U16_IS_TRAIL(prev = iter.previous(&iter)) || + CollationFCD::hasTccc(prev)) { iter.next(&iter); if(prev >= 0) { iter.next(&iter); diff --git a/deps/icu-small/source/i18n/unicode/calendar.h b/deps/icu-small/source/i18n/unicode/calendar.h index dfcdd3fe620d..aa151254d1c8 100644 --- a/deps/icu-small/source/i18n/unicode/calendar.h +++ b/deps/icu-small/source/i18n/unicode/calendar.h @@ -1922,7 +1922,6 @@ class U_I18N_API_CLASS Calendar : public UObject { * Set the current time without affecting flags or fields. * * @param time The time to be set - * @return the current time without recomputing. * @stable ICU 2.0 */ U_I18N_API void internalSetTime(UDate time) { fTime = time; } diff --git a/deps/icu-small/source/i18n/unicode/coleitr.h b/deps/icu-small/source/i18n/unicode/coleitr.h index a147d6cfba14..eb65ae420c1b 100644 --- a/deps/icu-small/source/i18n/unicode/coleitr.h +++ b/deps/icu-small/source/i18n/unicode/coleitr.h @@ -269,7 +269,6 @@ class U_I18N_API CollationElementIterator final : public UObject { * Sets the offset of the currently processed character in the source string. * @param newOffset the new offset. * @param status the error code status. - * @return the offset of the character. * @stable ICU 2.0 */ void setOffset(int32_t newOffset, UErrorCode& status); diff --git a/deps/icu-small/source/i18n/unicode/curramt.h b/deps/icu-small/source/i18n/unicode/curramt.h index e0f6aa13dd2a..7a2c735affef 100644 --- a/deps/icu-small/source/i18n/unicode/curramt.h +++ b/deps/icu-small/source/i18n/unicode/curramt.h @@ -74,7 +74,7 @@ class U_I18N_API CurrencyAmount: public Measure { * Assignment operator * @stable ICU 3.0 */ - CurrencyAmount& operator=(const CurrencyAmount& other); + CurrencyAmount& operator=(const CurrencyAmount& other) U_LIFETIME_BOUND; /** * Return a polymorphic clone of this object. The result will @@ -111,16 +111,16 @@ class U_I18N_API CurrencyAmount: public Measure { * Return the currency unit object of this object. * @stable ICU 3.0 */ - const CurrencyUnit& getCurrency() const; + const CurrencyUnit& getCurrency() const U_LIFETIME_BOUND; /** * Return the ISO currency code of this object. * @stable ICU 3.0 */ - inline const char16_t* getISOCurrency() const; + inline const char16_t* getISOCurrency() const U_LIFETIME_BOUND; }; -inline const char16_t* CurrencyAmount::getISOCurrency() const { +inline const char16_t* CurrencyAmount::getISOCurrency() const U_LIFETIME_BOUND { return getCurrency().getISOCurrency(); } diff --git a/deps/icu-small/source/i18n/unicode/currunit.h b/deps/icu-small/source/i18n/unicode/currunit.h index 3b367b052bd2..1aca347f011c 100644 --- a/deps/icu-small/source/i18n/unicode/currunit.h +++ b/deps/icu-small/source/i18n/unicode/currunit.h @@ -87,7 +87,7 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { * Assignment operator * @stable ICU 3.0 */ - CurrencyUnit& operator=(const CurrencyUnit& other); + CurrencyUnit& operator=(const CurrencyUnit& other) U_LIFETIME_BOUND; /** * Return a polymorphic clone of this object. The result will @@ -124,7 +124,7 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { * Return the ISO currency code of this object. * @stable ICU 3.0 */ - inline const char16_t* getISOCurrency() const; + inline const char16_t* getISOCurrency() const U_LIFETIME_BOUND; private: /** @@ -133,7 +133,7 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { char16_t isoCode[4]; }; -inline const char16_t* CurrencyUnit::getISOCurrency() const { +inline const char16_t* CurrencyUnit::getISOCurrency() const U_LIFETIME_BOUND { return isoCode; } diff --git a/deps/icu-small/source/i18n/unicode/dtfmtsym.h b/deps/icu-small/source/i18n/unicode/dtfmtsym.h index 23983f5758d8..fbff7c995368 100644 --- a/deps/icu-small/source/i18n/unicode/dtfmtsym.h +++ b/deps/icu-small/source/i18n/unicode/dtfmtsym.h @@ -459,6 +459,40 @@ class U_I18N_API_CLASS DateFormatSymbols final : public UObject { DtWidthType width); #endif /* U_HIDE_DRAFT_API */ +#ifndef U_HIDE_INTERNAL_API + /** + * Gets day-of-month ordinal name format patterns by width and context. + * The returned array is indexed by StandardPlural::Form (see standardplural.h); + * its length is always StandardPlural::COUNT. An empty entry means no data for that + * plural category. Currently only FORMAT context and ABBREVIATED width are + * supported; other combinations return nullptr. + * @param context The formatting context. Currently only FORMAT is supported. + * @param width The width. Currently only ABBREVIATED is supported. + * @return the day-of-month ordinal name strings, or nullptr if not available. + * (DateFormatSymbols retains ownership.) + * @internal + */ + U_I18N_API const UnicodeString* getDayOfMonthOrdinalNames(DtContextType context, + DtWidthType width) const; + + /** + * Gets day-of-month cardinal name strings by width and context. + * The returned array has length 33 and is indexed by day-of-month (1-32); + * index 0 is unused. An empty entry means no cardinal override for + * that day number. Currently only FORMAT context and ABBREVIATED width are + * supported; other combinations return nullptr. + * @param count Filled in with the length of the array (33). + * @param context The formatting context. Currently only FORMAT is supported. + * @param width The width. Currently only ABBREVIATED is supported. + * @return the day-of-month cardinal strings, or nullptr if not available. + * (DateFormatSymbols retains ownership.) + * @internal + */ + U_I18N_API const UnicodeString* getDayOfMonthCardinalNames(int32_t& count, + DtContextType context, + DtWidthType width) const; +#endif /* U_HIDE_INTERNAL_API */ + #ifndef U_HIDE_INTERNAL_API /** * This default time separator is used for formatting when the locale @@ -966,6 +1000,20 @@ class U_I18N_API_CLASS DateFormatSymbols final : public UObject { UnicodeString *fStandaloneNarrowDayPeriods; int32_t fStandaloneNarrowDayPeriodsCount; + /** + * Day-of-month ordinal name format patterns; format/abbreviated. + * Indexed by StandardPlural::Form; always StandardPlural::COUNT entries when non-null. + */ + UnicodeString *fDayOfMonthOrdinalNames = nullptr; + + /** + * Day-of-month cardinal name strings; format/abbreviated. + * Indexed by day number 1-32; length is 33 (index 0 unused). + * An empty entry means no cardinal override for that day number. + */ + UnicodeString *fDayOfMonthCardinalNames = nullptr; + int32_t fDayOfMonthCardinalNamesCount = 0; + private: /** valid/actual locale information * these are always ICU locales, so the length should not be a problem diff --git a/deps/icu-small/source/i18n/unicode/dtitvfmt.h b/deps/icu-small/source/i18n/unicode/dtitvfmt.h index 654aba668f21..a12d950e0058 100644 --- a/deps/icu-small/source/i18n/unicode/dtitvfmt.h +++ b/deps/icu-small/source/i18n/unicode/dtitvfmt.h @@ -569,9 +569,6 @@ class U_I18N_API_CLASS DateIntervalFormat : public Format { * If parse fails, return contents are undefined. * @param parse_pos The position to start parsing at. Since no parsing * is supported, upon return this param is unchanged. - * @return A newly created Formattable* object, or nullptr - * on failure. The caller owns this and should - * delete it when done. * @internal ICU 4.0 */ U_I18N_API virtual void parseObject(const UnicodeString& source, diff --git a/deps/icu-small/source/i18n/unicode/dtptngen.h b/deps/icu-small/source/i18n/unicode/dtptngen.h index f73450e1100a..a5998469dc63 100644 --- a/deps/icu-small/source/i18n/unicode/dtptngen.h +++ b/deps/icu-small/source/i18n/unicode/dtptngen.h @@ -606,17 +606,17 @@ class U_I18N_API_CLASS DateTimePatternGenerator : public UObject { UnicodeString fieldDisplayNames[UDATPG_FIELD_COUNT][UDATPG_WIDTH_COUNT]; UnicodeString dateTimeFormat[4]; UnicodeString decimal; - DateTimeMatcher *skipMatcher; - Hashtable *fAvailableFormatKeyHash; + DateTimeMatcher *skipMatcher { }; + Hashtable *fAvailableFormatKeyHash { }; UnicodeString emptyString; - char16_t fDefaultHourFormatChar; + char16_t fDefaultHourFormatChar { }; int32_t fAllowedHourFormats[7]; // Actually an array of AllowedHourFormat enum type, ending with UNKNOWN. // Internal error code used for recording/reporting errors that occur during methods that do not // have a UErrorCode parameter. For example: the Copy Constructor, or the ::clone() method. // When this is set to an error the object is in an invalid state. - UErrorCode internalErrorCode; + UErrorCode internalErrorCode { U_ZERO_ERROR }; /* internal flags masks for adjustFieldTypes etc. */ enum { diff --git a/deps/icu-small/source/i18n/unicode/measunit.h b/deps/icu-small/source/i18n/unicode/measunit.h index b5f3a2986f74..16ad6faaab9b 100644 --- a/deps/icu-small/source/i18n/unicode/measunit.h +++ b/deps/icu-small/source/i18n/unicode/measunit.h @@ -551,8 +551,6 @@ class U_I18N_API MeasureUnit: public UObject { */ UMeasurePrefix getPrefix(UErrorCode& status) const; -#ifndef U_HIDE_DRAFT_API - /** * Creates a new MeasureUnit with a specified constant denominator. * @@ -565,7 +563,7 @@ class U_I18N_API MeasureUnit: public UObject { * @param denominator The constant denominator to set. * @param status Set if this is not a COMPOUND or SINGLE unit or if another error occurs. * @return A new MeasureUnit with the specified constant denominator. - * @draft ICU 77 + * @stable ICU 77 */ MeasureUnit withConstantDenominator(uint64_t denominator, UErrorCode &status) const; @@ -583,12 +581,10 @@ class U_I18N_API MeasureUnit: public UObject { * * @param status Set if this is not a COMPOUND or SINGLE unit or if another error occurs. * @return The value of the constant denominator. - * @draft ICU 77 + * @stable ICU 77 */ uint64_t getConstantDenominator(UErrorCode &status) const; -#endif /* U_HIDE_DRAFT_API */ - /** * Creates a MeasureUnit which is this SINGLE unit augmented with the specified dimensionality * (power). For example, if dimensionality is 2, the unit will be squared. @@ -720,6 +716,22 @@ class U_I18N_API MeasureUnit: public UObject { */ static StringEnumeration* getAvailableTypes(UErrorCode &errorCode); +#ifndef U_HIDE_INTERNAL_API + /** + * Validates that a specific type and subtype combination exists and retrieve the unit. + * + *

Note: This is more efficient than calling getAvailable() when you only need + * to validate and retrieve a single unit. + * + * @param type the unit type (e.g., "length", "mass", "volume") + * @param subtype the unit subtype (e.g., "meter", "kilogram", "liter") + * @param result if the unit is valid, this will be set to the MeasureUnit + * @return true if the type/subtype combination is valid, false otherwise + * @internal + */ + static bool validateAndGet(StringPiece type, StringPiece subtype, MeasureUnit &result); +#endif /* U_HIDE_INTERNAL_API */ + /** * Return the class ID for this class. This is useful only for comparing to * a return value from getDynamicClassID(). For example: @@ -2283,6 +2295,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getThermUs(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of force: dyne. + * Caller owns returned value and must free it. + * Also see {@link #getDyne()}. + * @param status ICU error code. + * @draft ICU 79 + */ + static MeasureUnit *createDyne(UErrorCode &status); + + /** + * Returns by value, unit of force: dyne. + * Also see {@link #createDyne()}. + * @draft ICU 79 + */ + static MeasureUnit getDyne(); +#endif /* U_HIDE_DRAFT_API */ + #ifndef U_HIDE_DRAFT_API /** * Returns by pointer, unit of force: kilogram-force. @@ -2349,6 +2379,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getPoundForce(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of force: poundal. + * Caller owns returned value and must free it. + * Also see {@link #getPoundal()}. + * @param status ICU error code. + * @draft ICU 79 + */ + static MeasureUnit *createPoundal(UErrorCode &status); + + /** + * Returns by value, unit of force: poundal. + * Also see {@link #createPoundal()}. + * @draft ICU 79 + */ + static MeasureUnit getPoundal(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of frequency: gigahertz. * Caller owns returned value and must free it. @@ -2819,6 +2867,24 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit getMileScandinavian(); +#ifndef U_HIDE_DRAFT_API + /** + * Returns by pointer, unit of length: milliinch. + * Caller owns returned value and must free it. + * Also see {@link #getMilliinch()}. + * @param status ICU error code. + * @draft ICU 79 + */ + static MeasureUnit *createMilliinch(UErrorCode &status); + + /** + * Returns by value, unit of length: milliinch. + * Also see {@link #createMilliinch()}. + * @draft ICU 79 + */ + static MeasureUnit getMilliinch(); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns by pointer, unit of length: millimeter. * Caller owns returned value and must free it. diff --git a/deps/icu-small/source/i18n/unicode/messageformat2.h b/deps/icu-small/source/i18n/unicode/messageformat2.h index f98e591fad3f..70b0d55ae1e3 100644 --- a/deps/icu-small/source/i18n/unicode/messageformat2.h +++ b/deps/icu-small/source/i18n/unicode/messageformat2.h @@ -35,6 +35,7 @@ namespace message2 { class MessageContext; class StaticErrors; class InternalValue; + class BaseValue; /** *

MessageFormatter is a Technical Preview API implementing MessageFormat 2.0. @@ -75,6 +76,11 @@ namespace message2 { * Formats the message to a string, using the data model that was previously set or parsed, * and the given `arguments` object. * + * This method is non-const due to the function registry being non-const, + * which is in turn due to the values (`Function` objects in the map) having mutable state. + * In other words, formatting a message can mutate the underlying `MessageFormatter` by changing + * state within the objects that represent custom functions. + * * @param arguments Reference to message arguments * @param status Input/output error code used to indicate syntax errors, data model * errors, resolution errors, formatting errors, selection errors, as well @@ -167,6 +173,38 @@ namespace message2 { U_MF_STRICT } UMFErrorHandlingBehavior; + /** + * Used in conjunction with the + * MessageFormatter::Builder::setBidiContext() method. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + typedef enum UMFBidiContext { + /** + * Denotes a left-to-right message. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_CONTEXT_LTR = 0, + /** + * Denotes a right-to-left message. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_CONTEXT_RTL, + /** + * Indicates that the message directionality should be + * inferred from the locale. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_MF_BIDI_CONTEXT_AUTO, + U_MF_BIDI_CONTEXT_DEFAULT = U_MF_BIDI_CONTEXT_AUTO + } UMFBidiContext; /** * The mutable Builder class allows each part of the MessageFormatter to be initialized * separately; calling its `build()` method yields an immutable MessageFormatter. @@ -196,6 +234,12 @@ namespace message2 { const MFFunctionRegistry* customMFFunctionRegistry; // Error behavior; see comment in `MessageFormatter` class bool signalErrors = false; + // Bidi isolation strategy + UMFBidiIsolationStrategy bidiIsolationStrategy = U_MF_BIDI_DEFAULT; + // Message directionality + MessageFormatter::UMFBidiContext msgdir = U_MF_BIDI_CONTEXT_DEFAULT; + // Bidi isolation style + UMFBidiIsolationStyle bidiStyle = U_MF_BIDI_STYLE_DEFAULT; void clearState(); public: @@ -235,6 +279,8 @@ namespace message2 { * and the caller must ensure its lifetime contains * the lifetime of the `MessageFormatter` object built by this * builder. + * Functions with the same name as standard functions will + * override the standard functions. * @return A reference to the builder. * * @internal ICU 75 technology preview @@ -281,6 +327,62 @@ namespace message2 { * @deprecated This API is for technology preview only. */ U_I18N_API Builder& setErrorHandlingBehavior(UMFErrorHandlingBehavior type); + /** + * Set the bidi isolation behavior for this formatter. + * + * "OFF" means that no bidi isolation will be performed. + * "AUTO" means that the default bidi isolation strategy + * as described in the MF2 specification + * ( https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#handling-bidirectional-text ) + * will be applied. + * + * @param strategy An enum with type UMFBidiIsolationStrategy; + * that specifies how bidi isolation marks are inserted into + * the formatting result. The default is U_MF_BIDI_AUTO. + * + * @return A reference to the builder. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Builder& setBidiIsolationStrategy(UMFBidiIsolationStrategy strategy); + /** + * Set the bidi isolation style for this formatter. + * + * "CONTROL" means that bidi control characters will be inserted into + * the formatted result. + * "HTML_SPAN" means that HTML markup will be inserted into + * the formatted result. + * + * @param style An enum with type UMFBidiIsolationStyle + * that specifies how bidi isolation is applied to + * the formatting result. The default is + * U_MF_BIDI_STYLE_CONTROL. + * + * @return A reference to the builder. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Builder& setBidiIsolationStyle(UMFBidiIsolationStyle style); + /** + * Set the directionality context of the input message. + * + * "LTR" means left-to-right and "RTL" means right-to-left. + * "AUTO" means to infer the context from the locale + * (either what was set with setLocale(), or the default locale + * if setLocale() was never called on the builder.) + * + * @param dir An enum with type UMFBidiContext + * that specifies the directionality of the message. + * The default is U_MF_BIDI_CONTEXT_AUTO.. + * + * @return A reference to the builder. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API Builder& setBidiContext(UMFBidiContext dir); /** * Constructs a new immutable MessageFormatter using the pattern or data model * that was previously set, and the locale (if it was previously set) @@ -317,14 +419,12 @@ namespace message2 { U_I18N_API virtual ~Builder(); }; // class MessageFormatter::Builder - // TODO: Shouldn't be public; only used for testing /** * Returns a string consisting of the input with optional spaces removed. * * @return A normalized string representation of the input * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. + * @internal ICU 75: This API is ICU internal only. */ U_I18N_API const UnicodeString& getNormalizedPattern() const { return normalizedInput; } @@ -344,49 +444,34 @@ namespace message2 { // Selection methods // Takes a vector of FormattedPlaceholders - void resolveSelectors(MessageContext&, const Environment& env, UErrorCode&, UVector&) const; + void resolveSelectors(MessageContext&, Environment& env, UErrorCode&, UVector&) const; // Takes a vector of vectors of strings (input) and a vector of PrioritizedVariants (output) void filterVariants(const UVector&, UVector&, UErrorCode&) const; // Takes a vector of vectors of strings (input) and a vector of PrioritizedVariants (input/output) void sortVariants(const UVector&, UVector&, UErrorCode&) const; // Takes a vector of strings (input) and a vector of strings (output) - void matchSelectorKeys(const UVector&, MessageContext&, InternalValue* rv, UVector&, UErrorCode&) const; + void matchSelectorKeys(const UVector&, MessageContext&, InternalValue&& rv, UVector&, UErrorCode&) const; // Takes a vector of FormattedPlaceholders (input), // and a vector of vectors of strings (output) void resolvePreferences(MessageContext&, UVector&, UVector&, UErrorCode&) const; - // Formatting methods + bool checkSelectOption(const FunctionValue&) const; - [[nodiscard]] FormattedPlaceholder formatLiteral(const UnicodeString&, const data_model::Literal&) const; - void formatPattern(MessageContext&, const Environment&, const data_model::Pattern&, UErrorCode&, UnicodeString&) const; - // Evaluates a function call - // Dispatches on argument type - [[nodiscard]] InternalValue* evalFunctionCall(FormattedPlaceholder&& argument, - MessageContext& context, - UErrorCode& status) const; - // Dispatches on function name - [[nodiscard]] InternalValue* evalFunctionCall(const FunctionName& functionName, - InternalValue* argument, - FunctionOptions&& options, - MessageContext& context, - UErrorCode& status) const; - // Formats an expression that appears in a pattern or as the definition of a local variable - [[nodiscard]] InternalValue* formatExpression(const UnicodeString&, - const Environment&, - const data_model::Expression&, - MessageContext&, - UErrorCode&) const; - [[nodiscard]] FunctionOptions resolveOptions(const Environment& env, const OptionMap&, MessageContext&, UErrorCode&) const; - [[nodiscard]] InternalValue* formatOperand(const UnicodeString&, - const Environment&, - const data_model::Operand&, - MessageContext&, - UErrorCode&) const; - [[nodiscard]] FormattedPlaceholder evalArgument(const UnicodeString&, - const data_model::VariableName&, - MessageContext&, - UErrorCode&) const; - void formatSelectors(MessageContext& context, const Environment& env, UErrorCode &status, UnicodeString& result) const; + // Formatting methods + [[nodiscard]] InternalValue evalLiteral(const UnicodeString&, const data_model::Literal&, UErrorCode&) const; + [[nodiscard]] UnicodeString& bidiIsolate(UMFBidiOption, UMFDirectionality, UnicodeString&) const; + void formatPattern(MessageContext&, Environment&, const data_model::Pattern&, UErrorCode&, UnicodeString&) const; + FunctionContext makeFunctionContext(const FunctionOptions&, const FunctionName&) const; + [[nodiscard]] InternalValue& apply(Environment&, const FunctionName&, InternalValue&, FunctionOptions&&, + MessageContext&, UErrorCode&) const; + [[nodiscard]] InternalValue& evalExpression(const UnicodeString&, Environment&, const data_model::Expression&, MessageContext&, UErrorCode&) const; + [[nodiscard]] FunctionOptions resolveOptions(Environment& env, const OptionMap&, MessageContext&, UErrorCode&) const; + [[nodiscard]] InternalValue& evalOperand(const UnicodeString&, Environment&, const data_model::Operand&, MessageContext&, UErrorCode&) const; + bool operandToStringWithBadOptionError(MessageContext&, Environment&, const Operand&, UnicodeString&, UErrorCode&) const; + void validateUOptionsOnMarkup(MessageContext&, Environment&, const Markup&, UErrorCode&) const; + [[nodiscard]] InternalValue& evalVariableReference(const UnicodeString&, Environment&, const data_model::VariableName&, MessageContext&, UErrorCode&) const; + [[nodiscard]] InternalValue evalArgument(const UnicodeString&, const data_model::VariableName&, MessageContext&, UErrorCode&) const; + void formatSelectors(MessageContext& context, Environment& env, UErrorCode &status, UnicodeString& result) const; // Function registry methods bool hasCustomMFFunctionRegistry() const { @@ -398,18 +483,11 @@ namespace message2 { // (a FormatterFactory can have mutable state) const MFFunctionRegistry& getCustomMFFunctionRegistry() const; - bool isCustomFormatter(const FunctionName&) const; - FormatterFactory* lookupFormatterFactory(const FunctionName&, UErrorCode& status) const; - bool isBuiltInSelector(const FunctionName&) const; - bool isBuiltInFormatter(const FunctionName&) const; - bool isCustomSelector(const FunctionName&) const; - const SelectorFactory* lookupSelectorFactory(MessageContext&, const FunctionName&, UErrorCode&) const; - bool isSelector(const FunctionName& fn) const { return isBuiltInSelector(fn) || isCustomSelector(fn); } - bool isFormatter(const FunctionName& fn) const { return isBuiltInFormatter(fn) || isCustomFormatter(fn); } - const Formatter* lookupFormatter(const FunctionName&, UErrorCode&) const; - - Selector* getSelector(MessageContext&, const FunctionName&, UErrorCode&) const; - Formatter* getFormatter(const FunctionName&, UErrorCode&) const; + bool isCustomFunction(const FunctionName&) const; + bool isBuiltInFunction(const FunctionName&) const; + bool isFunction(const FunctionName& fn) const { return isBuiltInFunction(fn) || isCustomFunction(fn); } + void setNotSelectableError(MessageContext&, const InternalValue&, UErrorCode&) const; + const Function* lookupFunction(const FunctionName&, UErrorCode&) const; bool getDefaultFormatterNameByType(const UnicodeString&, FunctionName&) const; // Checking for resolution errors @@ -426,7 +504,7 @@ namespace message2 { /* const */ Locale locale; // Registry for built-in functions - MFFunctionRegistry standardMFFunctionRegistry; + const MFFunctionRegistry *standardMFFunctionRegistry; // Registry for custom functions; may be null if no custom registry supplied // Note: this is *not* owned by the MessageFormatter object // The reason for this choice is to have a non-destructive MessageFormatter::Builder, @@ -460,6 +538,16 @@ namespace message2 { // The default is false. bool signalErrors = false; + // Bidi isolation strategy. + UMFBidiIsolationStrategy bidiIsolationStrategy = U_MF_BIDI_DEFAULT; + + // Message directionality + // Inferred from locale by default + UMFDirectionality msgdir = U_MF_DIRECTIONALITY_DEFAULT; + + // Bidi isolation style + UMFBidiIsolationStyle bidiIsolationStyle = U_MF_BIDI_STYLE_DEFAULT; + }; // class MessageFormatter } // namespace message2 diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h b/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h index 27bff7284360..9e4af2afc2f3 100644 --- a/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h +++ b/deps/icu-small/source/i18n/unicode/messageformat2_data_model.h @@ -743,6 +743,7 @@ namespace message2 { virtual ~Builder(); }; // class OptionMap::Builder private: + friend class message2::MessageFormatter; friend class message2::Serializer; bool bogus = false; @@ -1134,6 +1135,7 @@ namespace message2 { private: friend class Builder; + friend class message2::MessageFormatter; friend class message2::Serializer; UMarkupType type; @@ -1935,7 +1937,7 @@ namespace message2 { * * @return True if this binding represents a variable and expression; * false if it represents a variable plus an annotation. - * @internal ICU 78 technology preview + * @internal ICU 79 technology preview * @deprecated This API is for technology preview only. */ UBool isLocal() const { return local; } @@ -2407,6 +2409,10 @@ namespace message2 { U_NAMESPACE_END +#if defined(U_REAL_MSVC) +#pragma warning(pop) +#endif + #endif // U_HIDE_DEPRECATED_API #endif /* #if !UCONFIG_NO_MF2 */ diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_formattable.h b/deps/icu-small/source/i18n/unicode/messageformat2_formattable.h index 9311bd07bcc1..9ce694ac2652 100644 --- a/deps/icu-small/source/i18n/unicode/messageformat2_formattable.h +++ b/deps/icu-small/source/i18n/unicode/messageformat2_formattable.h @@ -31,10 +31,6 @@ class UVector; namespace message2 { - class Formatter; - class MessageContext; - class Selector; - // Formattable // ---------- @@ -46,7 +42,7 @@ namespace message2 { * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - class U_I18N_API FormattableObject : public UObject { + class U_I18N_API_CLASS FormattableObject : public UObject { public: /** * Returns an arbitrary string representing the type of this object. @@ -57,14 +53,14 @@ namespace message2 { * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - virtual const UnicodeString& tag() const = 0; + U_I18N_API virtual const UnicodeString& tag() const = 0; /** * Destructor. * * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - virtual ~FormattableObject(); + U_I18N_API virtual ~FormattableObject(); }; // class FormattableObject /** @@ -72,14 +68,14 @@ namespace message2 { * format a date with a time zone. It includes an absolute date and a time zone name, * as well as a calendar name. The calendar name is not currently used. * - * @internal ICU 78 technology preview + * @internal ICU 79 technology preview * @deprecated This API is for technology preview only. */ struct U_I18N_API DateInfo { /** * Date in UTC * - * @internal ICU 78 technology preview + * @internal ICU 79 technology preview * @deprecated This API is for technology preview only. */ UDate date; @@ -89,7 +85,7 @@ namespace message2 { * (its offset is added to/subtracted from the datestamp in order to * produce the formatted date). * - * @internal ICU 78 technology preview + * @internal ICU 79 technology preview * @deprecated This API is for technology preview only. */ UnicodeString zoneId; @@ -279,8 +275,12 @@ namespace message2 { // Can't return a reference since FormattableObject // is an abstract class if (getType() == UFMT_OBJECT) { - return *std::get_if(&contents); - // TODO: should assert that if type is object, object is non-null + auto result = std::get_if(&contents); + // It would be better to U_ASSERT(result != nullptr) here, but + // this is a public header file so we can't include uassert.h + if (result != nullptr) { + return *result; + } } status = U_ILLEGAL_ARGUMENT_ERROR; } @@ -438,37 +438,36 @@ namespace message2 { * a single named function option. It pairs the given name with the `Formattable` * value resulting from evaluating the option's value. * - * `ResolvedFunctionOption` is immutable and is not copyable or movable. + * `ResolvedFunctionOption` is immutable, movable, and copyable. * * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ #ifndef U_IN_DOXYGEN +class FunctionValue; class U_I18N_API_CLASS ResolvedFunctionOption : public UObject { private: + friend class FunctionOptions; /* const */ UnicodeString name; - /* const */ Formattable value; - // True iff this option was represented in the syntax by a literal value. - // This is necessary in order to implement the spec for the `select` option - // of `:number` and `:integer`. - /* const */ bool sourceIsLiteral; + // owned by the global environment + const FunctionValue* value; + // True if this option is the product of merging two + // option maps together, and this option came from the + // first argument (the "older" options map). + bool thisWasMerged = false; public: U_I18N_API const UnicodeString& getName() const { return name; } - U_I18N_API const Formattable& getValue() const { return value; } - U_I18N_API bool isLiteral() const { return sourceIsLiteral; } - U_I18N_API ResolvedFunctionOption(const UnicodeString& n, const Formattable& f, bool s) - : name(n), value(f), sourceIsLiteral(s) {} + U_I18N_API const FunctionValue& getValue() const { return *value; } + U_I18N_API bool wasMerged() const { return thisWasMerged; } + U_I18N_API ResolvedFunctionOption(const UnicodeString& n, const FunctionValue& f, bool b); U_I18N_API ResolvedFunctionOption() {} U_I18N_API ResolvedFunctionOption(ResolvedFunctionOption&&); - U_I18N_API ResolvedFunctionOption& operator=(ResolvedFunctionOption&& other) noexcept { - name = std::move(other.name); - value = std::move(other.value); - sourceIsLiteral = other.sourceIsLiteral; - return *this; - } - U_I18N_API virtual ~ResolvedFunctionOption(); + U_I18N_API ResolvedFunctionOption& operator=(ResolvedFunctionOption&& other) = default; + U_I18N_API ResolvedFunctionOption& operator=(const ResolvedFunctionOption& other) = default; + U_I18N_API ResolvedFunctionOption(const ResolvedFunctionOption&) = default; + U_I18N_API virtual ~ResolvedFunctionOption(); }; // class ResolvedFunctionOption #endif @@ -479,11 +478,13 @@ class U_I18N_API_CLASS ResolvedFunctionOption : public UObject { * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ -using FunctionOptionsMap = std::map; +using FunctionOptionsMap = std::map; /** * Structure encapsulating named options passed to a custom selector or formatter. * + * This class is immutable, movable and copyable. + * * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ @@ -494,24 +495,31 @@ class U_I18N_API FunctionOptions : public UObject { * The syntactic order of options is not guaranteed to * be preserved. * - * This class is immutable and movable but not copyable. - * - * @return A map from strings to `message2::Formattable` objects representing + * @return A map from strings to FunctionValue objects representing * the results of resolving each option value. * * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - FunctionOptionsMap getOptions() const { - int32_t len; - const ResolvedFunctionOption* resolvedOptions = getResolvedFunctionOptions(len); + FunctionOptionsMap getOptions() const { FunctionOptionsMap result; - for (int32_t i = 0; i < len; i++) { - const ResolvedFunctionOption& opt = resolvedOptions[i]; - result[opt.getName()] = opt.getValue(); + for (int32_t i = 0; i < functionOptionsLen; i++) { + ResolvedFunctionOption& opt = options[i]; + result[opt.getName()] = &opt.getValue(); } return result; } + /** + * Returns a new FunctionOptions object containing all the key-value + * pairs from `this` and `other`. When `this` and `other` define options with + * the same name, `this` takes preference. + * + * @return The result of merging `this` and `other`. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + FunctionOptions mergeOptions(const FunctionOptions& other, UErrorCode&) const; /** * Default constructor. * Returns an empty mapping. @@ -519,359 +527,70 @@ class U_I18N_API FunctionOptions : public UObject { * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - FunctionOptions() { options = nullptr; } + FunctionOptions() { options = nullptr; } /** * Destructor. * * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - virtual ~FunctionOptions(); + virtual ~FunctionOptions(); /** - * Move assignment operator: - * The source FunctionOptions will be left in a valid but undefined state. + * Non-member swap function. + * @param f1 will get f2's contents + * @param f2 will get f1's contents * * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - FunctionOptions& operator=(FunctionOptions&&) noexcept; + friend inline void swap(FunctionOptions& f1, FunctionOptions& f2) noexcept { + using std::swap; + + if (f1.bogus || f2.bogus) { + f1.bogus = f2.bogus = true; + return; + } + swap(f1.options, f2.options); + swap(f1.functionOptionsLen, f2.functionOptionsLen); + } /** - * Move constructor: - * The source FunctionOptions will be left in a valid but undefined state. + * Assignment operator * * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - FunctionOptions(FunctionOptions&&); + FunctionOptions& operator=(FunctionOptions) noexcept; /** * Copy constructor. * * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - FunctionOptions& operator=(const FunctionOptions&) = delete; + FunctionOptions(const FunctionOptions&); private: - friend class InternalValue; friend class MessageFormatter; friend class StandardFunctions; explicit FunctionOptions(UVector&&, UErrorCode&); const ResolvedFunctionOption* getResolvedFunctionOptions(int32_t& len) const; - UBool getFunctionOption(std::u16string_view, Formattable&) const; - UBool wasSetFromLiteral(const UnicodeString&) const; + const FunctionValue* getFunctionOption(const std::u16string_view, UErrorCode&) const; // Returns empty string if option doesn't exist - UnicodeString getStringFunctionOption(std::u16string_view) const; + UnicodeString getStringFunctionOption(const std::u16string_view) const; + UBool wasSetFromLiteral(const std::u16string_view) const; + // Sets error code if option doesn't exist + UnicodeString getStringFunctionOption(const std::u16string_view, UErrorCode&) const; int32_t optionsCount() const { return functionOptionsLen; } + bool bogus = false; // Used in case a copy fails // Named options passed to functions // This is not a Hashtable in order to make it possible for code in a public header file // to construct a std::map from it, on-the-fly. Otherwise, it would be impossible to put // that code in the header because it would have to call internal Hashtable methods. ResolvedFunctionOption* options; int32_t functionOptionsLen = 0; - - /** - * The original FunctionOptions isn't usable after this call. - * @returns A new, merged FunctionOptions. - */ - FunctionOptions mergeOptions(FunctionOptions&& other, UErrorCode&); }; // class FunctionOptions - /** - * A `FormattedValue` represents the result of formatting a `message2::Formattable`. - * It contains either a string or a formatted number. (More types could be added - * in the future.) - * - * `FormattedValue` is immutable and movable. It is not copyable. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - class U_I18N_API FormattedValue : public UObject { - public: - /** - * Formatted string constructor. - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - explicit FormattedValue(const UnicodeString&); - /** - * Formatted number constructor. - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - explicit FormattedValue(number::FormattedNumber&&); - /** - * Default constructor. Leaves the FormattedValue in - * a valid but undefined state. - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - FormattedValue() : type(kString) {} - /** - * Returns true iff this is a formatted string. - * - * @return True if and only if this value is a formatted string. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - bool isString() const { return type == kString; } - /** - * Returns true iff this is a formatted number. - * - * @return True if and only if this value is a formatted number. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - bool isNumber() const { return type == kNumber; } - /** - * Gets the string contents of this value. If !isString(), then - * the result is undefined. - * @return A reference to a formatted string. - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - const UnicodeString& getString() const { return stringOutput; } - /** - * Gets the number contents of this value. If !isNumber(), then - * the result is undefined. - * @return A reference to a formatted number. - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - const number::FormattedNumber& getNumber() const { return numberOutput; } - /** - * Move assignment operator: - * The source FormattedValue will be left in a valid but undefined state. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - FormattedValue& operator=(FormattedValue&&) noexcept; - /** - * Move constructor: - * The source FormattedValue will be left in a valid but undefined state. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - FormattedValue(FormattedValue&& other) { *this = std::move(other); } - /** - * Destructor. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - virtual ~FormattedValue(); - private: - enum Type { - kString, - kNumber - }; - Type type; - UnicodeString stringOutput; - number::FormattedNumber numberOutput; - }; // class FormattedValue - - /** - * A `FormattablePlaceholder` encapsulates an input value (a `message2::Formattable`) - * together with an optional output value (a `message2::FormattedValue`). - * More information, such as source line/column numbers, could be added to the class - * in the future. - * - * `FormattablePlaceholder` is immutable (not deeply immutable) and movable. - * It is not copyable. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - class U_I18N_API_CLASS FormattedPlaceholder : public UObject { - public: - /** - * Fallback constructor. Constructs a value that represents a formatting error, - * without recording an input `Formattable` as the source. - * - * @param s An error string. (See the MessageFormat specification for details - * on fallback strings.) - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API explicit FormattedPlaceholder(const UnicodeString& s) : fallback(s), type(kFallback) {} - /** - * Constructor for fully formatted placeholders. - * - * @param input A `FormattedPlaceholder` containing the fallback string and source - * `Formattable` used to construct the formatted value. - * @param output A `FormattedValue` representing the formatted output of `input`. - * Passed by move. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API FormattedPlaceholder(const FormattedPlaceholder& input, FormattedValue&& output) - : fallback(input.fallback), source(input.source), - formatted(std::move(output)), previousOptions(FunctionOptions()), type(kEvaluated) {} - /** - * Constructor for fully formatted placeholders with options. - * - * @param input A `FormattedPlaceholder` containing the fallback string and source - * `Formattable` used to construct the formatted value. - * @param opts Function options that were used to construct `output`. May be the empty map. - * @param output A `FormattedValue` representing the formatted output of `input`. - * Passed by move. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API FormattedPlaceholder(const FormattedPlaceholder& input, FunctionOptions&& opts, FormattedValue&& output) - : fallback(input.fallback), source(input.source), - formatted(std::move(output)), previousOptions(std::move(opts)), type(kEvaluated) {} - /** - * Constructor for unformatted placeholders. - * - * @param input A `Formattable` object. - * @param fb Fallback string to use if an error occurs while formatting the input. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API FormattedPlaceholder(const Formattable& input, const UnicodeString& fb) - : fallback(fb), source(input), type(kUnevaluated) {} - /** - * Default constructor. Leaves the FormattedPlaceholder in a - * valid but undefined state. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API FormattedPlaceholder() : type(kNull) {} - /** - * Returns the source `Formattable` value for this placeholder. - * The result is undefined if this is a null operand. - * - * @return A message2::Formattable value. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API const message2::Formattable& asFormattable() const; - /** - * Returns true iff this is a fallback placeholder. - * - * @return True if and only if this placeholder was constructed from a fallback string, - * with no `Formattable` source or formatting output. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API bool isFallback() const { return type == kFallback; } - /** - * Returns true iff this is a null placeholder. - * - * @return True if and only if this placeholder represents the absent argument to a formatter - * that was invoked without an argument. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API bool isNullOperand() const { return type == kNull; } - /** - * Returns true iff this has formatting output. - * - * @return True if and only if this was constructed from both an input `Formattable` and - * output `FormattedValue`. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API bool isEvaluated() const { return (type == kEvaluated); } - /** - * Returns true iff this represents a valid argument to the formatter. - * - * @return True if and only if this is neither the null argument nor a fallback placeholder. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API bool canFormat() const { return !(isFallback() || isNullOperand()); } - /** - * Gets the fallback value of this placeholder, to be used in its place if an error occurs while - * formatting it. - * @return A reference to this placeholder's fallback string. - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API const UnicodeString& getFallback() const { return fallback; } - /** - * Returns the options of this placeholder. The result is the empty map if !isEvaluated(). - * @return A reference to an option map, capturing the options that were used - * in producing the output of this `FormattedPlaceholder` - * (or empty if there is no output) - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API const FunctionOptions& options() const { return previousOptions; } - /** - * Returns the formatted output of this placeholder. The result is undefined if !isEvaluated(). - * @return A fully formatted `FormattedPlaceholder`. - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API const FormattedValue& output() const { return formatted; } - /** - * Move assignment operator: - * The source FormattedPlaceholder will be left in a valid but undefined state. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API FormattedPlaceholder& operator=(FormattedPlaceholder&&) noexcept; - /** - * Move constructor: - * The source FormattedPlaceholder will be left in a valid but undefined state. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API FormattedPlaceholder(FormattedPlaceholder&& other) { *this = std::move(other); } - /** - * Formats this as a string, using defaults. If this is - * either the null operand or is a fallback value, the return value is the result of formatting the - * fallback value (which is the default fallback string if this is the null operand). - * If there is no formatted output and the input is object- or array-typed, - * then the argument is treated as a fallback value, since there is no default formatter - * for objects or arrays. - * - * @param locale The locale to use for formatting numbers or dates - * @param status Input/output error code - * @return The result of formatting this placeholder. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - U_I18N_API UnicodeString formatToString(const Locale& locale, - UErrorCode& status) const; - - private: - friend class MessageFormatter; - - enum Type { - kFallback, // Represents the result of formatting that encountered an error - kNull, // Represents the absence of both an output and an input (not necessarily an error) - kUnevaluated, // `source` should be valid, but there's no result yet - kEvaluated, // `formatted` exists - }; - UnicodeString fallback; - Formattable source; - FormattedValue formatted; - FunctionOptions previousOptions; // Ignored unless type is kEvaluated - Type type; - }; // class FormattedPlaceholder - /** * Not yet implemented: The result of a message formatting operation. Based on * ICU4J's FormattedMessage.java. diff --git a/deps/icu-small/source/i18n/unicode/messageformat2_function_registry.h b/deps/icu-small/source/i18n/unicode/messageformat2_function_registry.h index 37690d5e04a1..9537d0b279b8 100644 --- a/deps/icu-small/source/i18n/unicode/messageformat2_function_registry.h +++ b/deps/icu-small/source/i18n/unicode/messageformat2_function_registry.h @@ -16,6 +16,7 @@ #include "unicode/messageformat2_data_model_names.h" #include "unicode/messageformat2_formattable.h" +#include "unicode/ubidi.h" #ifndef U_HIDE_DEPRECATED_API @@ -30,81 +31,7 @@ namespace message2 { using namespace data_model; - /** - * Interface that factory classes for creating formatters must implement. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - class U_I18N_API FormatterFactory : public UObject { - // TODO: the coding guidelines say that interface classes - // shouldn't inherit from UObject, but if I change it so these - // classes don't, and the individual formatter factory classes - // inherit from public FormatterFactory, public UObject, then - // memory leaks ensue - public: - /** - * Constructs a new formatter object. This method is not const; - * formatter factories with local state may be defined. - * - * @param locale Locale to be used by the formatter. - * @param status Input/output error code. - * @return The new Formatter, which is non-null if U_SUCCESS(status). - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - virtual Formatter* createFormatter(const Locale& locale, UErrorCode& status) = 0; - /** - * Destructor. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - virtual ~FormatterFactory(); - /** - * Copy constructor. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - FormatterFactory& operator=(const FormatterFactory&) = delete; - }; // class FormatterFactory - - /** - * Interface that factory classes for creating selectors must implement. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - class U_I18N_API SelectorFactory : public UObject { - public: - /** - * Constructs a new selector object. - * - * @param locale Locale to be used by the selector. - * @param status Input/output error code. - * @return The new selector, which is non-null if U_SUCCESS(status). - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - virtual Selector* createSelector(const Locale& locale, UErrorCode& status) const = 0; - /** - * Destructor. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - virtual ~SelectorFactory(); - /** - * Copy constructor. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - SelectorFactory& operator=(const SelectorFactory&) = delete; - }; // class SelectorFactory + class Function; /** * Defines mappings from names of formatters and selectors to functions implementing them. @@ -119,38 +46,24 @@ namespace message2 { class U_I18N_API MFFunctionRegistry : public UObject { private: - using FormatterMap = Hashtable; // Map from stringified function names to FormatterFactory* - using SelectorMap = Hashtable; // Map from stringified function names to SelectorFactory* + using FunctionMap = Hashtable; // Map from function names to FunctionFactory* public: /** - * Looks up a formatter factory by the name of the formatter. The result is non-const, - * since formatter factories may have local state. Returns the result by pointer - * rather than by reference since it can fail. + * Looks up a function by the name of the function. + * Returns the result by pointer rather than by reference since it can fail. * - * @param formatterName Name of the desired formatter. - * @return A pointer to the `FormatterFactory` registered under `formatterName`, or null - * if no formatter was registered under that name. The pointer is not owned + * @param functionName Name of the desired function. + * @return A pointer to the function registered under `functionName`, or null + * if no function was registered under that name. The pointer is not owned * by the caller. * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - FormatterFactory* getFormatter(const FunctionName& formatterName) const; - /** - * Looks up a selector factory by the name of the selector. (This returns the result by pointer - * rather than by reference since `FormatterFactory` is an abstract class.) - * - * @param selectorName Name of the desired selector. - * @return A pointer to the `SelectorFactory` registered under `selectorName`, or null - * if no formatter was registered under that name. - * - * @internal ICU 75 technology preview + * @internal ICU 79 technology preview * @deprecated This API is for technology preview only. */ - const SelectorFactory* getSelector(const FunctionName& selectorName) const; + const Function* getFunction(const FunctionName& functionName) const; /** - * Looks up a formatter factory by a type tag. This method gets the name of the default formatter registered + * Looks up a function by a type tag. This method gets the name of the default formatter registered * for that type. If no formatter was explicitly registered for this type, it returns false. * * @param formatterType Type tag for the desired `FormattableObject` type to be formatted. @@ -176,9 +89,9 @@ namespace message2 { class U_I18N_API Builder : public UObject { private: // Must use raw pointers to avoid instantiating `LocalPointer` on an internal type - FormatterMap* formatters; - SelectorMap* selectors; - Hashtable* formattersByType; + FunctionMap* functions; + // Mapping from strings (type tags) to FunctionNames + Hashtable* formattersByType = nullptr; // Do not define copy constructor/assignment operator Builder& operator=(const Builder&) = delete; @@ -202,18 +115,22 @@ namespace message2 { be re-thought. */ /** - * Registers a formatter factory to a given formatter name. + * Registers a function to a given name. * - * @param formatterName Name of the formatter being registered. - * @param formatterFactory A pointer to a FormatterFactory object to use - * for creating `formatterName` formatters. This argument is adopted. + * @param functionName Name of the formatter being registered. + * @param function A pointer to a Function object. + * This argument is adopted. + * Functions with the same name as standard functions will + * override the standard functions. * @param errorCode Input/output error code * @return A reference to the builder. * - * @internal ICU 75 technology preview + * @internal ICU 79 technology preview * @deprecated This API is for technology preview only. */ - Builder& adoptFormatter(const data_model::FunctionName& formatterName, FormatterFactory* formatterFactory, UErrorCode& errorCode); + Builder& adoptFunction(const data_model::FunctionName& functionName, + Function* function, + UErrorCode& errorCode); /** * Registers a formatter factory to a given type tag. * (See `FormattableObject` for details on type tags.) @@ -227,21 +144,9 @@ namespace message2 { * @internal ICU 75 technology preview * @deprecated This API is for technology preview only. */ - Builder& setDefaultFormatterNameByType(const UnicodeString& type, const data_model::FunctionName& functionName, UErrorCode& errorCode); - - /** - * Registers a selector factory to a given selector name. Adopts `selectorFactory`. - * - * @param selectorName Name of the selector being registered. - * @param selectorFactory A SelectorFactory object to use for creating `selectorName` - * selectors. - * @param errorCode Input/output error code - * @return A reference to the builder. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - Builder& adoptSelector(const data_model::FunctionName& selectorName, SelectorFactory* selectorFactory, UErrorCode& errorCode); + Builder& setDefaultFormatterNameByType(const UnicodeString& type, + const data_model::FunctionName& functionName, + UErrorCode& errorCode); /** * Creates an immutable `MFFunctionRegistry` object with the selectors and formatters * that were previously registered. The builder cannot be used after this call. @@ -299,120 +204,396 @@ namespace message2 { */ virtual ~MFFunctionRegistry(); + /** + * Get the standard function registry. + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + * @param status Input/output error code + * @return A const alias to the registry, or nullptr on error + */ + static const MFFunctionRegistry* getStandardFunctionsRegistry(UErrorCode &status); + private: friend class MessageContext; friend class MessageFormatter; + friend class MF2RegistrySingleton; // Do not define copy constructor or copy assignment operator MFFunctionRegistry& operator=(const MFFunctionRegistry&) = delete; MFFunctionRegistry(const MFFunctionRegistry&) = delete; - MFFunctionRegistry(FormatterMap* f, SelectorMap* s, Hashtable* byType); + MFFunctionRegistry(FunctionMap*, Hashtable*); MFFunctionRegistry() {} // Debugging; should only be called on a function registry with // all the standard functions registered - void checkFormatter(const char*) const; - void checkSelector(const char*) const; + void checkFunction(std::u16string_view) const; void checkStandard() const; - bool hasFormatter(const data_model::FunctionName& f) const; - bool hasSelector(const data_model::FunctionName& s) const; + bool hasFunction(const data_model::FunctionName& f) const; void cleanup() noexcept; // Must use raw pointers to avoid instantiating `LocalPointer` on an internal type - FormatterMap* formatters = nullptr; - SelectorMap* selectors = nullptr; + FunctionMap* functions = nullptr; // Mapping from strings (type tags) to FunctionNames Hashtable* formattersByType = nullptr; }; // class MFFunctionRegistry /** - * Interface that formatter classes must implement. + * Class implementing data from contextual options. + * See https://github.com/unicode-org/message-format-wg/pull/846 * - * @internal ICU 75 technology preview + * @internal ICU 79 technology preview * @deprecated This API is for technology preview only. */ - class U_I18N_API Formatter : public UObject { - public: - /** - * Formats the input passed in `context` by setting an output using one of the - * `FormattingContext` methods or indicating an error. - * - * @param toFormat Placeholder, including a source formattable value and possibly - * the output of a previous formatter applied to it; see - * `message2::FormattedPlaceholder` for details. Passed by move. - * @param options The named function options. Passed by move - * @param status Input/output error code. Should not be set directly by the - * custom formatter, which should use `FormattingContext::setFormattingWarning()` - * to signal errors. The custom formatter may pass `status` to other ICU functions - * that can signal errors using this mechanism. - * - * @return The formatted value. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - virtual FormattedPlaceholder format(FormattedPlaceholder&& toFormat, - FunctionOptions&& options, - UErrorCode& status) const = 0; - /** - * Destructor. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - virtual ~Formatter(); - }; // class Formatter + class U_I18N_API_CLASS FunctionContext : public UObject { + public: + /** + * Returns the locale from this context. + * + * @return Locale the context was created with. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const Locale& getLocale() const { return locale; } + /** + * Returns the text direction from this context. + * + * @return A UMFBidiOption indicating the text direction. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API UMFBidiOption getDirection() const { return dir; } + /** + * Returns the ID from this context. + * + * @return A string to be used in formatting to parts. + * (Formatting to parts is not yet implemented.) + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const UnicodeString& getID() const { return id; } + + /** + * Returns the original called function name from this context. + * + * @return The function name, as registered, used for this function + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API const FunctionName& getCalledFunctionName() const { return calledFunction; } + + /** + * Returns a new context with the specified locale. + * + * @return a new locale + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API FunctionContext withLocale(const Locale& loc) const { + return FunctionContext(loc, getDirection(), getID(), getCalledFunctionName()); + } + + private: + friend class MessageFormatter; + + Locale locale; + UMFBidiOption dir; + UnicodeString id; + const FunctionName& calledFunction; + + FunctionContext(const Locale& loc, UMFBidiOption d, UnicodeString i, const FunctionName& calledFn) + : locale(loc), dir(d), id(i), calledFunction(calledFn) {} + }; // class FunctionContext + + class FunctionValue; /** - * Interface that selector classes must implement. + * Interface that function handler classes must implement. * - * @internal ICU 75 technology preview + * @internal ICU 79 technology preview * @deprecated This API is for technology preview only. */ - class U_I18N_API Selector : public UObject { - public: - /** - * Compares the input to an array of keys, and returns an array of matching - * keys sorted by preference. - * - * @param toFormat The unnamed function argument; passed by move. - * @param options A reference to the named function options. - * @param keys An array of strings that are compared to the input - * (`context.getFormattableInput()`) in an implementation-specific way. - * @param keysLen The length of `keys`. - * @param prefs An array of strings with length `keysLen`. The contents of - * the array is undefined. `selectKey()` should set the contents - * of `prefs` to a subset of `keys`, with the best match placed at the lowest index. - * @param prefsLen A reference that `selectKey()` should set to the length of `prefs`, - * which must be less than or equal to `keysLen`. - * @param status Input/output error code. Should not be set directly by the - * custom selector, which should use `FormattingContext::setSelectorError()` - * to signal errors. The custom selector may pass `status` to other ICU functions - * that can signal errors using this mechanism. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - virtual void selectKey(FormattedPlaceholder&& toFormat, - FunctionOptions&& options, - const UnicodeString* keys, - int32_t keysLen, - UnicodeString* prefs, - int32_t& prefsLen, - UErrorCode& status) const = 0; - // Note: This takes array arguments because the internal MessageFormat code has to - // call this method, and can't include any code that constructs std::vectors. - /** - * Destructor. - * - * @internal ICU 75 technology preview - * @deprecated This API is for technology preview only. - */ - virtual ~Selector(); - }; // class Selector + class U_I18N_API Function : public UObject { + public: + /** + * Calls this Function on a FunctionValue operand and its FunctionOptions options, + * returning a LocalPointer to a FunctionValue. + * + * @param context The context of this function, based on its contextual options + * @param operand The unnamed argument to the function. + * @param options Resolved options for this function. + * @param status Input/output error code + * @return The function value that is the result of calling this function on + * the arguments. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + virtual LocalPointer call(const FunctionContext& context, + const FunctionValue& operand, + const FunctionOptions& options, + UErrorCode& status) const = 0; + /** + * Destructor. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + virtual ~Function(); + }; // class Function + + /** + * Type representing argument and return values for custom functions. + * It encapsulates an operand and resolved options, and can be extended with + * additional state. + * Adding a new custom function requires adding a new class that + * implements this interface. + * + * FunctionValues are assumed to be immutable (the call() method on + * Function takes a const FunctionValue&, and the formatToString() + * and selectKeys() methods are const.) Feedback on whether internal + * mutable state in classes implementing FunctionValue is welcomed + * during the Technology Preview period. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + class U_I18N_API_CLASS FunctionValue : public UObject { + public: + /** + * Returns the string representation of this value. The default + * method signals an error. Must be overridden by classes + * implementing values that support formatting. + * + * @param status Input/output error code + * @return A string. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual UnicodeString formatToString(UErrorCode& status) const { + if (U_SUCCESS(status)) { + status = U_MF_FORMATTING_ERROR; + } + return {}; + } + /** + * Returns the Formattable operand that was used to construct + * this value. The operand may be obtained from calling getOperand() + * on the input FunctionValue, or it may be constructed separately. + * + * @return A reference to a message2::Formattable object. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual const Formattable& unwrap() const { return innerValue; } + /** + * Returns a reference to the resolved options for this value. + * + * @return A reference to the resolved options for this value. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual const FunctionOptions& getResolvedOptions() const { return opts; } + /** + * Returns the directionality of this value, i.e. the directionality + * that its formatted result should have. + * + * @return A UBiDiDirection indicating the directionality that + * the formatted result of this value should have. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual UMFDirectionality getDirection() const { return dir; } + /** + * Returns the directionality that this value was annotated with. + * + * This is distinct from the directionality of the formatted text. + * See the description of the "Default Bidi Strategy", + * https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#handling-bidirectional-text + * for further context. + * + * @return A UMFBidiOption indicating the directionality that + * this value was annotated with. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual UMFBidiOption getDirectionAnnotation() const { return inputDir; } + /** + * Returns true if this value supports selection. The default method + * returns false. The method must be overridden for values that support + * selection. + * + * @return True iff this value supports selection. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual UBool isSelectable() const { + // In the future, this function could return a capability + // indicating whether this function can format, select, or both. + return false; + } + /** + * Returns true if this value represents a null operand, that is, + * the absence of an argument. This method should not be overridden. + * It can be called in order to check whether the argument is present. + * Some functions may be nullary (they may work with no arguments). + * + * @return True iff this value represents an absent operand. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual UBool isNullOperand() const { return false; } + /** + * Compares this value to an array of keys, and returns an array of matching + * keys sorted by preference. The default implementation of this method + * signals an error. It should be overridden for value classes that support + * selection. + * + * @param keys An array of strings to compare to the input. + * @param keysLen The length of `keys`. + * @param prefs An array of indices into `keys`. + * The initial contents of + * the array is undefined. `selectKey()` should set the contents + * of `prefs` to a subset of the indices in `keys`, + * with the best match placed at the lowest index in `prefs`. + * @param prefsLen A reference that `selectKey()` should set to the length of `prefs`, + * which must be less than or equal to `keysLen`. + * @param status Input/output error code. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual void selectKeys(const UnicodeString* keys, + int32_t keysLen, + int32_t* prefs, + int32_t& prefsLen, + UErrorCode& status) const { + (void) keys; + (void) keysLen; + (void) prefs; + (void) prefsLen; + if (U_SUCCESS(status)) { + status = U_MF_SELECTOR_ERROR; + } + } + /** + * Returns the name of the function that constructed this value. + * + * @returns A string representing a function name. The string does + * not include a leading ':'. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual const FunctionName& getFunctionName() const { return functionName; } + /** + * Returns a fallback string that can be used as output + * if processing this function results in an error. + * + * @returns A string determined by the creator of this FunctionValue. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual const UnicodeString& getFallback() const { return fallback; } + /** + * Destructor. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + U_I18N_API virtual ~FunctionValue(); + protected: + /** + * Computed result of the function invocation that + * returned this FunctionValue. This may simply be the + * operand, or may be a value computed from the operand. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + Formattable innerValue; + /** + * Resolved options attached to this value. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + FunctionOptions opts; + /** + * The name of the function that constructed this FunctionValue. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + FunctionName functionName; + /** + * Fallback string that can be used if a later function encounters + * an error when processing this FunctionValue. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + UnicodeString fallback; + /** + * Locale from u:locale option. + * Must be set from function context. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + Locale locale; + /** + * Directionality of formatted result. + * Defaults to U_MF_DIRECTIONALITY_UNKNOWN if not set + * by the subclass's constructor. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + UMFDirectionality dir = U_MF_DIRECTIONALITY_UNKNOWN; + /** + * Input directionality from u:dir option. + * Defaults to U_MF_BIDI_OPTION_INHERIT if not set + * by the subclass's constructor. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + UMFBidiOption inputDir = U_MF_BIDI_OPTION_INHERIT; + private: + friend class FunctionOptions; + + // Should only be overridden by BaseValue + /** + * Returns true iff this FunctionValue was created directly or indirectly + * from a literal. + * This method should not be overridden. It is overridden by an internal class + * in the message formatter. + * It is used to implement the MessageFormat specification for the `select` + * option of `:number` and `:integer`. + * + * @returns A boolean. + * + * @internal ICU 79 technology preview + * @deprecated This API is for technology preview only. + */ + virtual UBool wasCreatedFromLiteral() const { return false; } + }; // class FunctionValue } // namespace message2 diff --git a/deps/icu-small/source/i18n/unicode/numberformatter.h b/deps/icu-small/source/i18n/unicode/numberformatter.h index 6b20e383b819..bdc5e07f6518 100644 --- a/deps/icu-small/source/i18n/unicode/numberformatter.h +++ b/deps/icu-small/source/i18n/unicode/numberformatter.h @@ -1232,7 +1232,7 @@ class U_I18N_API StringProp : public UMemory { StringProp &operator=(StringProp &&src) noexcept; /** @internal */ - int16_t length() const { + int32_t length() const { return fLength; } @@ -1250,7 +1250,7 @@ class U_I18N_API StringProp : public UMemory { private: char *fValue; - int16_t fLength; + int32_t fLength; UErrorCode fError; StringProp() : fValue(nullptr), fLength(0), fError(U_ZERO_ERROR) { diff --git a/deps/icu-small/source/i18n/unicode/numfmt.h b/deps/icu-small/source/i18n/unicode/numfmt.h index aabbad4f18ac..3ad55643fd95 100644 --- a/deps/icu-small/source/i18n/unicode/numfmt.h +++ b/deps/icu-small/source/i18n/unicode/numfmt.h @@ -358,9 +358,6 @@ class U_I18N_API NumberFormat : public Format { * last character successfully parsed. If the * source is not parsed successfully, this param * will remain unchanged. - * @return A newly created Formattable* object, or nullptr - * on failure. The caller owns this and should - * delete it when done. * @stable ICU 2.0 */ virtual void parseObject(const UnicodeString& source, @@ -1118,8 +1115,9 @@ class U_I18N_API NumberFormat : public Format { * Returns the currency in effect for this formatter. Subclasses * should override this method as needed. Unlike getCurrency(), * this method should never return "". - * @result output parameter for null-terminated result, which must + * @param result output parameter for null-terminated result, which must * have a capacity of at least 4 + * @param ec Output parameter filled with success/failure status. * @internal */ virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const; diff --git a/deps/icu-small/source/i18n/unicode/plurfmt.h b/deps/icu-small/source/i18n/unicode/plurfmt.h index adba324d2eb5..eb6a796cd903 100644 --- a/deps/icu-small/source/i18n/unicode/plurfmt.h +++ b/deps/icu-small/source/i18n/unicode/plurfmt.h @@ -551,6 +551,7 @@ class U_I18N_API_CLASS PluralFormat : public Format { PluralFormat() = delete; // default constructor not implemented void init(const PluralRules* rules, UPluralType type, UErrorCode& status); + void initializeNumberFormat(UErrorCode& status); /** * Copies dynamically allocated values (pointer fields). * Others are copied using their copy constructors and assignment operators. diff --git a/deps/icu-small/source/i18n/unicode/rbnf.h b/deps/icu-small/source/i18n/unicode/rbnf.h index 50c0d195a463..2f30e51b2d17 100644 --- a/deps/icu-small/source/i18n/unicode/rbnf.h +++ b/deps/icu-small/source/i18n/unicode/rbnf.h @@ -985,8 +985,6 @@ class U_I18N_API_CLASS RuleBasedNumberFormat : public NumberFormat { Formattable& result, ParsePosition& parsePosition) const override; -#if !UCONFIG_NO_COLLATION - /** * Turns lenient parse mode on and off. * @@ -1031,8 +1029,6 @@ class U_I18N_API_CLASS RuleBasedNumberFormat : public NumberFormat { */ U_I18N_API virtual inline UBool isLenient() const override; -#endif - /** * Override the default rule set to use. If ruleSetName is null, reset * to the initial default rule set. If the rule set is not a public rule set name, @@ -1135,6 +1131,7 @@ class U_I18N_API_CLASS RuleBasedNumberFormat : public NumberFormat { friend class FractionalPartSubstitution; inline NFRuleSet * getDefaultRuleSet() const; + void initializeCollator(UErrorCode &status); const RuleBasedCollator * getCollator() const; DecimalFormatSymbols * initializeDecimalFormatSymbols(UErrorCode &status); const DecimalFormatSymbols * getDecimalFormatSymbols() const; @@ -1148,37 +1145,35 @@ class U_I18N_API_CLASS RuleBasedNumberFormat : public NumberFormat { void format(double number, NFRuleSet& rs, UnicodeString& toAppendTo, UErrorCode& status) const; private: - NFRuleSet **fRuleSets; - UnicodeString* ruleSetDescriptions; - int32_t numRuleSets; - NFRuleSet *defaultRuleSet; + NFRuleSet **fRuleSets { }; + UnicodeString* ruleSetDescriptions { }; + int32_t numRuleSets { }; + NFRuleSet *defaultRuleSet { }; Locale locale; - RuleBasedCollator* collator; - DecimalFormatSymbols* decimalFormatSymbols; - NFRule *defaultInfinityRule; - NFRule *defaultNaNRule; - ERoundingMode fRoundingMode; - UBool lenient; - UnicodeString* lenientParseRules; - LocalizationInfo* localizations; + RuleBasedCollator* collator { }; + DecimalFormatSymbols* decimalFormatSymbols { }; + NFRule *defaultInfinityRule { }; + NFRule *defaultNaNRule { }; + ERoundingMode fRoundingMode { ERoundingMode::kRoundUnnecessary }; + UBool lenient { }; + UBool unparseable { }; + uint8_t caseFoldOption { }; + UnicodeString* lenientParseRules { }; + LocalizationInfo* localizations { }; UnicodeString originalDescription; - UBool capitalizationInfoSet; - UBool capitalizationForUIListMenu; - UBool capitalizationForStandAlone; - BreakIterator* capitalizationBrkIter; + UBool capitalizationInfoSet { }; + UBool capitalizationForUIListMenu { }; + UBool capitalizationForStandAlone { }; + BreakIterator* capitalizationBrkIter { }; }; // --------------- -#if !UCONFIG_NO_COLLATION - inline UBool RuleBasedNumberFormat::isLenient() const { return lenient; } -#endif - inline NFRuleSet* RuleBasedNumberFormat::getDefaultRuleSet() const { return defaultRuleSet; diff --git a/deps/icu-small/source/i18n/unicode/rbtz.h b/deps/icu-small/source/i18n/unicode/rbtz.h index 3393b3d97a91..7a896af0e830 100644 --- a/deps/icu-small/source/i18n/unicode/rbtz.h +++ b/deps/icu-small/source/i18n/unicode/rbtz.h @@ -185,13 +185,13 @@ class U_I18N_API RuleBasedTimeZone : public BasicTimeZone { * * @param date moment in time for which to return offsets, in * units of milliseconds from January 1, 1970 0:00 GMT, either GMT - * time or local wall time, depending on `local'. - * @param local if true, `date' is local wall time; otherwise it + * time or local wall time, depending on `local`. + * @param local if true, `date` is local wall time; otherwise it * is in GMT time. * @param rawOffset output parameter to receive the raw offset, that * is, the offset not including DST adjustments * @param dstOffset output parameter to receive the DST offset, - * that is, the offset to be added to `rawOffset' to obtain the + * that is, the offset to be added to `rawOffset` to obtain the * total offset between local and GMT time. If DST is not in * effect, this value is zero; otherwise it is a positive value, * typically one hour. diff --git a/deps/icu-small/source/i18n/unicode/search.h b/deps/icu-small/source/i18n/unicode/search.h index d4fd9ce93bd4..1c50eca5661e 100644 --- a/deps/icu-small/source/i18n/unicode/search.h +++ b/deps/icu-small/source/i18n/unicode/search.h @@ -230,7 +230,7 @@ class U_I18N_API SearchIterator : public UObject { * Set the string text to be searched. Text iteration will hence begin at * the start of the text string. This method is useful if you want to * re-use an iterator to search for the same pattern within a different - * body of text. The user is responsible for deleting the text. + * body of text. * @param text string to be searched. * @param status for errors. If the text length is 0, * an U_ILLEGAL_ARGUMENT_ERROR is returned. @@ -247,7 +247,6 @@ class U_I18N_API SearchIterator : public UObject { * Note: No parsing of the text within the CharacterIterator * will be done during searching for this version. The block of text * in CharacterIterator will be used as it is. - * The user is responsible for deleting the text. * @param text string iterator to be searched. * @param status for errors if any. If the text length is 0 then an * U_ILLEGAL_ARGUMENT_ERROR is returned. diff --git a/deps/icu-small/source/i18n/unicode/smpdtfmt.h b/deps/icu-small/source/i18n/unicode/smpdtfmt.h index c5242fd5a086..cfa8848401f1 100644 --- a/deps/icu-small/source/i18n/unicode/smpdtfmt.h +++ b/deps/icu-small/source/i18n/unicode/smpdtfmt.h @@ -52,6 +52,7 @@ class TimeZoneFormat; class SharedNumberFormat; class SimpleDateFormatMutableNFs; class DateIntervalFormat; +class PluralRules; namespace number { class LocalizedNumberFormatter; @@ -1268,6 +1269,7 @@ class U_I18N_API_CLASS SimpleDateFormat: public DateFormat { UBool fHasMinute; UBool fHasSecond; UBool fHasHanYearChar; // pattern contains the Han year character \u5E74 + PluralRules* fOrdinalPluralRules = nullptr; // Owned; created in parsePattern() /** * Sets fHasMinutes and fHasSeconds. diff --git a/deps/icu-small/source/i18n/unicode/stsearch.h b/deps/icu-small/source/i18n/unicode/stsearch.h index bbad9d22a371..2cf3e54922ec 100644 --- a/deps/icu-small/source/i18n/unicode/stsearch.h +++ b/deps/icu-small/source/i18n/unicode/stsearch.h @@ -204,8 +204,7 @@ class U_I18N_API StringSearch final : public SearchIterator * @param text The text iterator in which to search for the pattern. * @param locale A locale which defines the language-sensitive * comparison rules used to determine whether text in the - * pattern and target matches. User is responsible for - * the clearing of this object. + * pattern and target matches. * @param breakiter A BreakIterator object used to constrain * the matches that are found. Matches whose start and end * indices in the target text are not boundaries as diff --git a/deps/icu-small/source/i18n/unicode/tblcoll.h b/deps/icu-small/source/i18n/unicode/tblcoll.h index abf0e177436a..8db8f9db8142 100644 --- a/deps/icu-small/source/i18n/unicode/tblcoll.h +++ b/deps/icu-small/source/i18n/unicode/tblcoll.h @@ -196,7 +196,6 @@ class U_I18N_API_CLASS RuleBasedCollator final : public Collator { * Must be the root collator, must not be nullptr. * The base is required to be present through the lifetime of the collator. * @param status for catching errors - * @return newly created collator * @see cloneBinary * @stable ICU 3.4 */ diff --git a/deps/icu-small/source/i18n/unicode/timezone.h b/deps/icu-small/source/i18n/unicode/timezone.h index 9591b7d90aff..93dd61a2f7c2 100644 --- a/deps/icu-small/source/i18n/unicode/timezone.h +++ b/deps/icu-small/source/i18n/unicode/timezone.h @@ -470,8 +470,9 @@ class U_I18N_API TimeZone : public UObject { * @return A reference to the result. * @stable ICU 74 */ - static UnicodeString& U_EXPORT2 getIanaID(const UnicodeString&id, UnicodeString& ianaID, - UErrorCode& status); + static UnicodeString& U_EXPORT2 getIanaID(const UnicodeString& id, + UnicodeString& ianaID U_LIFETIME_BOUND, + UErrorCode& status); /** * Converts a system time zone ID to an equivalent Windows time zone ID. For example, @@ -481,7 +482,7 @@ class U_I18N_API TimeZone : public UObject { * system time zone ID is unknown or unmappable to a Windows time zone, then the result will be * empty, but the operation itself remains successful (no error status set on return). * - *

This implementation utilizes + *

This implementation utilizes * Zone-Tzid mapping data. The mapping data is updated time to time. To get the latest changes, * please read the ICU user guide section * Updating the Time Zone Data. @@ -509,7 +510,7 @@ class U_I18N_API TimeZone : public UObject { * Windows time zone ID is unknown or unmappable to a system time zone, then the result * will be empty, but the operation itself remains successful (no error status set on return). * - *

This implementation utilizes + *

This implementation utilizes * Zone-Tzid mapping data. The mapping data is updated time to time. To get the latest changes, * please read the ICU user guide section * Updating the Time Zone Data. @@ -609,13 +610,13 @@ class U_I18N_API TimeZone : public UObject { * * @param date moment in time for which to return offsets, in * units of milliseconds from January 1, 1970 0:00 GMT, either GMT - * time or local wall time, depending on `local'. - * @param local if true, `date' is local wall time; otherwise it + * time or local wall time, depending on `local`. + * @param local if true, `date` is local wall time; otherwise it * is in GMT time. * @param rawOffset output parameter to receive the raw offset, that * is, the offset not including DST adjustments * @param dstOffset output parameter to receive the DST offset, - * that is, the offset to be added to `rawOffset' to obtain the + * that is, the offset to be added to `rawOffset` to obtain the * total offset between local and GMT time. If DST is not in * effect, this value is zero; otherwise it is a positive value, * typically one hour. diff --git a/deps/icu-small/source/i18n/unicode/translit.h b/deps/icu-small/source/i18n/unicode/translit.h index 70ba1c87fa38..11fe63c27830 100644 --- a/deps/icu-small/source/i18n/unicode/translit.h +++ b/deps/icu-small/source/i18n/unicode/translit.h @@ -1184,10 +1184,8 @@ class U_I18N_API Transliterator : public UObject { * ignoring the effect of this object's filter. The base class * implementation returns the empty set. Subclasses that wish to * implement this should override this method. - * @return the set of characters that this transliterator may - * modify. The set may be modified, so subclasses should return a - * newly-created object. - * @param result receives result set; previous contents lost + * @param result receives the set of characters that this transliterator may + * modify; previous contents lost * @see #getSourceSet * @see #getTargetSet * @stable ICU 2.4 @@ -1348,8 +1346,6 @@ class U_I18N_API Transliterator : public UObject { * Transliterator::createXXX to avoid undefined behavior. * * @param ID the ID of the transliterator or class - * @return the Object that was registered with - * ID, or null if none was * @see #registerInstance * @see #registerFactory * @stable ICU 2.0 diff --git a/deps/icu-small/source/i18n/unicode/tzfmt.h b/deps/icu-small/source/i18n/unicode/tzfmt.h index 78b31438b1cf..25801a2a553f 100644 --- a/deps/icu-small/source/i18n/unicode/tzfmt.h +++ b/deps/icu-small/source/i18n/unicode/tzfmt.h @@ -670,8 +670,6 @@ class U_I18N_API_CLASS TimeZoneFormat : public Format { * @param parse_pos The position to start parsing at. Upon return this param is set to the position after the * last character successfully parsed. If the source is not parsed successfully, this param * will remain unchanged. - * @return A newly created Formattable* object, or nullptr on failure. The caller owns this and should - * delete it when done. * @stable ICU 50 */ U_I18N_API virtual void parseObject(const UnicodeString& source, diff --git a/deps/icu-small/source/i18n/unicode/tznames.h b/deps/icu-small/source/i18n/unicode/tznames.h index 2b494734b739..1ae9bf3e56eb 100644 --- a/deps/icu-small/source/i18n/unicode/tznames.h +++ b/deps/icu-small/source/i18n/unicode/tznames.h @@ -260,7 +260,7 @@ class U_I18N_API TimeZoneNames : public UObject { * below. *

    *
  1. Check if the ID contains "/". If not, return null. - *
  2. Check if the ID does not start with "Etc/" or "SystemV/". If it does, return null. + *
  3. Check if the ID is associated with a region other than "001" (World) — i.e., not "Etc/" or "SystemV/". If not, return null. *
  4. Extract a substring after the last occurrence of "/". *
  5. Replace "_" with " ". *
diff --git a/deps/icu-small/source/i18n/unicode/ucal.h b/deps/icu-small/source/i18n/unicode/ucal.h index 87b0532c40b9..d51ddcbe11ad 100644 --- a/deps/icu-small/source/i18n/unicode/ucal.h +++ b/deps/icu-small/source/i18n/unicode/ucal.h @@ -1750,7 +1750,7 @@ typedef enum UTimeZoneLocalOption UTimeZoneLocalOption; /**< @stable ICU 69 */ * is, the offset not including DST adjustments. * If the status is set to one of the error code, the value set is unspecified. * @param dstOffset output parameter to receive the DST offset, -* that is, the offset to be added to `rawOffset' to obtain the +* that is, the offset to be added to `rawOffset` to obtain the * total offset between local and GMT time. If DST is not in * effect, this value is zero; otherwise it is a positive value, * typically one hour. diff --git a/deps/icu-small/source/i18n/unicode/vtzone.h b/deps/icu-small/source/i18n/unicode/vtzone.h index 5e5e8d7d7ef7..3d6509c3d01d 100644 --- a/deps/icu-small/source/i18n/unicode/vtzone.h +++ b/deps/icu-small/source/i18n/unicode/vtzone.h @@ -248,13 +248,13 @@ class U_I18N_API VTimeZone : public BasicTimeZone { * * @param date moment in time for which to return offsets, in * units of milliseconds from January 1, 1970 0:00 GMT, either GMT - * time or local wall time, depending on `local'. - * @param local if true, `date' is local wall time; otherwise it + * time or local wall time, depending on `local`. + * @param local if true, `date` is local wall time; otherwise it * is in GMT time. * @param rawOffset output parameter to receive the raw offset, that * is, the offset not including DST adjustments * @param dstOffset output parameter to receive the DST offset, - * that is, the offset to be added to `rawOffset' to obtain the + * that is, the offset to be added to `rawOffset` to obtain the * total offset between local and GMT time. If DST is not in * effect, this value is zero; otherwise it is a positive value, * typically one hour. diff --git a/deps/icu-small/source/i18n/uregex.cpp b/deps/icu-small/source/i18n/uregex.cpp index 5a5ff1d0387d..54f103aa9f95 100644 --- a/deps/icu-small/source/i18n/uregex.cpp +++ b/deps/icu-small/source/i18n/uregex.cpp @@ -1877,7 +1877,7 @@ int32_t RegexCImpl::split(RegularExpression *regexp, i++; // Set up to extract the capture group contents into the dest buffer. - destFields[i] = &destBuf[destIdx]; + destFields[i] = (destBuf == nullptr) ? nullptr : &destBuf[destIdx]; tStatus = U_ZERO_ERROR; int32_t t = uregex_group(reinterpret_cast(regexp), groupNum, diff --git a/deps/icu-small/source/i18n/usearch.cpp b/deps/icu-small/source/i18n/usearch.cpp index e36d0f2cfe53..d10c53bc20d1 100644 --- a/deps/icu-small/source/i18n/usearch.cpp +++ b/deps/icu-small/source/i18n/usearch.cpp @@ -1374,8 +1374,8 @@ struct CEIBuffer { CEI defBuf[DEFAULT_CEBUFFER_SIZE]; CEI *buf; int32_t bufSize; - int32_t firstIx; - int32_t limitIx; + int64_t firstIx; + int64_t limitIx; UCollationElements *ceIter; UStringSearch *strSearch; @@ -1383,8 +1383,8 @@ struct CEIBuffer { CEIBuffer(UStringSearch *ss, UErrorCode *status); ~CEIBuffer(); - const CEI *get(int32_t index); - const CEI *getPrevious(int32_t index); + const CEI *get(int64_t index); + const CEI *getPrevious(int64_t index); }; @@ -1437,8 +1437,8 @@ CEIBuffer::~CEIBuffer() { // where n is the largest index to have been fetched by some previous call to this function. // The CE value will be UCOL__PROCESSED_NULLORDER at end of input. // -const CEI *CEIBuffer::get(int32_t index) { - int i = index % bufSize; +const CEI *CEIBuffer::get(int64_t index) { + int i = static_cast(index % bufSize); if (index>=firstIx && index(index % bufSize); if (index>=firstIx && index 0, this ceb.get gets a CE that is as far back in the ring buffer // (compared to the last CE fetched for the previous targetIx value) as we need to go @@ -2104,7 +2104,7 @@ U_CAPI UBool U_EXPORT2 usearch_searchBackwards(UStringSearch *strsrch, } CEIBuffer ceb(strsrch, status); - int32_t targetIx = 0; + int64_t targetIx = 0; /* * Pre-load the buffer with the CE's for the grapheme @@ -2142,7 +2142,7 @@ U_CAPI UBool U_EXPORT2 usearch_searchBackwards(UStringSearch *strsrch, int32_t patIx; UBool found; - int32_t limitIx = targetIx; + int64_t limitIx = targetIx; int32_t mStart = -1; int32_t mLimit = -1; int32_t minLimit; @@ -2170,7 +2170,7 @@ U_CAPI UBool U_EXPORT2 usearch_searchBackwards(UStringSearch *strsrch, } // Inner loop checks for a match beginning at each // position from the outer loop. - int32_t targetIxOffset = 0; + int64_t targetIxOffset = 0; for (patIx = strsrch->pattern.pcesLength - 1; patIx >= 0; patIx -= 1) { int64_t patCE = strsrch->pattern.pces[patIx]; diff --git a/deps/icu-small/source/i18n/uspoof.cpp b/deps/icu-small/source/i18n/uspoof.cpp index 51cf99564ba6..04c16fe4236c 100644 --- a/deps/icu-small/source/i18n/uspoof.cpp +++ b/deps/icu-small/source/i18n/uspoof.cpp @@ -169,7 +169,7 @@ uspoof_clone(const USpoofChecker *sc, UErrorCode *status) { } if (U_FAILURE(*status)) { delete result; - result = nullptr; + return nullptr; } return result->asUSpoofChecker(); } diff --git a/deps/icu-small/source/i18n/uspoof_impl.cpp b/deps/icu-small/source/i18n/uspoof_impl.cpp index c727fafb37b1..74a6498f2411 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.cpp +++ b/deps/icu-small/source/i18n/uspoof_impl.cpp @@ -735,7 +735,13 @@ void *SpoofData::reserveSpace(int32_t numBytes, UErrorCode &status) { numBytes = (numBytes + 15) & ~15; // Round up to a multiple of 16 uint32_t returnOffset = fMemLimit; fMemLimit += numBytes; - fRawData = static_cast(uprv_realloc(fRawData, fMemLimit)); + SpoofDataHeader *newRawData = + static_cast(uprv_realloc(fRawData, fMemLimit)); + if (newRawData == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + fRawData = newRawData; fRawData->fLength = fMemLimit; uprv_memset((char *)fRawData + returnOffset, 0, numBytes); initPtrs(status); diff --git a/deps/icu-small/source/i18n/utf16collationiterator.cpp b/deps/icu-small/source/i18n/utf16collationiterator.cpp index 64c454b5d368..0d0e0b10e372 100644 --- a/deps/icu-small/source/i18n/utf16collationiterator.cpp +++ b/deps/icu-small/source/i18n/utf16collationiterator.cpp @@ -295,15 +295,14 @@ FCDUTF16CollationIterator::previousCodePoint(UErrorCode &errorCode) { return U_SENTINEL; } c = *--pos; - if(CollationFCD::hasLccc(c)) { - if(CollationFCD::maybeTibetanCompositeVowel(c) || - (pos != start && CollationFCD::hasTccc(*(pos - 1)))) { - ++pos; - if(!previousSegment(errorCode)) { - return U_SENTINEL; - } - c = *--pos; + if (CollationFCD::hasLccc(c) && + (CollationFCD::maybeTibetanCompositeVowel(c) || + CollationFCD::hasTcccBefore(start, pos))) { + ++pos; + if(!previousSegment(errorCode)) { + return U_SENTINEL; } + c = *--pos; } break; } else if(checkDir == 0 && pos != start) { diff --git a/deps/icu-small/source/i18n/vtzone.cpp b/deps/icu-small/source/i18n/vtzone.cpp index 8c0295bdcbe8..da36f8cb390c 100644 --- a/deps/icu-small/source/i18n/vtzone.cpp +++ b/deps/icu-small/source/i18n/vtzone.cpp @@ -2243,7 +2243,7 @@ VTimeZone::writeZonePropsByDOM(VTZWriter& writer, UBool isDst, const UnicodeStri appendAsciiDigits(dayOfMonth, 0, dstr); writer.write(dstr); if (untilTime != MAX_MILLIS) { - appendUNTIL(writer, getDateTimeString(untilTime + fromOffset, dstr, status), status); + appendUNTIL(writer, getUTCDateTimeString(untilTime, dstr, status), status); if (U_FAILURE(status)) { return; } @@ -2279,7 +2279,7 @@ VTimeZone::writeZonePropsByDOW(VTZWriter& writer, UBool isDst, const UnicodeStri writer.write(ICAL_DOW_NAMES[dayOfWeek - 1]); // SU, MO, TU... if (untilTime != MAX_MILLIS) { - appendUNTIL(writer, getDateTimeString(untilTime + fromOffset, dstr, status), status); + appendUNTIL(writer, getUTCDateTimeString(untilTime, dstr, status), status); if (U_FAILURE(status)) { return; } diff --git a/deps/icu-small/source/i18n/vzone.cpp b/deps/icu-small/source/i18n/vzone.cpp index 50935618edea..2deef050e94c 100644 --- a/deps/icu-small/source/i18n/vzone.cpp +++ b/deps/icu-small/source/i18n/vzone.cpp @@ -83,30 +83,60 @@ U_CAPI void U_EXPORT2 vzone_write(VZone* zone, char16_t* & result, int32_t & resultLength, UErrorCode& status) { UnicodeString s; ((VTimeZone*)zone)->VTimeZone::write(s, status); + if (U_FAILURE(status)) { + result = nullptr; + resultLength = 0; + return; + } resultLength = s.length(); - result = (char16_t*)uprv_malloc(resultLength); - memcpy(result,s.getBuffer(),resultLength); + result = static_cast(uprv_malloc(resultLength * sizeof(char16_t))); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + resultLength = 0; + return; + } + memcpy(result, s.getBuffer(), resultLength * sizeof(char16_t)); } U_CAPI void U_EXPORT2 vzone_writeFromStart(VZone* zone, UDate start, char16_t* & result, int32_t & resultLength, UErrorCode& status) { UnicodeString s; ((VTimeZone*)zone)->VTimeZone::write(start, s, status); + if (U_FAILURE(status)) { + result = nullptr; + resultLength = 0; + return; + } resultLength = s.length(); - result = (char16_t*)uprv_malloc(resultLength); - memcpy(result,s.getBuffer(),resultLength); + result = static_cast(uprv_malloc(resultLength * sizeof(char16_t))); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + resultLength = 0; + return; + } + memcpy(result, s.getBuffer(), resultLength * sizeof(char16_t)); } U_CAPI void U_EXPORT2 vzone_writeSimple(VZone* zone, UDate time, char16_t* & result, int32_t & resultLength, UErrorCode& status) { UnicodeString s; ((VTimeZone*)zone)->VTimeZone::writeSimple(time, s, status); + if (U_FAILURE(status)) { + result = nullptr; + resultLength = 0; + return; + } resultLength = s.length(); - result = (char16_t*)uprv_malloc(resultLength); - memcpy(result,s.getBuffer(),resultLength); + result = static_cast(uprv_malloc(resultLength * sizeof(char16_t))); + if (result == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + resultLength = 0; + return; + } + memcpy(result, s.getBuffer(), resultLength * sizeof(char16_t)); } U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/i18n/vzone.h b/deps/icu-small/source/i18n/vzone.h index bf9b45ea20d7..51bac50afa80 100644 --- a/deps/icu-small/source/i18n/vzone.h +++ b/deps/icu-small/source/i18n/vzone.h @@ -223,13 +223,13 @@ vzone_getOffset2(VZone* zone, uint8_t era, int32_t year, int32_t month, int32_t * @param zone, the vzone to use * @param date moment in time for which to return offsets, in * units of milliseconds from January 1, 1970 0:00 GMT, either GMT - * time or local wall time, depending on `local'. - * @param local if true, `date' is local wall time; otherwise it + * time or local wall time, depending on `local`. + * @param local if true, `date` is local wall time; otherwise it * is in GMT time. * @param rawOffset output parameter to receive the raw offset, that * is, the offset not including DST adjustments * @param dstOffset output parameter to receive the DST offset, - * that is, the offset to be added to `rawOffset' to obtain the + * that is, the offset to be added to `rawOffset` to obtain the * total offset between local and GMT time. If DST is not in * effect, this value is zero; otherwise it is a positive value, * typically one hour. diff --git a/deps/icu-small/source/i18n/windtfmt.cpp b/deps/icu-small/source/i18n/windtfmt.cpp index f1d5c25f3ead..954c87baee5c 100644 --- a/deps/icu-small/source/i18n/windtfmt.cpp +++ b/deps/icu-small/source/i18n/windtfmt.cpp @@ -193,7 +193,7 @@ Win32DateFormat::~Win32DateFormat() delete fWindowsLocaleName; } -Win32DateFormat &Win32DateFormat::operator=(const Win32DateFormat &other) +Win32DateFormat& Win32DateFormat::operator=(const Win32DateFormat& other) U_LIFETIME_BOUND { if (this == &other) { return *this; } // self-assignment: no-op // The following handles fCalendar @@ -222,7 +222,9 @@ Win32DateFormat *Win32DateFormat::clone() const } // TODO: Is just ignoring pos the right thing? -UnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, FieldPosition & /* pos */) const +UnicodeString& Win32DateFormat::format(Calendar& cal, + UnicodeString& appendTo U_LIFETIME_BOUND, + FieldPosition& /* pos */) const { FILETIME ft; SYSTEMTIME st_gmt; diff --git a/deps/icu-small/source/i18n/windtfmt.h b/deps/icu-small/source/i18n/windtfmt.h index 0c3f54278523..c03b44e7c50c 100644 --- a/deps/icu-small/source/i18n/windtfmt.h +++ b/deps/icu-small/source/i18n/windtfmt.h @@ -50,9 +50,11 @@ class Win32DateFormat : public DateFormat virtual Win32DateFormat *clone() const; - Win32DateFormat &operator=(const Win32DateFormat &other); + Win32DateFormat& operator=(const Win32DateFormat& other) U_LIFETIME_BOUND; - UnicodeString &format(Calendar &cal, UnicodeString &appendTo, FieldPosition &pos) const; + UnicodeString& format(Calendar& cal, + UnicodeString& appendTo U_LIFETIME_BOUND, + FieldPosition& pos) const; using DateFormat::format; diff --git a/deps/icu-small/source/i18n/winnmfmt.cpp b/deps/icu-small/source/i18n/winnmfmt.cpp index a23e3eb8c58d..7249e52b1db1 100644 --- a/deps/icu-small/source/i18n/winnmfmt.cpp +++ b/deps/icu-small/source/i18n/winnmfmt.cpp @@ -267,7 +267,7 @@ Win32NumberFormat::~Win32NumberFormat() delete fWindowsLocaleName; } -Win32NumberFormat &Win32NumberFormat::operator=(const Win32NumberFormat &other) +Win32NumberFormat& Win32NumberFormat::operator=(const Win32NumberFormat& other) U_LIFETIME_BOUND { if (this == &other) { return *this; } // self-assignment: no-op NumberFormat::operator=(other); @@ -301,17 +301,23 @@ Win32NumberFormat *Win32NumberFormat::clone() const return new Win32NumberFormat(*this); } -UnicodeString& Win32NumberFormat::format(double number, UnicodeString& appendTo, FieldPosition& /* pos */) const +UnicodeString& Win32NumberFormat::format(double number, + UnicodeString& appendTo U_LIFETIME_BOUND, + FieldPosition& /* pos */) const { return format(getMaximumFractionDigits(), appendTo, L"%.16f", number); } -UnicodeString& Win32NumberFormat::format(int32_t number, UnicodeString& appendTo, FieldPosition& /* pos */) const +UnicodeString& Win32NumberFormat::format(int32_t number, + UnicodeString& appendTo U_LIFETIME_BOUND, + FieldPosition& /* pos */) const { return format(getMinimumFractionDigits(), appendTo, L"%I32d", number); } -UnicodeString& Win32NumberFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& /* pos */) const +UnicodeString& Win32NumberFormat::format(int64_t number, + UnicodeString& appendTo U_LIFETIME_BOUND, + FieldPosition& /* pos */) const { return format(getMinimumFractionDigits(), appendTo, L"%I64d", number); } @@ -336,7 +342,9 @@ void Win32NumberFormat::setMinimumFractionDigits(int32_t newValue) NumberFormat::setMinimumFractionDigits(newValue); } -UnicodeString &Win32NumberFormat::format(int32_t numDigits, UnicodeString &appendTo, const wchar_t *fmt, ...) const +UnicodeString& Win32NumberFormat::format(int32_t numDigits, + UnicodeString& appendTo U_LIFETIME_BOUND, + const wchar_t* fmt, ...) const { wchar_t nStackBuffer[STACK_BUFFER_SIZE]; wchar_t *nBuffer = nStackBuffer; diff --git a/deps/icu-small/source/i18n/winnmfmt.h b/deps/icu-small/source/i18n/winnmfmt.h index 1cf87f4d2c09..6b47dc9f6182 100644 --- a/deps/icu-small/source/i18n/winnmfmt.h +++ b/deps/icu-small/source/i18n/winnmfmt.h @@ -46,7 +46,7 @@ class Win32NumberFormat : public NumberFormat virtual Win32NumberFormat *clone() const; - Win32NumberFormat &operator=(const Win32NumberFormat &other); + Win32NumberFormat& operator=(const Win32NumberFormat& other) U_LIFETIME_BOUND; /** * Format a double number. Concrete subclasses must implement @@ -60,7 +60,7 @@ class Win32NumberFormat : public NumberFormat * @return Reference to 'appendTo' parameter. */ virtual UnicodeString& format(double number, - UnicodeString& appendTo, + UnicodeString& appendTo U_LIFETIME_BOUND, FieldPosition& pos) const; /** * Format a long number. Concrete subclasses must implement @@ -74,7 +74,7 @@ class Win32NumberFormat : public NumberFormat * @return Reference to 'appendTo' parameter. */ virtual UnicodeString& format(int32_t number, - UnicodeString& appendTo, + UnicodeString& appendTo U_LIFETIME_BOUND, FieldPosition& pos) const; /** @@ -88,7 +88,7 @@ class Win32NumberFormat : public NumberFormat * @return Reference to 'appendTo' parameter. */ virtual UnicodeString& format(int64_t number, - UnicodeString& appendTo, + UnicodeString& appendTo U_LIFETIME_BOUND, FieldPosition& pos) const; using NumberFormat::format; @@ -147,7 +147,9 @@ class Win32NumberFormat : public NumberFormat virtual UClassID getDynamicClassID() const; private: - UnicodeString &format(int32_t numDigits, UnicodeString &appendTo, const wchar_t *format, ...) const; + UnicodeString& format(int32_t numDigits, + UnicodeString& appendTo U_LIFETIME_BOUND, + const wchar_t* format, ...) const; UBool fCurrency; Locale fLocale; diff --git a/deps/icu-small/source/i18n/zonemeta.cpp b/deps/icu-small/source/i18n/zonemeta.cpp index 6257d4a2b9ca..5737499377a2 100644 --- a/deps/icu-small/source/i18n/zonemeta.cpp +++ b/deps/icu-small/source/i18n/zonemeta.cpp @@ -680,7 +680,7 @@ ZoneMeta::createMetazoneMappings(const UnicodeString &tzid) { const char16_t *mz_from = gDefaultFrom; const char16_t *mz_to = gDefaultTo; - if (ures_getSize(mz) == 3) { + if (ures_getSize(mz) >= 3) { mz_from = ures_getStringByIndex(mz, 1, nullptr, &status); mz_to = ures_getStringByIndex(mz, 2, nullptr, &status); } diff --git a/deps/icu-small/source/i18n/zrule.cpp b/deps/icu-small/source/i18n/zrule.cpp index 39f6eeedfd4c..e1a803f67c36 100644 --- a/deps/icu-small/source/i18n/zrule.cpp +++ b/deps/icu-small/source/i18n/zrule.cpp @@ -93,8 +93,12 @@ izrule_getName(IZRule* rule, char16_t* & name, int32_t & nameLength) { UnicodeString s; ((InitialTimeZoneRule*)rule)->InitialTimeZoneRule::getName(s); nameLength = s.length(); - name = (char16_t*)uprv_malloc(nameLength); - memcpy(name, s.getBuffer(), nameLength); + name = (char16_t*)uprv_malloc(nameLength * sizeof(char16_t)); + if (name == nullptr) { + nameLength = 0; + return; + } + memcpy(name, s.getBuffer(), nameLength * sizeof(char16_t)); } U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp index 215be86e1241..ad96c71d9fa0 100644 --- a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp +++ b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp @@ -51,13 +51,10 @@ static const char // For convenience # define cp1047_to_8859(c) cp1047_8859_1[c] -// Our app's name -std::string prog; - /** * Give the usual 1-line documentation and exit */ -void usage() { +void usage(const std::string& prog) { fprintf(stderr, "%s: usage: %s infile.cpp outfile.cpp\n", prog.c_str(), prog.c_str()); } @@ -65,7 +62,7 @@ void usage() { * Delete the output file (if any) * We want to delete even if we didn't generate, because it might be stale. */ -int cleanup(const std::string &outfile) { +int cleanup(const std::string& prog, const std::string &outfile) { const char *outstr = outfile.c_str(); if(outstr && *outstr) { int rc = std::remove(outstr); @@ -364,7 +361,7 @@ bool fixLine(int /*no*/, std::string &linestr) { * @param outfile * @return 1 on err, 0 otherwise */ -int convert(const std::string &infile, const std::string &outfile) { +int convert(const std::string& prog, const std::string &infile, const std::string &outfile) { fprintf(stderr, "escapesrc: %s -> %s\n", infile.c_str(), outfile.c_str()); std::ifstream inf; @@ -373,7 +370,7 @@ int convert(const std::string &infile, const std::string &outfile) { if(!inf.is_open()) { fprintf(stderr, "%s: could not open input file %s\n", prog.c_str(), infile.c_str()); - cleanup(outfile); + cleanup(prog, outfile); return 1; } @@ -405,7 +402,7 @@ int convert(const std::string &infile, const std::string &outfile) { fail: outf.close(); fprintf(stderr, "%s:%d: Fixup failed by %s\n", infile.c_str(), no, prog.c_str()); - cleanup(outfile); + cleanup(prog, outfile); return 1; } @@ -413,15 +410,15 @@ int convert(const std::string &infile, const std::string &outfile) { * Main function */ int main(int argc, const char *argv[]) { - prog = argv[0]; + std::string prog(argv[0]); if(argc != 3) { - usage(); + usage(prog); return 1; } std::string infile = argv[1]; std::string outfile = argv[2]; - return convert(infile, outfile); + return convert(prog, infile, outfile); } diff --git a/deps/icu-small/source/tools/genrb/genrb.cpp b/deps/icu-small/source/tools/genrb/genrb.cpp index f386a67e0220..f5dda152b8b4 100644 --- a/deps/icu-small/source/tools/genrb/genrb.cpp +++ b/deps/icu-small/source/tools/genrb/genrb.cpp @@ -41,7 +41,8 @@ U_NAMESPACE_USE 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); + SRBRoot *newPoolBundle, UBool omitBinaryCollation, + const ResFile& poolBundle, UErrorCode &status); static char *make_res_filename(const char *filename, const char *outputDir, const char *packageName, UErrorCode &status); @@ -122,8 +123,6 @@ static UBool write_java = false; static UBool write_xliff = false; static const char* outputEnc =""; -static ResFile poolBundle; - /*added by Jing*/ static const char* language = nullptr; static const char* xliffOutputFileName = nullptr; @@ -139,6 +138,7 @@ main(int argc, const char *encoding = ""; int i; UBool illegalArg = false; + ResFile poolBundle; U_MAIN_INIT_ARGS(argc, argv); @@ -561,7 +561,7 @@ main(int argc, } processFile(arg, encoding, inputDir, outputDir, filterDir, nullptr, newPoolBundle.getAlias(), - options[NO_BINARY_COLLATION].doesOccur, status); + options[NO_BINARY_COLLATION].doesOccur, poolBundle, status); } poolBundle.close(); @@ -596,7 +596,9 @@ 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) { + UBool omitBinaryCollation, + const ResFile& poolBundle, + UErrorCode &status) { LocalPointer data; LocalUCHARBUFPointer ucbuf; CharString openFileName; diff --git a/deps/icu-small/source/tools/genrb/genrb.h b/deps/icu-small/source/tools/genrb/genrb.h index 019020a34a98..94e011e8b23b 100644 --- a/deps/icu-small/source/tools/genrb/genrb.h +++ b/deps/icu-small/source/tools/genrb/genrb.h @@ -36,17 +36,4 @@ /* The version of genrb */ #define GENRB_VERSION "56" -U_CDECL_BEGIN - -U_CAPI void processFile( - const char *filename, - const char* cp, - const char *inputDir, - const char *outputDir, - const char *packageName, - UBool omitBinaryCollation, - UErrorCode *status); - -U_CDECL_END - #endif diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp index 4b71bcaaa918..1e615cfcd120 100644 --- a/deps/icu-small/source/tools/genrb/parse.cpp +++ b/deps/icu-small/source/tools/genrb/parse.cpp @@ -22,7 +22,6 @@ // Safer use of UnicodeString. #include -#include "unicode/umachine.h" #ifndef UNISTR_FROM_CHAR_EXPLICIT # define UNISTR_FROM_CHAR_EXPLICIT explicit #endif @@ -50,6 +49,7 @@ #include "unicode/ustring.h" #include "unicode/uscript.h" #include "unicode/utf16.h" +#include "unicode/utypes.h" #include "unicode/putil.h" #include "charstr.h" #include "collationbuilder.h" @@ -288,6 +288,7 @@ static char *getInvariantString(ParseState* state, uint32_t *line, struct UStrin struct UString *tokenValue; char *result; + stringLength = 0; expect(state, TOK_STRING, &tokenValue, comment, line, status); if (U_FAILURE(*status)) @@ -2057,28 +2058,8 @@ parseInclude(ParseState* state, char *tag, uint32_t startline, const struct UStr return result; } - - - - -U_STRING_DECL(k_type_string, "string", 6); -U_STRING_DECL(k_type_binary, "binary", 6); U_STRING_DECL(k_type_bin, "bin", 3); -U_STRING_DECL(k_type_table, "table", 5); -U_STRING_DECL(k_type_table_no_fallback, "table(nofallback)", 17); U_STRING_DECL(k_type_int, "int", 3); -U_STRING_DECL(k_type_integer, "integer", 7); -U_STRING_DECL(k_type_array, "array", 5); -U_STRING_DECL(k_type_alias, "alias", 5); -U_STRING_DECL(k_type_intvector, "intvector", 9); -U_STRING_DECL(k_type_import, "import", 6); -U_STRING_DECL(k_type_include, "include", 7); - -/* Various non-standard processing plugins that create one or more special resources. */ -U_STRING_DECL(k_type_plugin_uca_rules, "process(uca_rules)", 18); -U_STRING_DECL(k_type_plugin_collation, "process(collation)", 18); -U_STRING_DECL(k_type_plugin_transliterator, "process(transliterator)", 23); -U_STRING_DECL(k_type_plugin_dependency, "process(dependency)", 19); typedef enum EResourceType { @@ -2100,48 +2081,34 @@ typedef enum EResourceType RESTYPE_RESERVED } EResourceType; -static struct { +static const struct { const char *nameChars; /* only used for debugging */ const char16_t *nameUChars; ParseResourceFunction *parseFunction; } gResourceTypes[] = { {"Unknown", nullptr, nullptr}, - {"string", k_type_string, parseString}, - {"binary", k_type_binary, parseBinary}, - {"table", k_type_table, parseTable}, - {"table(nofallback)", k_type_table_no_fallback, nullptr}, /* parseFunction will never be called */ - {"integer", k_type_integer, parseInteger}, - {"array", k_type_array, parseArray}, - {"alias", k_type_alias, parseAlias}, - {"intvector", k_type_intvector, parseIntVector}, - {"import", k_type_import, parseImport}, - {"include", k_type_include, parseInclude}, - {"process(uca_rules)", k_type_plugin_uca_rules, parseUCARules}, - {"process(collation)", k_type_plugin_collation, nullptr /* not implemented yet */}, - {"process(transliterator)", k_type_plugin_transliterator, parseTransliterator}, - {"process(dependency)", k_type_plugin_dependency, parseDependency}, + {"string", u"string", parseString}, + {"binary", u"binary", parseBinary}, + {"table", u"table", parseTable}, + {"table(nofallback)", u"table(nofallback)", nullptr}, /* parseFunction will never be called */ + {"integer", u"integer", parseInteger}, + {"array", u"array", parseArray}, + {"alias", u"alias", parseAlias}, + {"intvector", u"intvector", parseIntVector}, + {"import", u"import", parseImport}, + {"include", u"include", parseInclude}, + /* Various non-standard processing plugins that create one or more special resources. */ + {"process(uca_rules)", u"process(uca_rules)", parseUCARules}, + {"process(collation)", u"process(collation)", nullptr /* not implemented yet */}, + {"process(transliterator)", u"process(transliterator)", parseTransliterator}, + {"process(dependency)", u"process(dependency)", parseDependency}, {"reserved", nullptr, nullptr} }; void initParser() { - U_STRING_INIT(k_type_string, "string", 6); - U_STRING_INIT(k_type_binary, "binary", 6); U_STRING_INIT(k_type_bin, "bin", 3); - U_STRING_INIT(k_type_table, "table", 5); - U_STRING_INIT(k_type_table_no_fallback, "table(nofallback)", 17); U_STRING_INIT(k_type_int, "int", 3); - U_STRING_INIT(k_type_integer, "integer", 7); - U_STRING_INIT(k_type_array, "array", 5); - U_STRING_INIT(k_type_alias, "alias", 5); - U_STRING_INIT(k_type_intvector, "intvector", 9); - U_STRING_INIT(k_type_import, "import", 6); - U_STRING_INIT(k_type_include, "include", 7); - - U_STRING_INIT(k_type_plugin_uca_rules, "process(uca_rules)", 18); - U_STRING_INIT(k_type_plugin_collation, "process(collation)", 18); - U_STRING_INIT(k_type_plugin_transliterator, "process(transliterator)", 23); - U_STRING_INIT(k_type_plugin_dependency, "process(dependency)", 19); } static inline UBool isTable(enum EResourceType type) { diff --git a/deps/icu-small/source/tools/genrb/reslist.cpp b/deps/icu-small/source/tools/genrb/reslist.cpp index c6748a33b909..7704dc6ce121 100644 --- a/deps/icu-small/source/tools/genrb/reslist.cpp +++ b/deps/icu-small/source/tools/genrb/reslist.cpp @@ -84,15 +84,6 @@ enum { static const int32_t MAX_IMPLICIT_STRING_LENGTH = 40; /* do not store the length explicitly for such strings */ -static const ResFile kNoPoolBundle; - -/* - * res_none() returns the address of kNoResource, - * for use in non-error cases when no resource is to be added to the bundle. - * (nullptr is used in error cases.) - */ -static SResource kNoResource; // TODO: const - static UDataInfo dataInfo= { sizeof(UDataInfo), 0, @@ -144,8 +135,9 @@ void setUsePoolBundle(UBool use) { } // TODO: return const pointer, or find another way to express "none" -struct SResource* res_none() { - return &kNoResource; +SResource* res_none() { + static SResource* kNoResource = new SResource(); + return kNoResource; } SResource::SResource() @@ -182,7 +174,7 @@ TableResource::~TableResource() {} // TODO: clarify that containers adopt new items, even in error cases; use LocalPointer void TableResource::add(SResource *res, int linenumber, UErrorCode &errorCode) { - if (U_FAILURE(errorCode) || res == nullptr || res == &kNoResource) { + if (U_FAILURE(errorCode) || res == nullptr || res == res_none()) { return; } @@ -247,7 +239,7 @@ void TableResource::add(SResource *res, int linenumber, UErrorCode &errorCode) { ArrayResource::~ArrayResource() {} void ArrayResource::add(SResource *res) { - if (res != nullptr && res != &kNoResource) { + if (res != nullptr && res != res_none()) { if (fFirst == nullptr) { fFirst = res; } else { @@ -261,7 +253,7 @@ void ArrayResource::add(SResource *res) { PseudoListResource::~PseudoListResource() {} void PseudoListResource::add(SResource *res) { - if (res != nullptr && res != &kNoResource) { + if (res != nullptr && res != res_none()) { res->fNext = fFirst; fFirst = res; ++fCount; diff --git a/deps/icu-small/source/tools/genrb/reslist.h b/deps/icu-small/source/tools/genrb/reslist.h index 17797bc36cbb..829ceea059b5 100644 --- a/deps/icu-small/source/tools/genrb/reslist.h +++ b/deps/icu-small/source/tools/genrb/reslist.h @@ -97,29 +97,30 @@ struct SRBRoot { public: // TODO: private - SResource *fRoot; // Normally a TableResource. - char *fLocale; - int32_t fIndexLength; - int32_t fMaxTableLength; - UBool fNoFallback; /* see URES_ATT_NO_FALLBACK */ - int8_t fStringsForm; /* default STRINGS_UTF16_V1 */ - UBool fIsPoolBundle; - - char *fKeys; - KeyMapEntry *fKeyMap; - int32_t fKeysBottom, fKeysTop; - int32_t fKeysCapacity; - int32_t fKeysCount; - int32_t fLocalKeyLimit; /* key offset < limit fits into URES_TABLE */ - - icu::UnicodeString f16BitUnits; - int32_t f16BitStringsLength; - - const ResFile *fUsePoolBundle; - int32_t fPoolStringIndexLimit; - int32_t fPoolStringIndex16Limit; - int32_t fLocalStringIndexLimit; - SRBRoot *fWritePoolBundle; + SResource *fRoot; // Normally a TableResource. + char *fLocale; + int32_t fIndexLength; + int32_t fMaxTableLength; + UBool fNoFallback; /* see URES_ATT_NO_FALLBACK */ + int8_t fStringsForm; /* default STRINGS_UTF16_V1 */ + UBool fIsPoolBundle; + + char *fKeys; + KeyMapEntry *fKeyMap; + int32_t fKeysBottom, fKeysTop; + int32_t fKeysCapacity; + int32_t fKeysCount; + int32_t fLocalKeyLimit; /* key offset < limit fits into URES_TABLE */ + + icu::UnicodeString f16BitUnits; + int32_t f16BitStringsLength; + + const ResFile *fUsePoolBundle; + int32_t fPoolStringIndexLimit; + int32_t fPoolStringIndex16Limit; + int32_t fLocalStringIndexLimit; + SRBRoot *fWritePoolBundle; + const ResFile kNoPoolBundle; }; /* write a java resource file */ @@ -139,7 +140,7 @@ void bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* * for use in non-error cases when no resource is to be added to the bundle. * (nullptr is used in error cases.) */ -struct SResource* res_none(); +SResource* res_none(); class ArrayResource; class TableResource; @@ -326,7 +327,9 @@ class StringBaseResource : public SResource { StringBaseResource(int8_t type, const char16_t *value, int32_t len, UErrorCode &errorCode); virtual ~StringBaseResource(); - const char16_t *getBuffer() const { return icu::toUCharPtr(fString.getBuffer()); } + const char16_t* getBuffer() const U_LIFETIME_BOUND { + return icu::toUCharPtr(fString.getBuffer()); + } int32_t length() const { return fString.length(); } virtual void handlePreWrite(uint32_t *byteOffset) override; diff --git a/deps/icu-small/source/tools/icuexportdata/icuexportdata.cpp b/deps/icu-small/source/tools/icuexportdata/icuexportdata.cpp index 954db1d36720..391bfd098d96 100644 --- a/deps/icu-small/source/tools/icuexportdata/icuexportdata.cpp +++ b/deps/icu-small/source/tools/icuexportdata/icuexportdata.cpp @@ -6,10 +6,9 @@ #include #include #include "unicode/localpointer.h" -#include "unicode/umachine.h" #include "unicode/unistr.h" -#include "unicode/urename.h" #include "unicode/uset.h" +#include "unicode/utypes.h" #include #include #include "toolutil.h" @@ -42,11 +41,6 @@ UBool haveCopyright = true; UCPTrieType trieType = UCPTRIE_TYPE_SMALL; const char* destdir = ""; -// Mask constants for modified values in the Script CodePointTrie, values are logically 12-bits. -int16_t DATAEXPORT_SCRIPT_X_WITH_COMMON = 0x0400; -int16_t DATAEXPORT_SCRIPT_X_WITH_INHERITED = 0x0800; -int16_t DATAEXPORT_SCRIPT_X_WITH_OTHER = 0x0c00; - void handleError(ErrorCode& status, int line, const char* context) { if (status.isFailure()) { std::cerr << "Error[" << line << "]: " << context << ": " << status.errorName() << std::endl; @@ -54,378 +48,6 @@ void handleError(ErrorCode& status, int line, const char* context) { } } -class PropertyValueNameGetter : public ValueNameGetter { -public: - PropertyValueNameGetter(UProperty prop) : property(prop) {} - ~PropertyValueNameGetter() override; - const char *getName(uint32_t value) override { - return u_getPropertyValueName(property, value, U_SHORT_PROPERTY_NAME); - } - -private: - UProperty property; -}; - -PropertyValueNameGetter::~PropertyValueNameGetter() {} - -// Dump an aliases = [...] key for properties with aliases -void dumpPropertyAliases(UProperty uproperty, FILE* f) { - int i = U_LONG_PROPERTY_NAME + 1; - - while(true) { - // The API works by having extra names after U_LONG_PROPERTY_NAME, sequentially, - // and returning null after that - const char* alias = u_getPropertyName(uproperty, static_cast(i)); - if (!alias) { - break; - } - if (i == U_LONG_PROPERTY_NAME + 1) { - fprintf(f, "aliases = [\"%s\"", alias); - } else { - fprintf(f, ", \"%s\"", alias); - } - i++; - } - if (i != U_LONG_PROPERTY_NAME + 1) { - fprintf(f, "]\n"); - } -} - -void dumpBinaryProperty(UProperty uproperty, FILE* f) { - IcuToolErrorCode status("icuexportdata: dumpBinaryProperty"); - const char* fullPropName = u_getPropertyName(uproperty, U_LONG_PROPERTY_NAME); - const char* shortPropName = u_getPropertyName(uproperty, U_SHORT_PROPERTY_NAME); - const USet* uset = u_getBinaryPropertySet(uproperty, status); - handleError(status, __LINE__, fullPropName); - - fputs("[[binary_property]]\n", f); - fprintf(f, "long_name = \"%s\"\n", fullPropName); - if (shortPropName) fprintf(f, "short_name = \"%s\"\n", shortPropName); - fprintf(f, "uproperty_discr = 0x%X\n", uproperty); - dumpPropertyAliases(uproperty, f); - usrc_writeUnicodeSet(f, uset, UPRV_TARGET_SYNTAX_TOML); -} - -// If the value exists, dump an indented entry of the format -// `" {discr = , long = , short = , aliases = []},"` -void dumpValueEntry(UProperty uproperty, int v, bool is_mask, FILE* f) { - const char* fullValueName = u_getPropertyValueName(uproperty, v, U_LONG_PROPERTY_NAME); - const char* shortValueName = u_getPropertyValueName(uproperty, v, U_SHORT_PROPERTY_NAME); - if (!fullValueName) { - return; - } - if (is_mask) { - fprintf(f, " {discr = 0x%X", v); - } else { - fprintf(f, " {discr = %i", v); - } - fprintf(f, ", long = \"%s\"", fullValueName); - if (shortValueName) { - fprintf(f, ", short = \"%s\"", shortValueName); - } - int i = U_LONG_PROPERTY_NAME + 1; - while(true) { - // The API works by having extra names after U_LONG_PROPERTY_NAME, sequentially, - // and returning null after that - const char* alias = u_getPropertyValueName(uproperty, v, static_cast(i)); - if (!alias) { - break; - } - if (i == U_LONG_PROPERTY_NAME + 1) { - fprintf(f, ", aliases = [\"%s\"", alias); - } else { - fprintf(f, ", \"%s\"", alias); - } - i++; - } - if (i != U_LONG_PROPERTY_NAME + 1) { - fprintf(f, "]"); - } - fprintf(f, "},\n"); -} - -void dumpEnumeratedProperty(UProperty uproperty, FILE* f) { - IcuToolErrorCode status("icuexportdata: dumpEnumeratedProperty"); - const char* fullPropName = u_getPropertyName(uproperty, U_LONG_PROPERTY_NAME); - const char* shortPropName = u_getPropertyName(uproperty, U_SHORT_PROPERTY_NAME); - const UCPMap* umap = u_getIntPropertyMap(uproperty, status); - handleError(status, __LINE__, fullPropName); - - fputs("[[enum_property]]\n", f); - fprintf(f, "long_name = \"%s\"\n", fullPropName); - if (shortPropName) fprintf(f, "short_name = \"%s\"\n", shortPropName); - fprintf(f, "uproperty_discr = 0x%X\n", uproperty); - dumpPropertyAliases(uproperty, f); - - int32_t minValue = u_getIntPropertyMinValue(uproperty); - U_ASSERT(minValue >= 0); - int32_t maxValue = u_getIntPropertyMaxValue(uproperty); - U_ASSERT(maxValue >= 0); - - fprintf(f, "values = [\n"); - for (int v = minValue; v <= maxValue; v++) { - dumpValueEntry(uproperty, v, false, f); - } - fprintf(f, "]\n"); - - PropertyValueNameGetter valueNameGetter(uproperty); - usrc_writeUCPMap(f, umap, &valueNameGetter, UPRV_TARGET_SYNTAX_TOML); - fputs("\n", f); - - - UCPTrieValueWidth width = UCPTRIE_VALUE_BITS_32; - if (maxValue <= 0xff) { - width = UCPTRIE_VALUE_BITS_8; - } else if (maxValue <= 0xffff) { - width = UCPTRIE_VALUE_BITS_16; - } - LocalUMutableCPTriePointer builder(umutablecptrie_fromUCPMap(umap, status)); - LocalUCPTriePointer utrie(umutablecptrie_buildImmutable( - builder.getAlias(), - trieType, - width, - status)); - handleError(status, __LINE__, fullPropName); - - fputs("[enum_property.code_point_trie]\n", f); - usrc_writeUCPTrie(f, shortPropName, utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); -} - -/* -* Export Bidi_Mirroring_Glyph values (code points) in a similar way to how enumerated -* properties are dumped to file. -* Note: the data will store 0 for code points without a value defined for -* Bidi_Mirroring_Glyph. -*/ -void dumpBidiMirroringGlyph(FILE* f) { - UProperty uproperty = UCHAR_BIDI_MIRRORING_GLYPH; - IcuToolErrorCode status("icuexportdata: dumpBidiMirroringGlyph"); - const char* fullPropName = u_getPropertyName(uproperty, U_LONG_PROPERTY_NAME); - const char* shortPropName = u_getPropertyName(uproperty, U_SHORT_PROPERTY_NAME); - handleError(status, __LINE__, fullPropName); - - // Store 21-bit code point as is - UCPTrieValueWidth width = UCPTRIE_VALUE_BITS_32; - - // note: unlike dumpEnumeratedProperty, which can get inversion map data using - // u_getIntPropertyMap(uproperty), the only reliable way to get Bidi_Mirroring_Glyph - // is to use u_charMirror(cp) over the code point space. - LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status)); - for(UChar32 c = UCHAR_MIN_VALUE; c <= UCHAR_MAX_VALUE; c++) { - UChar32 mirroringGlyph = u_charMirror(c); - // The trie builder code throws an error when it cannot compress the data sufficiently. - // Therefore, when the value is undefined for a code point, keep a 0 in the trie - // instead of the ICU API behavior of returning the code point value. Using 0 - // results in a relatively significant space savings by not including redundant data. - if (c != mirroringGlyph) { - umutablecptrie_set(builder.getAlias(), c, mirroringGlyph, status); - } - } - - LocalUCPTriePointer utrie(umutablecptrie_buildImmutable( - builder.getAlias(), - trieType, - width, - status)); - handleError(status, __LINE__, fullPropName); - - // currently a trie and inversion map are the same (as relied upon in characterproperties.cpp) - const UCPMap* umap = reinterpret_cast(utrie.getAlias()); - - fputs("[[enum_property]]\n", f); - fprintf(f, "long_name = \"%s\"\n", fullPropName); - if (shortPropName) { - fprintf(f, "short_name = \"%s\"\n", shortPropName); - } - fprintf(f, "uproperty_discr = 0x%X\n", uproperty); - dumpPropertyAliases(uproperty, f); - - usrc_writeUCPMap(f, umap, nullptr, UPRV_TARGET_SYNTAX_TOML); - fputs("\n", f); - - fputs("[enum_property.code_point_trie]\n", f); - usrc_writeUCPTrie(f, shortPropName, utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); -} - -// After printing property value `v`, print `mask` if and only if `mask` comes immediately -// after the property in the listing -void maybeDumpMaskValue(UProperty uproperty, uint32_t v, uint32_t mask, FILE* f) { - if (U_MASK(v) < mask && U_MASK(v + 1) > mask) - dumpValueEntry(uproperty, mask, true, f); -} - -void dumpGeneralCategoryMask(FILE* f) { - IcuToolErrorCode status("icuexportdata: dumpGeneralCategoryMask"); - UProperty uproperty = UCHAR_GENERAL_CATEGORY_MASK; - - fputs("[[mask_property]]\n", f); - const char* fullPropName = u_getPropertyName(uproperty, U_LONG_PROPERTY_NAME); - const char* shortPropName = u_getPropertyName(uproperty, U_SHORT_PROPERTY_NAME); - fprintf(f, "long_name = \"%s\"\n", fullPropName); - if (shortPropName) fprintf(f, "short_name = \"%s\"\n", shortPropName); - fprintf(f, "uproperty_discr = 0x%X\n", uproperty); - dumpPropertyAliases(uproperty, f); - - - fprintf(f, "mask_for = \"General_Category\"\n"); - int32_t minValue = u_getIntPropertyMinValue(UCHAR_GENERAL_CATEGORY); - U_ASSERT(minValue >= 0); - int32_t maxValue = u_getIntPropertyMaxValue(UCHAR_GENERAL_CATEGORY); - U_ASSERT(maxValue >= 0); - - fprintf(f, "values = [\n"); - for (int32_t v = minValue; v <= maxValue; v++) { - dumpValueEntry(uproperty, U_MASK(v), true, f); - - // We want to dump these masks "in order", which means they - // should come immediately after every property they contain - maybeDumpMaskValue(uproperty, v, U_GC_L_MASK, f); - maybeDumpMaskValue(uproperty, v, U_GC_LC_MASK, f); - maybeDumpMaskValue(uproperty, v, U_GC_M_MASK, f); - maybeDumpMaskValue(uproperty, v, U_GC_N_MASK, f); - maybeDumpMaskValue(uproperty, v, U_GC_Z_MASK, f); - maybeDumpMaskValue(uproperty, v, U_GC_C_MASK, f); - maybeDumpMaskValue(uproperty, v, U_GC_P_MASK, f); - maybeDumpMaskValue(uproperty, v, U_GC_S_MASK, f); - } - fprintf(f, "]\n"); -} - -namespace { - -void U_CALLCONV -set_add(USet *set, UChar32 c) { - UnicodeSet::fromUSet(set)->add(c); -} - -void U_CALLCONV -set_addRange(USet *set, UChar32 start, UChar32 end) { - UnicodeSet::fromUSet(set)->add(start, end); -} - -} - -UnicodeSet getScriptExtensionsCodePoints(IcuToolErrorCode &errorCode) { - UnicodeSet scxCPs; - USetAdder sa = { - scxCPs.toUSet(), - set_add, - set_addRange, - nullptr, // don't need addString, - nullptr, // don't need remove() - nullptr // don't need removeRange() - }; - uprv_addScriptExtensionsCodePoints(&sa, errorCode); - return scxCPs; -} - -void dumpScriptExtensions(FILE* f) { - IcuToolErrorCode status("icuexportdata: dumpScriptExtensions"); - - fputs("[[script_extensions]]\n", f); - const char* scxFullPropName = u_getPropertyName(UCHAR_SCRIPT_EXTENSIONS, U_LONG_PROPERTY_NAME); - const char* scxShortPropName = u_getPropertyName(UCHAR_SCRIPT_EXTENSIONS, U_SHORT_PROPERTY_NAME); - fprintf(f, "long_name = \"%s\"\n", scxFullPropName); - if (scxShortPropName) fprintf(f, "short_name = \"%s\"\n", scxShortPropName); - fprintf(f, "uproperty_discr = 0x%X\n", UCHAR_SCRIPT_EXTENSIONS); - dumpPropertyAliases(UCHAR_SCRIPT_EXTENSIONS, f); - - // We want to use 16 bits for our exported trie of sc/scx data because we - // need 12 bits to match the 12 bits of data stored for sc/scx in the trie - // in the uprops.icu data file. - UCPTrieValueWidth scWidth = UCPTRIE_VALUE_BITS_16; - - // Create a mutable UCPTrie builder populated with Script property values data. - const UCPMap* scInvMap = u_getIntPropertyMap(UCHAR_SCRIPT, status); - handleError(status, __LINE__, scxFullPropName); - LocalUMutableCPTriePointer builder(umutablecptrie_fromUCPMap(scInvMap, status)); - handleError(status, __LINE__, scxFullPropName); - - // The values for the output scx companion array. - // Invariant is that all subvectors are distinct. - std::vector< std::vector > outputDedupVec; - - // The sc/scx companion array is an array of arrays (of script codes) - fputs("script_code_array = [\n", f); - UnicodeSet scxCodePoints = getScriptExtensionsCodePoints(status); - for(const UChar32 cp : scxCodePoints.codePoints()) { - // Get the Script value - uint32_t scVal = umutablecptrie_get(builder.getAlias(), cp); - // Get the Script_Extensions value (array of Script codes) - const int32_t SCX_ARRAY_CAPACITY = 32; - UScriptCode scxValArray[SCX_ARRAY_CAPACITY]; - int32_t numScripts = uscript_getScriptExtensions(cp, scxValArray, SCX_ARRAY_CAPACITY, status); - handleError(status, __LINE__, scxFullPropName); - - // Convert the scx array into a vector - std::vector scxValVec; - for(int i = 0; i < numScripts; i++) { - scxValVec.push_back(scxValArray[i]); - } - // Ensure that it is sorted - std::sort(scxValVec.begin(), scxValVec.end()); - // Copy the Script value into the first position of the scx array only - // if we have the "other" case (Script value is not Common nor Inherited). - // This offers faster access when users want only the Script value. - if (scVal != USCRIPT_COMMON && scVal != USCRIPT_INHERITED) { - scxValVec.insert(scxValVec.begin(), scVal); - } - - // See if there is already an scx value array matching the newly built one. - // If there is, then use its index. - // If not, then append the new value array. - bool isScxValUnique = true; - size_t outputIndex = 0; - for (outputIndex = 0; outputIndex < outputDedupVec.size(); outputIndex++) { - if (outputDedupVec[outputIndex] == scxValVec) { - isScxValUnique = false; - break; - } - } - - if (isScxValUnique) { - outputDedupVec.push_back(scxValVec); - usrc_writeArray(f, " [", scxValVec.data(), 16, scxValVec.size(), " ", "],\n"); - } - - // We must update the value in the UCPTrie for the code point to contain: - // 9..0 the Script code in the lower 10 bits when 11..10 is 0, else it is - // the index into the companion array - // 11..10 the same higher-order 2 bits in the trie in uprops.icu indicating whether - // 3: other - // 2: Script=Inherited - // 1: Script=Common - // 0: Script=value in 9..0 (N/A because we are in this loop to create the companion array for non-0 cases) - uint16_t mask = 0; - if (scVal == USCRIPT_COMMON) { - mask = DATAEXPORT_SCRIPT_X_WITH_COMMON; - } else if (scVal == USCRIPT_INHERITED) { - mask = DATAEXPORT_SCRIPT_X_WITH_INHERITED; - } else { - mask = DATAEXPORT_SCRIPT_X_WITH_OTHER; - } - - // The new trie value is the index into the new array with the high order bits set - uint32_t newScVal = outputIndex | mask; - - // Update the code point in the mutable trie builder with the trie value - umutablecptrie_set(builder.getAlias(), cp, newScVal, status); - handleError(status, __LINE__, scxFullPropName); - } - fputs("]\n\n", f); // Print the TOML close delimiter for the outer array. - - // Convert from mutable trie builder to immutable trie. - LocalUCPTriePointer utrie(umutablecptrie_buildImmutable( - builder.getAlias(), - trieType, - scWidth, - status)); - handleError(status, __LINE__, scxFullPropName); - - fputs("[script_extensions.code_point_trie]\n", f); - usrc_writeUCPTrie(f, scxShortPropName, utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); -} - FILE* prepareOutputFile(const char* basename) { IcuToolErrorCode status("icuexportdata"); CharString outFileName; @@ -1072,15 +694,14 @@ static UOption options[]={ void printHelp(FILE* stdfile, const char* program) { fprintf(stdfile, - "usage: %s -m mode [-options] [--all | properties...]\n" + "usage: %s -m mode [-options]\n" "\tdump Unicode property data to .toml files\n" "options:\n" "\t-h or -? or --help this usage text\n" "\t-V or --version show a version message\n" - "\t-m or --mode mode: currently only 'uprops', 'ucase', and 'norm', but more may be added\n" + "\t-m or --mode mode: currently only 'norm', but more may be added\n" "\t --trie-type set the trie type (small or fast, default small)\n" "\t-d or --destdir destination directory, followed by the path\n" - "\t --all write out all properties known to icuexportdata\n" "\t --index write an _index.toml summarizing all data exported\n" "\t-c or --copyright include a copyright notice\n" "\t-v or --verbose Turn on verbose output\n" @@ -1088,209 +709,6 @@ void printHelp(FILE* stdfile, const char* program) { program); } -int exportUprops(int argc, char* argv[]) { - // Load list of Unicode properties - std::vector propNames; - for (int i=1; i(i); - const char* propName = u_getPropertyName(uprop, U_SHORT_PROPERTY_NAME); - if (propName == nullptr) { - propName = u_getPropertyName(uprop, U_LONG_PROPERTY_NAME); - if (propName != nullptr && VERBOSE) { - std::cerr << "Note: falling back to long name for: " << propName << std::endl; - } - } - if (propName != nullptr) { - propNames.push_back(propName); - } else { - std::cerr << "Warning: Could not find name for: " << uprop << std::endl; - } - i++; - } - } - - if (propNames.empty() - || options[OPT_HELP_H].doesOccur - || options[OPT_HELP_QUESTION_MARK].doesOccur - || !options[OPT_MODE].doesOccur) { - FILE *stdfile=argc<0 ? stderr : stdout; - fprintf(stdfile, - "usage: %s -m uprops [-options] [--all | properties...]\n" - "\tdump Unicode property data to .toml files\n" - "options:\n" - "\t-h or -? or --help this usage text\n" - "\t-V or --version show a version message\n" - "\t-m or --mode mode: currently only 'uprops', but more may be added\n" - "\t --trie-type set the trie type (small or fast, default small)\n" - "\t-d or --destdir destination directory, followed by the path\n" - "\t --all write out all properties known to icuexportdata\n" - "\t --index write an _index.toml summarizing all data exported\n" - "\t-c or --copyright include a copyright notice\n" - "\t-v or --verbose Turn on verbose output\n" - "\t-q or --quiet do not display warnings and progress\n", - argv[0]); - return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; - } - - const char* mode = options[OPT_MODE].value; - if (uprv_strcmp(mode, "uprops") != 0) { - fprintf(stderr, "Invalid option for --mode (must be uprops)\n"); - return U_ILLEGAL_ARGUMENT_ERROR; - } - - if (options[OPT_TRIE_TYPE].doesOccur) { - if (uprv_strcmp(options[OPT_TRIE_TYPE].value, "fast") == 0) { - trieType = UCPTRIE_TYPE_FAST; - } else if (uprv_strcmp(options[OPT_TRIE_TYPE].value, "small") == 0) { - trieType = UCPTRIE_TYPE_SMALL; - } else { - fprintf(stderr, "Invalid option for --trie-type (must be small or fast)\n"); - return U_ILLEGAL_ARGUMENT_ERROR; - } - } - - for (const char* propName : propNames) { - UProperty propEnum = u_getPropertyEnum(propName); - if (propEnum == UCHAR_INVALID_CODE) { - std::cerr << "Error: Invalid property alias: " << propName << std::endl; - return U_ILLEGAL_ARGUMENT_ERROR; - } - - FILE* f = prepareOutputFile(propName); - - UVersionInfo versionInfo; - u_getUnicodeVersion(versionInfo); - char uvbuf[U_MAX_VERSION_STRING_LENGTH]; - u_versionToString(versionInfo, uvbuf); - fprintf(f, "icu_version = \"%s\"\nunicode_version = \"%s\"\n\n", - U_ICU_VERSION, - uvbuf); - - if (propEnum < UCHAR_BINARY_LIMIT) { - dumpBinaryProperty(propEnum, f); - } else if (UCHAR_INT_START <= propEnum && propEnum <= UCHAR_INT_LIMIT) { - dumpEnumeratedProperty(propEnum, f); - } else if (propEnum == UCHAR_GENERAL_CATEGORY_MASK) { - dumpGeneralCategoryMask(f); - } else if (propEnum == UCHAR_BIDI_MIRRORING_GLYPH) { - dumpBidiMirroringGlyph(f); - } else if (propEnum == UCHAR_SCRIPT_EXTENSIONS) { - dumpScriptExtensions(f); - } else { - std::cerr << "Don't know how to write property: " << propEnum << std::endl; - return U_INTERNAL_PROGRAM_ERROR; - } - - fclose(f); - } - - if (options[OPT_INDEX].doesOccur) { - FILE* f = prepareOutputFile("_index"); - fprintf(f, "index = [\n"); - for (const char* propName : propNames) { - // At this point, propName is a valid property name, so it should be alphanum ASCII - fprintf(f, " { filename=\"%s.toml\" },\n", propName); - } - fprintf(f, "]\n"); - fclose(f); - } - - return 0; -} - -struct AddRangeHelper { - UMutableCPTrie* ucptrie; -}; - -static UBool U_CALLCONV -addRangeToUCPTrie(const void* context, UChar32 start, UChar32 end, uint32_t value) { - IcuToolErrorCode status("addRangeToUCPTrie"); - UMutableCPTrie* ucptrie = static_cast(context)->ucptrie; - umutablecptrie_setRange(ucptrie, start, end, value, status); - handleError(status, __LINE__, "setRange"); - - return true; -} - -int exportCase(int argc, char* argv[]) { - if (argc > 1) { - fprintf(stderr, "ucase mode does not expect additional arguments\n"); - return U_ILLEGAL_ARGUMENT_ERROR; - } - (void) argv; // Suppress unused variable warning - - IcuToolErrorCode status("icuexportdata"); - LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status)); - handleError(status, __LINE__, "exportCase"); - - int32_t exceptionsLength, unfoldLength; - const UCaseProps *caseProps = ucase_getSingleton(&exceptionsLength, &unfoldLength); - const UTrie2* caseTrie = &caseProps->trie; - - AddRangeHelper helper = { builder.getAlias() }; - utrie2_enum(caseTrie, nullptr, addRangeToUCPTrie, &helper); - - UCPTrieValueWidth width = UCPTRIE_VALUE_BITS_16; - LocalUCPTriePointer utrie(umutablecptrie_buildImmutable( - builder.getAlias(), - trieType, - width, - status)); - handleError(status, __LINE__, "exportCase"); - - FILE* f = prepareOutputFile("ucase"); - - UVersionInfo versionInfo; - u_getUnicodeVersion(versionInfo); - char uvbuf[U_MAX_VERSION_STRING_LENGTH]; - u_versionToString(versionInfo, uvbuf); - fprintf(f, "icu_version = \"%s\"\nunicode_version = \"%s\"\n\n", - U_ICU_VERSION, - uvbuf); - - fputs("[ucase.code_point_trie]\n", f); - usrc_writeUCPTrie(f, "case_trie", utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML); - fputs("\n", f); - - const char* indent = " "; - const char* suffix = "\n]\n"; - - fputs("[ucase.exceptions]\n", f); - const char* exceptionsPrefix = "exceptions = [\n "; - int32_t exceptionsWidth = 16; - usrc_writeArray(f, exceptionsPrefix, caseProps->exceptions, exceptionsWidth, - exceptionsLength, indent, suffix); - fputs("\n", f); - - fputs("[ucase.unfold]\n", f); - const char* unfoldPrefix = "unfold = [\n "; - int32_t unfoldWidth = 16; - usrc_writeArray(f, unfoldPrefix, caseProps->unfold, unfoldWidth, - unfoldLength, indent, suffix); - - return 0; -} - #if !UCONFIG_NO_NORMALIZATION int exportNorm() { @@ -1467,11 +885,6 @@ int main(int argc, char* argv[]) { return U_ILLEGAL_ARGUMENT_ERROR; #endif } - if (uprv_strcmp(mode, "uprops") == 0) { - return exportUprops(argc, argv); - } else if (uprv_strcmp(mode, "ucase") == 0) { - return exportCase(argc, argv); - } fprintf(stderr, "Invalid option for --mode (must be uprops, ucase, or norm)\n"); return U_ILLEGAL_ARGUMENT_ERROR; diff --git a/deps/icu-small/source/tools/toolutil/dbgutil.cpp b/deps/icu-small/source/tools/toolutil/dbgutil.cpp index 824c6c8ba8cc..478a3df8da5f 100644 --- a/deps/icu-small/source/tools/toolutil/dbgutil.cpp +++ b/deps/icu-small/source/tools/toolutil/dbgutil.cpp @@ -24,7 +24,9 @@ U_NAMESPACE_USE static UnicodeString **strs = nullptr; -static const UnicodeString& _fieldString(UDebugEnumType type, int32_t field, UnicodeString& fillin) { +static const UnicodeString& _fieldString(UDebugEnumType type, + int32_t field, + UnicodeString& fillin U_LIFETIME_BOUND) { const char *str = udbg_enumName(type, field); if(str == nullptr) { return fillin.remove(); @@ -136,8 +138,8 @@ udbg_stod(const UnicodeString &s) return atof(ch); } -U_CAPI UnicodeString * -udbg_escape(const UnicodeString &src, UnicodeString *dst) +U_CAPI UnicodeString* +udbg_escape(const UnicodeString& src, UnicodeString* dst U_LIFETIME_BOUND) { dst->remove(); for (int32_t i = 0; i < src.length(); ++i) { diff --git a/deps/icu-small/source/tools/toolutil/dbgutil.h b/deps/icu-small/source/tools/toolutil/dbgutil.h index 43fe2171b4a8..f3397eec9643 100644 --- a/deps/icu-small/source/tools/toolutil/dbgutil.h +++ b/deps/icu-small/source/tools/toolutil/dbgutil.h @@ -37,8 +37,8 @@ U_CAPI int32_t U_EXPORT2 udbg_stoi(const icu::UnicodeString &s); U_CAPI double U_EXPORT2 udbg_stod(const icu::UnicodeString &s); -U_CAPI icu::UnicodeString * U_EXPORT2 -udbg_escape(const icu::UnicodeString &s, icu::UnicodeString *dst); +U_CAPI icu::UnicodeString* U_EXPORT2 +udbg_escape(const icu::UnicodeString& s, icu::UnicodeString* dst U_LIFETIME_BOUND); #endif diff --git a/deps/icu-small/source/tools/toolutil/json-json.hpp b/deps/icu-small/source/tools/toolutil/json-json.hpp index e502b671ec48..bc16fcef6d4a 100644 --- a/deps/icu-small/source/tools/toolutil/json-json.hpp +++ b/deps/icu-small/source/tools/toolutil/json-json.hpp @@ -7757,22 +7757,22 @@ class lexer : public lexer_base } else { - // ICU PATCH - See ICU-23090 - codepoint = codepoint1; + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; } } else { - // ICU PATCH - See ICU-23090 - codepoint = codepoint1; + error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; + return token_type::parse_error; } } else { if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF)) { - // ICU PATCH - See ICU-23090 - codepoint = codepoint1; + error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF"; + return token_type::parse_error; } } diff --git a/deps/icu-small/source/tools/toolutil/package.h b/deps/icu-small/source/tools/toolutil/package.h index ea60c13a74a5..38674fcefea1 100644 --- a/deps/icu-small/source/tools/toolutil/package.h +++ b/deps/icu-small/source/tools/toolutil/package.h @@ -27,7 +27,7 @@ // .dat package file representation ---------------------------------------- *** -#define STRING_STORE_SIZE 100000 +#define STRING_STORE_SIZE 300000 #define MAX_PKG_NAME_LENGTH 64 typedef void CheckDependency(void *context, const char *itemName, const char *targetName); diff --git a/tools/icu/current_ver.dep b/tools/icu/current_ver.dep index 577b585578ee..9b7875e58522 100644 --- a/tools/icu/current_ver.dep +++ b/tools/icu/current_ver.dep @@ -1,6 +1,6 @@ [ { - "url": "https://github.com/unicode-org/icu/releases/download/release-78.3/icu4c-78.3-sources.tgz", - "sha256": "3a2e7a47604ba702f345878308e6fefeca612ee895cf4a5f222e7955fabfe0c0" + "url": "https://github.com/unicode-org/icu/releases/download/release-79.1/icu4c-79.1-sources.tgz", + "sha256": "06fa63ecb521048f8082f12ad988f6b678d90cbd88aafce24cbc94902b191d99" } ]