diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/charset | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/charset')
28 files changed, 13121 insertions, 0 deletions
diff --git a/util/charset/benchmark/to_lower/main.cpp b/util/charset/benchmark/to_lower/main.cpp new file mode 100644 index 0000000000..e95fdc2371 --- /dev/null +++ b/util/charset/benchmark/to_lower/main.cpp @@ -0,0 +1,61 @@ +#include <library/cpp/testing/benchmark/bench.h> + +#include <util/charset/wide.h> +#include <util/generic/singleton.h> +#include <util/generic/vector.h> +#include <util/generic/string.h> + +static const auto ShortAscii = UTF8ToWide("hELlo"); +static const auto LongAscii = UTF8ToWide( + "The first plane, plane 0, the Basic Multilingual Plane (BMP) contains characters for almost " + "all modern languages, and a large number of symbols. A primary objective for the BMP is to " + "support the unification of prior character sets as well as characters for writing. Most of " + "the assigned code points in the BMP are used to encode Chinese, Japanese, and Korean (CJK) " + "characters."); + +static const auto ShortRussian = UTF8ToWide("пРИвет"); +static const auto LongRussian = UTF8ToWide( + "Плоскость 0 (Основная многоязычная плоскость, англ. Basic Multilingual Plane, BMP) отведена " + "для символов практически всех современных письменностей и большого числа специальных символов. " + "Большая часть таблицы занята китайско-японскими иероглифами и своеобразными корейскими" + "буквами. В Юникоде 10.0 в этой плоскости представлены следующие блоки"); + +#define DEFINE_INPLACE_BENCH(s) \ + Y_CPU_BENCHMARK(s##CopyDetach, iface) { \ + for (size_t i = 0, iEnd = iface.Iterations(); i < iEnd; ++i) { \ + NBench::Clobber(); \ + auto copy = s; \ + NBench::Escape(copy.Detach()); \ + NBench::Clobber(); \ + } \ + } \ + \ + Y_CPU_BENCHMARK(s##Inplace, iface) { \ + for (size_t i = 0, iEnd = iface.Iterations(); i < iEnd; ++i) { \ + NBench::Clobber(); \ + auto copy = s; \ + ToLower(copy); \ + NBench::Escape(copy.data()); \ + NBench::Clobber(); \ + } \ + } + +#define DEFINE_RET_BENCH(s) \ + Y_CPU_BENCHMARK(s##Ret, iface) { \ + for (size_t i = 0, iEnd = iface.Iterations(); i < iEnd; ++i) { \ + NBench::Clobber(); \ + const auto res = ToLowerRet(TWtringBuf{s}); \ + NBench::Escape(res.data()); \ + NBench::Clobber(); \ + } \ + } + +DEFINE_INPLACE_BENCH(ShortAscii) +DEFINE_INPLACE_BENCH(LongAscii) +DEFINE_INPLACE_BENCH(ShortRussian) +DEFINE_INPLACE_BENCH(LongRussian) + +DEFINE_RET_BENCH(ShortAscii) +DEFINE_RET_BENCH(LongAscii) +DEFINE_RET_BENCH(ShortRussian) +DEFINE_RET_BENCH(LongRussian) diff --git a/util/charset/benchmark/to_lower/metrics/main.py b/util/charset/benchmark/to_lower/metrics/main.py new file mode 100644 index 0000000000..e7495d432b --- /dev/null +++ b/util/charset/benchmark/to_lower/metrics/main.py @@ -0,0 +1,5 @@ +import yatest.common as yc + + +def test_export_metrics(metrics): + metrics.set_benchmark(yc.execute_benchmark('util/charset/benchmark/to_lower/to_lower')) diff --git a/util/charset/benchmark/to_lower/metrics/ya.make b/util/charset/benchmark/to_lower/metrics/ya.make new file mode 100644 index 0000000000..5bb3461a8d --- /dev/null +++ b/util/charset/benchmark/to_lower/metrics/ya.make @@ -0,0 +1,21 @@ +OWNER( + agorodilov + g:util +) +SUBSCRIBER(g:util-subscribers) + +PY2TEST() + +SIZE(LARGE) + +TAG( + ya:force_sandbox + sb:intel_e5_2660v1 + ya:fat +) + +TEST_SRCS(main.py) + +DEPENDS(util/charset/benchmark/to_lower) + +END() diff --git a/util/charset/benchmark/to_lower/ya.make b/util/charset/benchmark/to_lower/ya.make new file mode 100644 index 0000000000..74c47e6de5 --- /dev/null +++ b/util/charset/benchmark/to_lower/ya.make @@ -0,0 +1,11 @@ +OWNER(yazevnul) + +Y_BENCHMARK() + +ALLOCATOR(B) + +SRCS( + main.cpp +) + +END() diff --git a/util/charset/benchmark/utf8_to_wide/main.cpp b/util/charset/benchmark/utf8_to_wide/main.cpp new file mode 100644 index 0000000000..09fa567fe5 --- /dev/null +++ b/util/charset/benchmark/utf8_to_wide/main.cpp @@ -0,0 +1,161 @@ +#include <library/cpp/testing/benchmark/bench.h> + +#include <util/random/fast.h> +#include <util/random/random.h> +#include <util/generic/singleton.h> +#include <util/generic/vector.h> +#include <util/charset/wide.h> + +#include <cmath> + +namespace { + template <size_t N> + struct TRandomAsciiString: public TVector<char> { + inline TRandomAsciiString() { + reserve(N); + for (size_t i = 0; i < N; ++i) { + push_back(RandomNumber<char>(127)); + } + } + }; + + template <size_t N> + struct TRandomRuString: public TVector<char> { + inline TRandomRuString() { + TVector<unsigned char> data(N * 2); + unsigned char* textEnd = data.begin(); + for (size_t i = 0; i < N; ++i) { + size_t runeLen; + WriteUTF8Char(RandomNumber<ui32>(0x7FF) + 1, runeLen, textEnd); + textEnd += runeLen; + } + assign(reinterpret_cast<const char*>(data.begin()), reinterpret_cast<const char*>(textEnd)); + } + }; + + using RAS1 = TRandomAsciiString<1>; + using RAS10 = TRandomAsciiString<10>; + using RAS50 = TRandomAsciiString<50>; + using RAS1000 = TRandomAsciiString<1000>; + using RAS1000000 = TRandomAsciiString<1000000>; + + using RRS1 = TRandomRuString<1>; + using RRS10 = TRandomRuString<10>; + using RRS1000 = TRandomRuString<1000>; + using RRS1000000 = TRandomRuString<1000000>; +} + +#ifdef _sse2_ + #define IS_ASCII_BENCHMARK(length) \ + Y_CPU_BENCHMARK(IsStringASCII##length, iface) { \ + const auto& data = *Singleton<RAS##length>(); \ + for (size_t x = 0; x < iface.Iterations(); ++x) { \ + Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCII(data.begin(), data.end())); \ + } \ + } \ + Y_CPU_BENCHMARK(IsStringASCIISlow##length, iface) { \ + const auto& data = *Singleton<RAS##length>(); \ + for (size_t x = 0; x < iface.Iterations(); ++x) { \ + Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCIISlow(data.begin(), data.end())); \ + } \ + } \ + Y_CPU_BENCHMARK(IsStringASCIISSE##length, iface) { \ + const auto& data = *Singleton<RAS##length>(); \ + for (size_t x = 0; x < iface.Iterations(); ++x) { \ + Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCIISSE(reinterpret_cast<const unsigned char*>(data.begin()), reinterpret_cast<const unsigned char*>(data.end()))); \ + } \ + } +#else //no sse + #define IS_ASCII_BENCHMARK(length) \ + Y_CPU_BENCHMARK(IsStringASCIIScalar##length, iface) { \ + const auto& data = *Singleton<RAS##length>(); \ + for (size_t x = 0; x < iface.Iterations(); ++x) { \ + Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCII(data.begin(), data.end())); \ + } \ + } \ + Y_CPU_BENCHMARK(IsStringASCIISlow##length, iface) { \ + const auto& data = *Singleton<RAS##length>(); \ + for (size_t x = 0; x < iface.Iterations(); ++x) { \ + Y_DO_NOT_OPTIMIZE_AWAY(::NDetail::DoIsStringASCIISlow(data.begin(), data.end())); \ + } \ + } +#endif + +IS_ASCII_BENCHMARK(1); +IS_ASCII_BENCHMARK(10); +IS_ASCII_BENCHMARK(50); +IS_ASCII_BENCHMARK(1000); +IS_ASCII_BENCHMARK(1000000); + +template <bool robust, typename TCharType> +inline size_t UTF8ToWideImplScalar(const char* text, size_t len, TCharType* dest, size_t& written) { + const unsigned char* cur = reinterpret_cast<const unsigned char*>(text); + const unsigned char* last = cur + len; + TCharType* p = dest; + + ::NDetail::UTF8ToWideImplScalar<robust>(cur, last, p); + written = p - dest; + return cur - reinterpret_cast<const unsigned char*>(text); +} + +template <bool robust, typename TCharType> +inline size_t UTF8ToWideImplSSE(const char* text, size_t len, TCharType* dest, size_t& written) { + return UTF8ToWideImpl(text, len, dest, written); +} + +static wchar16 WBUF_UTF16[10000000]; +static wchar32 WBUF_UTF32[10000000]; + +#define UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(impl, length, to) \ + Y_CPU_BENCHMARK(UTF8ToWideASCII##impl##length##to, iface) { \ + const auto& data = *Singleton<RAS##length>(); \ + for (size_t x = 0; x < iface.Iterations(); ++x) { \ + size_t written = 0; \ + Y_DO_NOT_OPTIMIZE_AWAY(UTF8ToWideImpl##impl<false>(data.begin(), data.size(), WBUF_##to, written)); \ + } \ + } + +#define UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(impl, length, to) \ + Y_CPU_BENCHMARK(UTF8ToWideRU##impl##length##to, iface) { \ + const auto& data = *Singleton<RRS##length>(); \ + for (size_t x = 0; x < iface.Iterations(); ++x) { \ + size_t written = 0; \ + Y_DO_NOT_OPTIMIZE_AWAY(UTF8ToWideImpl##impl<false>(data.begin(), data.size(), WBUF_##to, written)); \ + } \ + } + +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 10, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 10, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1000, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1000, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1000000, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1000000, UTF16); + +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 10, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 10, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1000, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1000, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1000000, UTF16); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1000000, UTF16); + +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 10, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 10, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1000, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1000, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(Scalar, 1000000, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_ASCII(SSE, 1000000, UTF32); + +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 10, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 10, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1000, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1000, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(Scalar, 1000000, UTF32); +UTF8_TO_WIDE_SCALAR_BENCHMARK_RU(SSE, 1000000, UTF32); diff --git a/util/charset/benchmark/utf8_to_wide/metrics/main.py b/util/charset/benchmark/utf8_to_wide/metrics/main.py new file mode 100644 index 0000000000..ffbd8f68fd --- /dev/null +++ b/util/charset/benchmark/utf8_to_wide/metrics/main.py @@ -0,0 +1,5 @@ +import yatest.common as yc + + +def test_export_metrics(metrics): + metrics.set_benchmark(yc.execute_benchmark('util/charset/benchmark/utf8_to_wide/utf8_to_wide')) diff --git a/util/charset/benchmark/utf8_to_wide/metrics/ya.make b/util/charset/benchmark/utf8_to_wide/metrics/ya.make new file mode 100644 index 0000000000..c406e25bee --- /dev/null +++ b/util/charset/benchmark/utf8_to_wide/metrics/ya.make @@ -0,0 +1,21 @@ +OWNER( + agorodilov + g:util +) +SUBSCRIBER(g:util-subscribers) + +PY2TEST() + +SIZE(LARGE) + +TAG( + ya:force_sandbox + sb:intel_e5_2660v1 + ya:fat +) + +TEST_SRCS(main.py) + +DEPENDS(util/charset/benchmark/utf8_to_wide) + +END() diff --git a/util/charset/benchmark/utf8_to_wide/ya.make b/util/charset/benchmark/utf8_to_wide/ya.make new file mode 100644 index 0000000000..4631fd7c41 --- /dev/null +++ b/util/charset/benchmark/utf8_to_wide/ya.make @@ -0,0 +1,9 @@ +Y_BENCHMARK() + +OWNER(agorodilov) + +SRCS( + main.cpp +) + +END() diff --git a/util/charset/benchmark/ya.make b/util/charset/benchmark/ya.make new file mode 100644 index 0000000000..de3e04ef22 --- /dev/null +++ b/util/charset/benchmark/ya.make @@ -0,0 +1,12 @@ +OWNER( + agorodilov + g:util +) +SUBSCRIBER(g:util-subscribers) + +RECURSE( + to_lower + to_lower/metrics + utf8_to_wide + utf8_to_wide/metrics +) diff --git a/util/charset/generated/unidata.cpp b/util/charset/generated/unidata.cpp new file mode 100644 index 0000000000..6f5adbbc0a --- /dev/null +++ b/util/charset/generated/unidata.cpp @@ -0,0 +1,7538 @@ +#include <util/charset/unidata.h> + +namespace { namespace NUnidataTableGenerated { + using TV = const NUnicode::NPrivate::TUnidataTable::TStored; + + static const TV V[] = { +#undef V0 +#define V0 (*(V + 0)) + {0xF018, 0, 0, 0, 0}, +#undef V1 +#define V1 (*(V + 1)) + {0x9F019, 0, 0, 0, 0}, +#undef V2 +#define V2 (*(V + 2)) + {0x8F019, 0, 0, 0, 0}, +#undef V3 +#define V3 (*(V + 3)) + {0x8F01A, 0, 0, 0, 0}, +#undef V4 +#define V4 (*(V + 4)) + {0x9F01A, 0, 0, 0, 0}, +#undef V5 +#define V5 (*(V + 5)) + {0xAF014, 0, 0, 0, 0}, +#undef V6 +#define V6 (*(V + 6)) + {0xBF02C, 0, 0, 0, 0}, +#undef V7 +#define V7 (*(V + 7)) + {0xBF02B, 0, 0, 0, 0}, +#undef V8 +#define V8 (*(V + 8)) + {0x5F02A, 0, 0, 0, 0}, +#undef V9 +#define V9 (*(V + 9)) + {0x5F031, 0, 0, 0, 0}, +#undef V10 +#define V10 (*(V + 10)) + {0xBF02A, 0, 0, 0, 0}, +#undef V11 +#define V11 (*(V + 11)) + {0xBF038, 0, 0, 0, 0}, +#undef V12 +#define V12 (*(V + 12)) + {0xBF023, 0, 0, 0, 0}, +#undef V13 +#define V13 (*(V + 13)) + {0xBF025, 0, 0, 0, 0}, +#undef V14 +#define V14 (*(V + 14)) + {0x4F02F, 0, 0, 0, 0}, +#undef V15 +#define V15 (*(V + 15)) + {0x7F02C, 0, 0, 0, 0}, +#undef V16 +#define V16 (*(V + 16)) + {0x4F022, 0, 0, 0, 0}, +#undef V17 +#define V17 (*(V + 17)) + {0x7F02A, 0, 0, 0, 0}, +#undef V18 +#define V18 (*(V + 18)) + {0x3F0D0, 0, 0, 0, 0}, +#undef V19 +#define V19 (*(V + 19)) + {0x43F0D0, 0, 0, 0, 0}, +#undef V20 +#define V20 (*(V + 20)) + {0x83F0D0, 0, 0, 0, 0}, +#undef V21 +#define V21 (*(V + 21)) + {0xC3F0D0, 0, 0, 0, 0}, +#undef V22 +#define V22 (*(V + 22)) + {0x103F0D0, 0, 0, 0, 0}, +#undef V23 +#define V23 (*(V + 23)) + {0x143F0D0, 0, 0, 0, 0}, +#undef V24 +#define V24 (*(V + 24)) + {0x183F0D0, 0, 0, 0, 0}, +#undef V25 +#define V25 (*(V + 25)) + {0x1C3F0D0, 0, 0, 0, 0}, +#undef V26 +#define V26 (*(V + 26)) + {0x203F0D0, 0, 0, 0, 0}, +#undef V27 +#define V27 (*(V + 27)) + {0x243F0D0, 0, 0, 0, 0}, +#undef V28 +#define V28 (*(V + 28)) + {0xBF02F, 0, 0, 0, 0}, +#undef V29 +#define V29 (*(V + 29)) + {0x1F041, 32, 0, 0, 0}, +#undef V30 +#define V30 (*(V + 30)) + {0x1F001, 32, 0, 0, 0}, +#undef V31 +#define V31 (*(V + 31)) + {0xBF032, 0, 0, 0, 0}, +#undef V32 +#define V32 (*(V + 32)) + {0xBF029, 0, 0, 0, 0}, +#undef V33 +#define V33 (*(V + 33)) + {0x1F042, 0, -32, -32, 0}, +#undef V34 +#define V34 (*(V + 34)) + {0x1F002, 0, -32, -32, 0}, +#undef V35 +#define V35 (*(V + 35)) + {0x8F018, 0, 0, 0, 0}, +#undef V36 +#define V36 (*(V + 36)) + {0x73514, 0, 0, 0, 0}, +#undef V37 +#define V37 (*(V + 37)) + {0xBF033, 0, 0, 0, 0}, +#undef V38 +#define V38 (*(V + 38)) + {0xB3432, 0, 0, 0, 0}, +#undef V39 +#define V39 (*(V + 39)) + {0x13406, 0, 0, 0, 0}, +#undef V40 +#define V40 (*(V + 40)) + {0xBF027, 0, 0, 0, 0}, +#undef V41 +#define V41 (*(V + 41)) + {0xF01B, 0, 0, 0, 0}, +#undef V42 +#define V42 (*(V + 42)) + {0x5F033, 0, 0, 0, 0}, +#undef V43 +#define V43 (*(V + 43)) + {0x5F02F, 0, 0, 0, 0}, +#undef V44 +#define V44 (*(V + 44)) + {0x833493, 0, 0, 0, 0}, +#undef V45 +#define V45 (*(V + 45)) + {0xC33493, 0, 0, 0, 0}, +#undef V46 +#define V46 (*(V + 46)) + {0x13402, 0, 743, 743, 0}, +#undef V47 +#define V47 (*(V + 47)) + {0xBF02D, 0, 0, 0, 0}, +#undef V48 +#define V48 (*(V + 48)) + {0x433493, 0, 0, 0, 0}, +#undef V49 +#define V49 (*(V + 49)) + {0xBF028, 0, 0, 0, 0}, +#undef V50 +#define V50 (*(V + 50)) + {0xB3413, 0, 0, 0, 0}, +#undef V51 +#define V51 (*(V + 51)) + {0x1A801, 32, 0, 0, 0}, +#undef V52 +#define V52 (*(V + 52)) + {0x1F002, 0, 0, 0, 0}, +#undef V53 +#define V53 (*(V + 53)) + {0x1A802, 0, -32, -32, 0}, +#undef V54 +#define V54 (*(V + 54)) + {0x1A802, 0, 121, 121, 0}, +#undef V55 +#define V55 (*(V + 55)) + {0x1A801, 1, 0, 0, 0}, +#undef V56 +#define V56 (*(V + 56)) + {0x1A802, 0, -1, -1, 0}, +#undef V57 +#define V57 (*(V + 57)) + {0x1F001, 1, 0, 0, 0}, +#undef V58 +#define V58 (*(V + 58)) + {0x1F002, 0, -1, -1, 0}, +#undef V59 +#define V59 (*(V + 59)) + {0x1A801, -199, 0, 0, 0}, +#undef V60 +#define V60 (*(V + 60)) + {0x1F002, 0, -232, -232, 0}, +#undef V61 +#define V61 (*(V + 61)) + {0x13401, 1, 0, 0, 0}, +#undef V62 +#define V62 (*(V + 62)) + {0x13402, 0, -1, -1, 0}, +#undef V63 +#define V63 (*(V + 63)) + {0x13402, 0, 0, 0, 0}, +#undef V64 +#define V64 (*(V + 64)) + {0x1A801, -121, 0, 0, 0}, +#undef V65 +#define V65 (*(V + 65)) + {0x13402, 0, -300, -300, 0}, +#undef V66 +#define V66 (*(V + 66)) + {0x1F002, 0, 195, 195, 0}, +#undef V67 +#define V67 (*(V + 67)) + {0x1F001, 210, 0, 0, 0}, +#undef V68 +#define V68 (*(V + 68)) + {0x1F001, 206, 0, 0, 0}, +#undef V69 +#define V69 (*(V + 69)) + {0x1F001, 205, 0, 0, 0}, +#undef V70 +#define V70 (*(V + 70)) + {0x1F001, 79, 0, 0, 0}, +#undef V71 +#define V71 (*(V + 71)) + {0x1F001, 202, 0, 0, 0}, +#undef V72 +#define V72 (*(V + 72)) + {0x1F001, 203, 0, 0, 0}, +#undef V73 +#define V73 (*(V + 73)) + {0x1F001, 207, 0, 0, 0}, +#undef V74 +#define V74 (*(V + 74)) + {0x1F002, 0, 97, 97, 0}, +#undef V75 +#define V75 (*(V + 75)) + {0x1F001, 211, 0, 0, 0}, +#undef V76 +#define V76 (*(V + 76)) + {0x1F001, 209, 0, 0, 0}, +#undef V77 +#define V77 (*(V + 77)) + {0x1F002, 0, 163, 163, 0}, +#undef V78 +#define V78 (*(V + 78)) + {0x1F001, 213, 0, 0, 0}, +#undef V79 +#define V79 (*(V + 79)) + {0x1F002, 0, 130, 130, 0}, +#undef V80 +#define V80 (*(V + 80)) + {0x1F001, 214, 0, 0, 0}, +#undef V81 +#define V81 (*(V + 81)) + {0x1F001, 218, 0, 0, 0}, +#undef V82 +#define V82 (*(V + 82)) + {0x1F001, 217, 0, 0, 0}, +#undef V83 +#define V83 (*(V + 83)) + {0x1F001, 219, 0, 0, 0}, +#undef V84 +#define V84 (*(V + 84)) + {0x1F006, 0, 0, 0, 0}, +#undef V85 +#define V85 (*(V + 85)) + {0x1F002, 0, 56, 56, 0}, +#undef V86 +#define V86 (*(V + 86)) + {0x13401, 2, 0, 1, 0}, +#undef V87 +#define V87 (*(V + 87)) + {0x13403, 1, -1, 0, 0}, +#undef V88 +#define V88 (*(V + 88)) + {0x13402, 0, -2, -1, 0}, +#undef V89 +#define V89 (*(V + 89)) + {0x1F002, 0, -79, -79, 0}, +#undef V90 +#define V90 (*(V + 90)) + {0x1A802, 0, 0, 0, 0}, +#undef V91 +#define V91 (*(V + 91)) + {0x1F001, -97, 0, 0, 0}, +#undef V92 +#define V92 (*(V + 92)) + {0x1F001, -56, 0, 0, 0}, +#undef V93 +#define V93 (*(V + 93)) + {0x1F001, -130, 0, 0, 0}, +#undef V94 +#define V94 (*(V + 94)) + {0x1F001, 10795, 0, 0, 0}, +#undef V95 +#define V95 (*(V + 95)) + {0x1F001, -163, 0, 0, 0}, +#undef V96 +#define V96 (*(V + 96)) + {0x1F001, 10792, 0, 0, 0}, +#undef V97 +#define V97 (*(V + 97)) + {0x1F002, 0, 10815, 10815, 0}, +#undef V98 +#define V98 (*(V + 98)) + {0x1F001, -195, 0, 0, 0}, +#undef V99 +#define V99 (*(V + 99)) + {0x1F001, 69, 0, 0, 0}, +#undef V100 +#define V100 (*(V + 100)) + {0x1F001, 71, 0, 0, 0}, +#undef V101 +#define V101 (*(V + 101)) + {0x1F002, 0, 10783, 10783, 0}, +#undef V102 +#define V102 (*(V + 102)) + {0x1F002, 0, 10780, 10780, 0}, +#undef V103 +#define V103 (*(V + 103)) + {0x1F002, 0, 10782, 10782, 0}, +#undef V104 +#define V104 (*(V + 104)) + {0x1F002, 0, -210, -210, 0}, +#undef V105 +#define V105 (*(V + 105)) + {0x1F002, 0, -206, -206, 0}, +#undef V106 +#define V106 (*(V + 106)) + {0x1F002, 0, -205, -205, 0}, +#undef V107 +#define V107 (*(V + 107)) + {0x1F002, 0, -202, -202, 0}, +#undef V108 +#define V108 (*(V + 108)) + {0x1F002, 0, -203, -203, 0}, +#undef V109 +#define V109 (*(V + 109)) + {0x1F002, 0, 42319, 42319, 0}, +#undef V110 +#define V110 (*(V + 110)) + {0x1F002, 0, 42315, 42315, 0}, +#undef V111 +#define V111 (*(V + 111)) + {0x1F002, 0, -207, -207, 0}, +#undef V112 +#define V112 (*(V + 112)) + {0x1F002, 0, 42280, 42280, 0}, +#undef V113 +#define V113 (*(V + 113)) + {0x1F002, 0, 42308, 42308, 0}, +#undef V114 +#define V114 (*(V + 114)) + {0x1F002, 0, -209, -209, 0}, +#undef V115 +#define V115 (*(V + 115)) + {0x1F002, 0, -211, -211, 0}, +#undef V116 +#define V116 (*(V + 116)) + {0x1F002, 0, 10743, 10743, 0}, +#undef V117 +#define V117 (*(V + 117)) + {0x1F002, 0, 42305, 42305, 0}, +#undef V118 +#define V118 (*(V + 118)) + {0x1F002, 0, 10749, 10749, 0}, +#undef V119 +#define V119 (*(V + 119)) + {0x1F002, 0, -213, -213, 0}, +#undef V120 +#define V120 (*(V + 120)) + {0x1F002, 0, -214, -214, 0}, +#undef V121 +#define V121 (*(V + 121)) + {0x1F002, 0, 10727, 10727, 0}, +#undef V122 +#define V122 (*(V + 122)) + {0x1F002, 0, -218, -218, 0}, +#undef V123 +#define V123 (*(V + 123)) + {0x1F002, 0, 42282, 42282, 0}, +#undef V124 +#define V124 (*(V + 124)) + {0x1F002, 0, -69, -69, 0}, +#undef V125 +#define V125 (*(V + 125)) + {0x1F002, 0, -217, -217, 0}, +#undef V126 +#define V126 (*(V + 126)) + {0x1F002, 0, -71, -71, 0}, +#undef V127 +#define V127 (*(V + 127)) + {0x1F002, 0, -219, -219, 0}, +#undef V128 +#define V128 (*(V + 128)) + {0x1F002, 0, 42261, 42261, 0}, +#undef V129 +#define V129 (*(V + 129)) + {0x1F002, 0, 42258, 42258, 0}, +#undef V130 +#define V130 (*(V + 130)) + {0x13405, 0, 0, 0, 0}, +#undef V131 +#define V131 (*(V + 131)) + {0xBF005, 0, 0, 0, 0}, +#undef V132 +#define V132 (*(V + 132)) + {0x1F005, 0, 0, 0, 0}, +#undef V133 +#define V133 (*(V + 133)) + {0xBF004, 0, 0, 0, 0}, +#undef V134 +#define V134 (*(V + 134)) + {0x1F004, 0, 0, 0, 0}, +#undef V135 +#define V135 (*(V + 135)) + {0x500D, 0, 0, 0, 230}, +#undef V136 +#define V136 (*(V + 136)) + {0xF00D, 0, 0, 0, 230}, +#undef V137 +#define V137 (*(V + 137)) + {0xF00D, 0, 0, 0, 232}, +#undef V138 +#define V138 (*(V + 138)) + {0xF00D, 0, 0, 0, 220}, +#undef V139 +#define V139 (*(V + 139)) + {0x500D, 0, 0, 0, 216}, +#undef V140 +#define V140 (*(V + 140)) + {0xF00D, 0, 0, 0, 202}, +#undef V141 +#define V141 (*(V + 141)) + {0x500D, 0, 0, 0, 220}, +#undef V142 +#define V142 (*(V + 142)) + {0x500D, 0, 0, 0, 202}, +#undef V143 +#define V143 (*(V + 143)) + {0xF00D, 0, 0, 0, 1}, +#undef V144 +#define V144 (*(V + 144)) + {0x500D, 0, 0, 0, 1}, +#undef V145 +#define V145 (*(V + 145)) + {0x80D, 0, 0, 0, 230}, +#undef V146 +#define V146 (*(V + 146)) + {0x500D, 0, 84, 84, 240}, +#undef V147 +#define V147 (*(V + 147)) + {0xF00D, 0, 0, 0, 0}, +#undef V148 +#define V148 (*(V + 148)) + {0xF00D, 0, 0, 0, 233}, +#undef V149 +#define V149 (*(V + 149)) + {0xF00D, 0, 0, 0, 234}, +#undef V150 +#define V150 (*(V + 150)) + {0xB0804, 0, 0, 0, 0}, +#undef V151 +#define V151 (*(V + 151)) + {0xF000, 0, 0, 0, 0}, +#undef V152 +#define V152 (*(V + 152)) + {0x13404, 0, 0, 0, 0}, +#undef V153 +#define V153 (*(V + 153)) + {0xB082C, 0, 0, 0, 0}, +#undef V154 +#define V154 (*(V + 154)) + {0x1F001, 116, 0, 0, 0}, +#undef V155 +#define V155 (*(V + 155)) + {0xB2832, 0, 0, 0, 0}, +#undef V156 +#define V156 (*(V + 156)) + {0x1A801, 38, 0, 0, 0}, +#undef V157 +#define V157 (*(V + 157)) + {0x1A801, 37, 0, 0, 0}, +#undef V158 +#define V158 (*(V + 158)) + {0x1A801, 64, 0, 0, 0}, +#undef V159 +#define V159 (*(V + 159)) + {0x1A801, 63, 0, 0, 0}, +#undef V160 +#define V160 (*(V + 160)) + {0x1A802, 0, -38, -38, 0}, +#undef V161 +#define V161 (*(V + 161)) + {0x1A802, 0, -37, -37, 0}, +#undef V162 +#define V162 (*(V + 162)) + {0x1F002, 0, -31, -31, 0}, +#undef V163 +#define V163 (*(V + 163)) + {0x1A802, 0, -64, -64, 0}, +#undef V164 +#define V164 (*(V + 164)) + {0x1A802, 0, -63, -63, 0}, +#undef V165 +#define V165 (*(V + 165)) + {0x1F001, 8, 0, 0, 0}, +#undef V166 +#define V166 (*(V + 166)) + {0x13402, 0, -62, -62, 0}, +#undef V167 +#define V167 (*(V + 167)) + {0x13402, 0, -57, -57, 0}, +#undef V168 +#define V168 (*(V + 168)) + {0x13401, 0, 0, 0, 0}, +#undef V169 +#define V169 (*(V + 169)) + {0x12801, 0, 0, 0, 0}, +#undef V170 +#define V170 (*(V + 170)) + {0x13402, 0, -47, -47, 0}, +#undef V171 +#define V171 (*(V + 171)) + {0x13402, 0, -54, -54, 0}, +#undef V172 +#define V172 (*(V + 172)) + {0x1F002, 0, -8, -8, 0}, +#undef V173 +#define V173 (*(V + 173)) + {0x13402, 0, -86, -86, 0}, +#undef V174 +#define V174 (*(V + 174)) + {0x13402, 0, -80, -80, 0}, +#undef V175 +#define V175 (*(V + 175)) + {0x13402, 0, 7, 7, 0}, +#undef V176 +#define V176 (*(V + 176)) + {0x1F002, 0, -116, -116, 0}, +#undef V177 +#define V177 (*(V + 177)) + {0x13401, -60, 0, 0, 0}, +#undef V178 +#define V178 (*(V + 178)) + {0x13402, 0, -96, -96, 0}, +#undef V179 +#define V179 (*(V + 179)) + {0x13401, -7, 0, 0, 0}, +#undef V180 +#define V180 (*(V + 180)) + {0x1A801, 80, 0, 0, 0}, +#undef V181 +#define V181 (*(V + 181)) + {0x1F001, 80, 0, 0, 0}, +#undef V182 +#define V182 (*(V + 182)) + {0x1A802, 0, -80, -80, 0}, +#undef V183 +#define V183 (*(V + 183)) + {0x1F002, 0, -80, -80, 0}, +#undef V184 +#define V184 (*(V + 184)) + {0x1F033, 0, 0, 0, 0}, +#undef V185 +#define V185 (*(V + 185)) + {0xF00E, 0, 0, 0, 0}, +#undef V186 +#define V186 (*(V + 186)) + {0x1F001, 15, 0, 0, 0}, +#undef V187 +#define V187 (*(V + 187)) + {0x1F002, 0, -15, -15, 0}, +#undef V188 +#define V188 (*(V + 188)) + {0x1F001, 48, 0, 0, 0}, +#undef V189 +#define V189 (*(V + 189)) + {0x1F02A, 0, 0, 0, 0}, +#undef V190 +#define V190 (*(V + 190)) + {0x1F002, 0, -48, -48, 0}, +#undef V191 +#define V191 (*(V + 191)) + {0x1F02C, 0, 0, 0, 0}, +#undef V192 +#define V192 (*(V + 192)) + {0xBF022, 0, 0, 0, 0}, +#undef V193 +#define V193 (*(V + 193)) + {0xF00D, 0, 0, 0, 222}, +#undef V194 +#define V194 (*(V + 194)) + {0xF00D, 0, 0, 0, 228}, +#undef V195 +#define V195 (*(V + 195)) + {0xF00D, 0, 0, 0, 10}, +#undef V196 +#define V196 (*(V + 196)) + {0xF00D, 0, 0, 0, 11}, +#undef V197 +#define V197 (*(V + 197)) + {0xF00D, 0, 0, 0, 12}, +#undef V198 +#define V198 (*(V + 198)) + {0xF00D, 0, 0, 0, 13}, +#undef V199 +#define V199 (*(V + 199)) + {0xF00D, 0, 0, 0, 14}, +#undef V200 +#define V200 (*(V + 200)) + {0xF00D, 0, 0, 0, 15}, +#undef V201 +#define V201 (*(V + 201)) + {0xF00D, 0, 0, 0, 16}, +#undef V202 +#define V202 (*(V + 202)) + {0xF00D, 0, 0, 0, 17}, +#undef V203 +#define V203 (*(V + 203)) + {0xF00D, 0, 0, 0, 18}, +#undef V204 +#define V204 (*(V + 204)) + {0xF00D, 0, 0, 0, 19}, +#undef V205 +#define V205 (*(V + 205)) + {0xF00D, 0, 0, 0, 20}, +#undef V206 +#define V206 (*(V + 206)) + {0xF00D, 0, 0, 0, 21}, +#undef V207 +#define V207 (*(V + 207)) + {0xF00D, 0, 0, 0, 22}, +#undef V208 +#define V208 (*(V + 208)) + {0x2F021, 0, 0, 0, 0}, +#undef V209 +#define V209 (*(V + 209)) + {0xF00D, 0, 0, 0, 23}, +#undef V210 +#define V210 (*(V + 210)) + {0x2F02A, 0, 0, 0, 0}, +#undef V211 +#define V211 (*(V + 211)) + {0xF00D, 0, 0, 0, 24}, +#undef V212 +#define V212 (*(V + 212)) + {0xF00D, 0, 0, 0, 25}, +#undef V213 +#define V213 (*(V + 213)) + {0x2F006, 0, 0, 0, 0}, +#undef V214 +#define V214 (*(V + 214)) + {0x6F01B, 0, 0, 0, 0}, +#undef V215 +#define V215 (*(V + 215)) + {0xF02F, 0, 0, 0, 0}, +#undef V216 +#define V216 (*(V + 216)) + {0xF031, 0, 0, 0, 0}, +#undef V217 +#define V217 (*(V + 217)) + {0xF02A, 0, 0, 0, 0}, +#undef V218 +#define V218 (*(V + 218)) + {0xF00D, 0, 0, 0, 30}, +#undef V219 +#define V219 (*(V + 219)) + {0xF00D, 0, 0, 0, 31}, +#undef V220 +#define V220 (*(V + 220)) + {0xF00D, 0, 0, 0, 32}, +#undef V221 +#define V221 (*(V + 221)) + {0xF02C, 0, 0, 0, 0}, +#undef V222 +#define V222 (*(V + 222)) + {0xF006, 0, 0, 0, 0}, +#undef V223 +#define V223 (*(V + 223)) + {0xA806, 0, 0, 0, 0}, +#undef V224 +#define V224 (*(V + 224)) + {0xF004, 0, 0, 0, 0}, +#undef V225 +#define V225 (*(V + 225)) + {0xF00D, 0, 0, 0, 27}, +#undef V226 +#define V226 (*(V + 226)) + {0xF00D, 0, 0, 0, 28}, +#undef V227 +#define V227 (*(V + 227)) + {0xF00D, 0, 0, 0, 29}, +#undef V228 +#define V228 (*(V + 228)) + {0xF00D, 0, 0, 0, 33}, +#undef V229 +#define V229 (*(V + 229)) + {0xF00D, 0, 0, 0, 34}, +#undef V230 +#define V230 (*(V + 230)) + {0x6F090, 0, 0, 0, 0}, +#undef V231 +#define V231 (*(V + 231)) + {0x46F090, 0, 0, 0, 0}, +#undef V232 +#define V232 (*(V + 232)) + {0x86F090, 0, 0, 0, 0}, +#undef V233 +#define V233 (*(V + 233)) + {0xC6F090, 0, 0, 0, 0}, +#undef V234 +#define V234 (*(V + 234)) + {0x106F090, 0, 0, 0, 0}, +#undef V235 +#define V235 (*(V + 235)) + {0x146F090, 0, 0, 0, 0}, +#undef V236 +#define V236 (*(V + 236)) + {0x186F090, 0, 0, 0, 0}, +#undef V237 +#define V237 (*(V + 237)) + {0x1C6F090, 0, 0, 0, 0}, +#undef V238 +#define V238 (*(V + 238)) + {0x206F090, 0, 0, 0, 0}, +#undef V239 +#define V239 (*(V + 239)) + {0x246F090, 0, 0, 0, 0}, +#undef V240 +#define V240 (*(V + 240)) + {0x6F02A, 0, 0, 0, 0}, +#undef V241 +#define V241 (*(V + 241)) + {0xF00D, 0, 0, 0, 35}, +#undef V242 +#define V242 (*(V + 242)) + {0x3406, 0, 0, 0, 0}, +#undef V243 +#define V243 (*(V + 243)) + {0xF005, 0, 0, 0, 0}, +#undef V244 +#define V244 (*(V + 244)) + {0x3F090, 0, 0, 0, 0}, +#undef V245 +#define V245 (*(V + 245)) + {0x43F090, 0, 0, 0, 0}, +#undef V246 +#define V246 (*(V + 246)) + {0x83F090, 0, 0, 0, 0}, +#undef V247 +#define V247 (*(V + 247)) + {0xC3F090, 0, 0, 0, 0}, +#undef V248 +#define V248 (*(V + 248)) + {0x103F090, 0, 0, 0, 0}, +#undef V249 +#define V249 (*(V + 249)) + {0x143F090, 0, 0, 0, 0}, +#undef V250 +#define V250 (*(V + 250)) + {0x183F090, 0, 0, 0, 0}, +#undef V251 +#define V251 (*(V + 251)) + {0x1C3F090, 0, 0, 0, 0}, +#undef V252 +#define V252 (*(V + 252)) + {0x203F090, 0, 0, 0, 0}, +#undef V253 +#define V253 (*(V + 253)) + {0x243F090, 0, 0, 0, 0}, +#undef V254 +#define V254 (*(V + 254)) + {0xF033, 0, 0, 0, 0}, +#undef V255 +#define V255 (*(V + 255)) + {0xF00D, 0, 0, 0, 36}, +#undef V256 +#define V256 (*(V + 256)) + {0x2F090, 0, 0, 0, 0}, +#undef V257 +#define V257 (*(V + 257)) + {0x42F090, 0, 0, 0, 0}, +#undef V258 +#define V258 (*(V + 258)) + {0x82F090, 0, 0, 0, 0}, +#undef V259 +#define V259 (*(V + 259)) + {0xC2F090, 0, 0, 0, 0}, +#undef V260 +#define V260 (*(V + 260)) + {0x102F090, 0, 0, 0, 0}, +#undef V261 +#define V261 (*(V + 261)) + {0x142F090, 0, 0, 0, 0}, +#undef V262 +#define V262 (*(V + 262)) + {0x182F090, 0, 0, 0, 0}, +#undef V263 +#define V263 (*(V + 263)) + {0x1C2F090, 0, 0, 0, 0}, +#undef V264 +#define V264 (*(V + 264)) + {0x202F090, 0, 0, 0, 0}, +#undef V265 +#define V265 (*(V + 265)) + {0x242F090, 0, 0, 0, 0}, +#undef V266 +#define V266 (*(V + 266)) + {0x2F004, 0, 0, 0, 0}, +#undef V267 +#define V267 (*(V + 267)) + {0x2F005, 0, 0, 0, 0}, +#undef V268 +#define V268 (*(V + 268)) + {0x1F00F, 0, 0, 0, 0}, +#undef V269 +#define V269 (*(V + 269)) + {0x1A806, 0, 0, 0, 0}, +#undef V270 +#define V270 (*(V + 270)) + {0x500D, 0, 0, 0, 7}, +#undef V271 +#define V271 (*(V + 271)) + {0xF00D, 0, 0, 0, 9}, +#undef V272 +#define V272 (*(V + 272)) + {0x10806, 0, 0, 0, 0}, +#undef V273 +#define V273 (*(V + 273)) + {0x1F090, 0, 0, 0, 0}, +#undef V274 +#define V274 (*(V + 274)) + {0x41F090, 0, 0, 0, 0}, +#undef V275 +#define V275 (*(V + 275)) + {0x81F090, 0, 0, 0, 0}, +#undef V276 +#define V276 (*(V + 276)) + {0xC1F090, 0, 0, 0, 0}, +#undef V277 +#define V277 (*(V + 277)) + {0x101F090, 0, 0, 0, 0}, +#undef V278 +#define V278 (*(V + 278)) + {0x141F090, 0, 0, 0, 0}, +#undef V279 +#define V279 (*(V + 279)) + {0x181F090, 0, 0, 0, 0}, +#undef V280 +#define V280 (*(V + 280)) + {0x1C1F090, 0, 0, 0, 0}, +#undef V281 +#define V281 (*(V + 281)) + {0x201F090, 0, 0, 0, 0}, +#undef V282 +#define V282 (*(V + 282)) + {0x241F090, 0, 0, 0, 0}, +#undef V283 +#define V283 (*(V + 283)) + {0xF00D, 0, 0, 0, 7}, +#undef V284 +#define V284 (*(V + 284)) + {0x1500F, 0, 0, 0, 0}, +#undef V285 +#define V285 (*(V + 285)) + {0x1A80F, 0, 0, 0, 0}, +#undef V286 +#define V286 (*(V + 286)) + {0x1F013, 0, 0, 0, 0}, +#undef V287 +#define V287 (*(V + 287)) + {0x500D, 0, 0, 0, 0}, +#undef V288 +#define V288 (*(V + 288)) + {0xA80D, 0, 0, 0, 0}, +#undef V289 +#define V289 (*(V + 289)) + {0xF00D, 0, 0, 0, 84}, +#undef V290 +#define V290 (*(V + 290)) + {0x500D, 0, 0, 0, 91}, +#undef V291 +#define V291 (*(V + 291)) + {0xBF013, 0, 0, 0, 0}, +#undef V292 +#define V292 (*(V + 292)) + {0x1F00D, 0, 0, 0, 0}, +#undef V293 +#define V293 (*(V + 293)) + {0x500D, 0, 0, 0, 9}, +#undef V294 +#define V294 (*(V + 294)) + {0xF00D, 0, 0, 0, 103}, +#undef V295 +#define V295 (*(V + 295)) + {0xF00D, 0, 0, 0, 107}, +#undef V296 +#define V296 (*(V + 296)) + {0xF00D, 0, 0, 0, 118}, +#undef V297 +#define V297 (*(V + 297)) + {0xF00D, 0, 0, 0, 122}, +#undef V298 +#define V298 (*(V + 298)) + {0x1342A, 0, 0, 0, 0}, +#undef V299 +#define V299 (*(V + 299)) + {0xF00D, 0, 0, 0, 216}, +#undef V300 +#define V300 (*(V + 300)) + {0xF00D, 0, 0, 0, 129}, +#undef V301 +#define V301 (*(V + 301)) + {0xF00D, 0, 0, 0, 130}, +#undef V302 +#define V302 (*(V + 302)) + {0x80D, 0, 0, 0, 0}, +#undef V303 +#define V303 (*(V + 303)) + {0xF00D, 0, 0, 0, 132}, +#undef V304 +#define V304 (*(V + 304)) + {0x340D, 0, 0, 0, 0}, +#undef V305 +#define V305 (*(V + 305)) + {0x1F001, 7264, 0, 0, 0}, +#undef V306 +#define V306 (*(V + 306)) + {0x1F00A, 0, 0, 0, 0}, +#undef V307 +#define V307 (*(V + 307)) + {0x1F00B, 0, 0, 0, 0}, +#undef V308 +#define V308 (*(V + 308)) + {0x1500B, 0, 0, 0, 0}, +#undef V309 +#define V309 (*(V + 309)) + {0x1500C, 0, 0, 0, 0}, +#undef V310 +#define V310 (*(V + 310)) + {0x1F00C, 0, 0, 0, 0}, +#undef V311 +#define V311 (*(V + 311)) + {0x41F093, 0, 0, 0, 0}, +#undef V312 +#define V312 (*(V + 312)) + {0x81F093, 0, 0, 0, 0}, +#undef V313 +#define V313 (*(V + 313)) + {0xC1F093, 0, 0, 0, 0}, +#undef V314 +#define V314 (*(V + 314)) + {0x101F093, 0, 0, 0, 0}, +#undef V315 +#define V315 (*(V + 315)) + {0x141F093, 0, 0, 0, 0}, +#undef V316 +#define V316 (*(V + 316)) + {0x181F093, 0, 0, 0, 0}, +#undef V317 +#define V317 (*(V + 317)) + {0x1C1F093, 0, 0, 0, 0}, +#undef V318 +#define V318 (*(V + 318)) + {0x201F093, 0, 0, 0, 0}, +#undef V319 +#define V319 (*(V + 319)) + {0x241F093, 0, 0, 0, 0}, +#undef V320 +#define V320 (*(V + 320)) + {0x1F001, 38864, 0, 0, 0}, +#undef V321 +#define V321 (*(V + 321)) + {0x1F011, 0, 0, 0, 0}, +#undef V322 +#define V322 (*(V + 322)) + {0x1F00F, 0, 0, 0, 9}, +#undef V323 +#define V323 (*(V + 323)) + {0x1F002, 0, -6254, -6254, 0}, +#undef V324 +#define V324 (*(V + 324)) + {0x1F002, 0, -6253, -6253, 0}, +#undef V325 +#define V325 (*(V + 325)) + {0x1F002, 0, -6244, -6244, 0}, +#undef V326 +#define V326 (*(V + 326)) + {0x1F002, 0, -6242, -6242, 0}, +#undef V327 +#define V327 (*(V + 327)) + {0x1F002, 0, -6243, -6243, 0}, +#undef V328 +#define V328 (*(V + 328)) + {0x1F002, 0, -6236, -6236, 0}, +#undef V329 +#define V329 (*(V + 329)) + {0x1F002, 0, -6181, -6181, 0}, +#undef V330 +#define V330 (*(V + 330)) + {0x1F002, 0, 35266, 35266, 0}, +#undef V331 +#define V331 (*(V + 331)) + {0x1F002, 0, 35332, 35332, 0}, +#undef V332 +#define V332 (*(V + 332)) + {0x1F002, 0, 3814, 3814, 0}, +#undef V333 +#define V333 (*(V + 333)) + {0xF00D, 0, 0, 0, 214}, +#undef V334 +#define V334 (*(V + 334)) + {0x12802, 0, -59, -59, 0}, +#undef V335 +#define V335 (*(V + 335)) + {0x1F001, -7615, 0, 0, 0}, +#undef V336 +#define V336 (*(V + 336)) + {0x1A802, 0, 8, 8, 0}, +#undef V337 +#define V337 (*(V + 337)) + {0x1A801, -8, 0, 0, 0}, +#undef V338 +#define V338 (*(V + 338)) + {0x1A802, 0, 74, 74, 0}, +#undef V339 +#define V339 (*(V + 339)) + {0x10802, 0, 74, 74, 0}, +#undef V340 +#define V340 (*(V + 340)) + {0x1A802, 0, 86, 86, 0}, +#undef V341 +#define V341 (*(V + 341)) + {0x10802, 0, 86, 86, 0}, +#undef V342 +#define V342 (*(V + 342)) + {0x1A802, 0, 100, 100, 0}, +#undef V343 +#define V343 (*(V + 343)) + {0x10802, 0, 100, 100, 0}, +#undef V344 +#define V344 (*(V + 344)) + {0x1A802, 0, 128, 128, 0}, +#undef V345 +#define V345 (*(V + 345)) + {0x10802, 0, 128, 128, 0}, +#undef V346 +#define V346 (*(V + 346)) + {0x1A802, 0, 112, 112, 0}, +#undef V347 +#define V347 (*(V + 347)) + {0x10802, 0, 112, 112, 0}, +#undef V348 +#define V348 (*(V + 348)) + {0x1A802, 0, 126, 126, 0}, +#undef V349 +#define V349 (*(V + 349)) + {0x10802, 0, 126, 126, 0}, +#undef V350 +#define V350 (*(V + 350)) + {0x1A803, -8, 0, 0, 0}, +#undef V351 +#define V351 (*(V + 351)) + {0x1A802, 0, 9, 9, 0}, +#undef V352 +#define V352 (*(V + 352)) + {0x1A801, -74, 0, 0, 0}, +#undef V353 +#define V353 (*(V + 353)) + {0x10801, -74, 0, 0, 0}, +#undef V354 +#define V354 (*(V + 354)) + {0x1A803, -9, 0, 0, 0}, +#undef V355 +#define V355 (*(V + 355)) + {0x10802, 0, -7205, -7205, 0}, +#undef V356 +#define V356 (*(V + 356)) + {0x1A801, -86, 0, 0, 0}, +#undef V357 +#define V357 (*(V + 357)) + {0x10801, -86, 0, 0, 0}, +#undef V358 +#define V358 (*(V + 358)) + {0x10802, 0, 0, 0, 0}, +#undef V359 +#define V359 (*(V + 359)) + {0x1A801, -100, 0, 0, 0}, +#undef V360 +#define V360 (*(V + 360)) + {0x10801, -100, 0, 0, 0}, +#undef V361 +#define V361 (*(V + 361)) + {0x1A802, 0, 7, 7, 0}, +#undef V362 +#define V362 (*(V + 362)) + {0x1A801, -112, 0, 0, 0}, +#undef V363 +#define V363 (*(V + 363)) + {0x10801, -112, 0, 0, 0}, +#undef V364 +#define V364 (*(V + 364)) + {0x1A801, -7, 0, 0, 0}, +#undef V365 +#define V365 (*(V + 365)) + {0xB0832, 0, 0, 0, 0}, +#undef V366 +#define V366 (*(V + 366)) + {0x1A801, -128, 0, 0, 0}, +#undef V367 +#define V367 (*(V + 367)) + {0x10801, -128, 0, 0, 0}, +#undef V368 +#define V368 (*(V + 368)) + {0x1A801, -126, 0, 0, 0}, +#undef V369 +#define V369 (*(V + 369)) + {0x10801, -126, 0, 0, 0}, +#undef V370 +#define V370 (*(V + 370)) + {0xA0814, 0, 0, 0, 0}, +#undef V371 +#define V371 (*(V + 371)) + {0xA3414, 0, 0, 0, 0}, +#undef V372 +#define V372 (*(V + 372)) + {0xF015, 0, 0, 0, 0}, +#undef V373 +#define V373 (*(V + 373)) + {0xF01C, 0, 0, 0, 0}, +#undef V374 +#define V374 (*(V + 374)) + {0x1F01D, 0, 0, 0, 0}, +#undef V375 +#define V375 (*(V + 375)) + {0x2F01D, 0, 0, 0, 0}, +#undef V376 +#define V376 (*(V + 376)) + {0xB3522, 0, 0, 0, 0}, +#undef V377 +#define V377 (*(V + 377)) + {0xBF021, 0, 0, 0, 0}, +#undef V378 +#define V378 (*(V + 378)) + {0xB342A, 0, 0, 0, 0}, +#undef V379 +#define V379 (*(V + 379)) + {0xBF036, 0, 0, 0, 0}, +#undef V380 +#define V380 (*(V + 380)) + {0xBF037, 0, 0, 0, 0}, +#undef V381 +#define V381 (*(V + 381)) + {0xBF034, 0, 0, 0, 0}, +#undef V382 +#define V382 (*(V + 382)) + {0xBF024, 0, 0, 0, 0}, +#undef V383 +#define V383 (*(V + 383)) + {0xB342C, 0, 0, 0, 0}, +#undef V384 +#define V384 (*(V + 384)) + {0xAF016, 0, 0, 0, 0}, +#undef V385 +#define V385 (*(V + 385)) + {0x8F017, 0, 0, 0, 0}, +#undef V386 +#define V386 (*(V + 386)) + {0xF01D, 0, 0, 0, 0}, +#undef V387 +#define V387 (*(V + 387)) + {0x5F038, 0, 0, 0, 0}, +#undef V388 +#define V388 (*(V + 388)) + {0x5342B, 0, 0, 0, 0}, +#undef V389 +#define V389 (*(V + 389)) + {0xB342B, 0, 0, 0, 0}, +#undef V390 +#define V390 (*(V + 390)) + {0x7F02F, 0, 0, 0, 0}, +#undef V391 +#define V391 (*(V + 391)) + {0x33493, 0, 0, 0, 0}, +#undef V392 +#define V392 (*(V + 392)) + {0x1033493, 0, 0, 0, 0}, +#undef V393 +#define V393 (*(V + 393)) + {0x1433493, 0, 0, 0, 0}, +#undef V394 +#define V394 (*(V + 394)) + {0x1833493, 0, 0, 0, 0}, +#undef V395 +#define V395 (*(V + 395)) + {0x1C33493, 0, 0, 0, 0}, +#undef V396 +#define V396 (*(V + 396)) + {0x2033493, 0, 0, 0, 0}, +#undef V397 +#define V397 (*(V + 397)) + {0x2433493, 0, 0, 0, 0}, +#undef V398 +#define V398 (*(V + 398)) + {0x4342F, 0, 0, 0, 0}, +#undef V399 +#define V399 (*(V + 399)) + {0x43430, 0, 0, 0, 0}, +#undef V400 +#define V400 (*(V + 400)) + {0xB342F, 0, 0, 0, 0}, +#undef V401 +#define V401 (*(V + 401)) + {0xB3423, 0, 0, 0, 0}, +#undef V402 +#define V402 (*(V + 402)) + {0xB3425, 0, 0, 0, 0}, +#undef V403 +#define V403 (*(V + 403)) + {0x53431, 0, 0, 0, 0}, +#undef V404 +#define V404 (*(V + 404)) + {0xB3433, 0, 0, 0, 0}, +#undef V405 +#define V405 (*(V + 405)) + {0x10801, -7517, 0, 0, 0}, +#undef V406 +#define V406 (*(V + 406)) + {0x10801, -8383, 0, 0, 0}, +#undef V407 +#define V407 (*(V + 407)) + {0x10801, -8262, 0, 0, 0}, +#undef V408 +#define V408 (*(V + 408)) + {0x1F001, 28, 0, 0, 0}, +#undef V409 +#define V409 (*(V + 409)) + {0x1F002, 0, -28, -28, 0}, +#undef V410 +#define V410 (*(V + 410)) + {0x13411, 16, 0, 0, 0}, +#undef V411 +#define V411 (*(V + 411)) + {0x13411, 0, -16, -16, 0}, +#undef V412 +#define V412 (*(V + 412)) + {0xBA82F, 0, 0, 0, 0}, +#undef V413 +#define V413 (*(V + 413)) + {0xBA833, 0, 0, 0, 0}, +#undef V414 +#define V414 (*(V + 414)) + {0x4F030, 0, 0, 0, 0}, +#undef V415 +#define V415 (*(V + 415)) + {0xB0823, 0, 0, 0, 0}, +#undef V416 +#define V416 (*(V + 416)) + {0xB0825, 0, 0, 0, 0}, +#undef V417 +#define V417 (*(V + 417)) + {0x4B3493, 0, 0, 0, 0}, +#undef V418 +#define V418 (*(V + 418)) + {0x8B3493, 0, 0, 0, 0}, +#undef V419 +#define V419 (*(V + 419)) + {0xCB3493, 0, 0, 0, 0}, +#undef V420 +#define V420 (*(V + 420)) + {0x10B3493, 0, 0, 0, 0}, +#undef V421 +#define V421 (*(V + 421)) + {0x14B3493, 0, 0, 0, 0}, +#undef V422 +#define V422 (*(V + 422)) + {0x18B3493, 0, 0, 0, 0}, +#undef V423 +#define V423 (*(V + 423)) + {0x1CB3493, 0, 0, 0, 0}, +#undef V424 +#define V424 (*(V + 424)) + {0x20B3493, 0, 0, 0, 0}, +#undef V425 +#define V425 (*(V + 425)) + {0x24B3493, 0, 0, 0, 0}, +#undef V426 +#define V426 (*(V + 426)) + {0x33413, 0, 0, 0, 0}, +#undef V427 +#define V427 (*(V + 427)) + {0x13433, 0, 0, 0, 0}, +#undef V428 +#define V428 (*(V + 428)) + {0x13433, 26, 0, 0, 0}, +#undef V429 +#define V429 (*(V + 429)) + {0x13433, 0, -26, -26, 0}, +#undef V430 +#define V430 (*(V + 430)) + {0xB3493, 0, 0, 0, 0}, +#undef V431 +#define V431 (*(V + 431)) + {0x4BF093, 0, 0, 0, 0}, +#undef V432 +#define V432 (*(V + 432)) + {0x8BF093, 0, 0, 0, 0}, +#undef V433 +#define V433 (*(V + 433)) + {0xCBF093, 0, 0, 0, 0}, +#undef V434 +#define V434 (*(V + 434)) + {0x10BF093, 0, 0, 0, 0}, +#undef V435 +#define V435 (*(V + 435)) + {0x14BF093, 0, 0, 0, 0}, +#undef V436 +#define V436 (*(V + 436)) + {0x18BF093, 0, 0, 0, 0}, +#undef V437 +#define V437 (*(V + 437)) + {0x1CBF093, 0, 0, 0, 0}, +#undef V438 +#define V438 (*(V + 438)) + {0x20BF093, 0, 0, 0, 0}, +#undef V439 +#define V439 (*(V + 439)) + {0x24BF093, 0, 0, 0, 0}, +#undef V440 +#define V440 (*(V + 440)) + {0xBF093, 0, 0, 0, 0}, +#undef V441 +#define V441 (*(V + 441)) + {0xBF026, 0, 0, 0, 0}, +#undef V442 +#define V442 (*(V + 442)) + {0xB082F, 0, 0, 0, 0}, +#undef V443 +#define V443 (*(V + 443)) + {0x1F001, -10743, 0, 0, 0}, +#undef V444 +#define V444 (*(V + 444)) + {0x1F001, -3814, 0, 0, 0}, +#undef V445 +#define V445 (*(V + 445)) + {0x1F001, -10727, 0, 0, 0}, +#undef V446 +#define V446 (*(V + 446)) + {0x1F002, 0, -10795, -10795, 0}, +#undef V447 +#define V447 (*(V + 447)) + {0x1F002, 0, -10792, -10792, 0}, +#undef V448 +#define V448 (*(V + 448)) + {0x1F001, -10780, 0, 0, 0}, +#undef V449 +#define V449 (*(V + 449)) + {0x1F001, -10749, 0, 0, 0}, +#undef V450 +#define V450 (*(V + 450)) + {0x1F001, -10783, 0, 0, 0}, +#undef V451 +#define V451 (*(V + 451)) + {0x1F001, -10782, 0, 0, 0}, +#undef V452 +#define V452 (*(V + 452)) + {0x1F001, -10815, 0, 0, 0}, +#undef V453 +#define V453 (*(V + 453)) + {0x1F002, 0, -7264, -7264, 0}, +#undef V454 +#define V454 (*(V + 454)) + {0x1F007, 0, 0, 0, 0}, +#undef V455 +#define V455 (*(V + 455)) + {0x1F012, 0, 0, 0, 0}, +#undef V456 +#define V456 (*(V + 456)) + {0xF00D, 0, 0, 0, 218}, +#undef V457 +#define V457 (*(V + 457)) + {0x1F00F, 0, 0, 0, 224}, +#undef V458 +#define V458 (*(V + 458)) + {0x13412, 0, 0, 0, 0}, +#undef V459 +#define V459 (*(V + 459)) + {0x1F009, 0, 0, 0, 0}, +#undef V460 +#define V460 (*(V + 460)) + {0x1A809, 0, 0, 0, 0}, +#undef V461 +#define V461 (*(V + 461)) + {0x500D, 0, 0, 0, 8}, +#undef V462 +#define V462 (*(V + 462)) + {0x1A804, 0, 0, 0, 0}, +#undef V463 +#define V463 (*(V + 463)) + {0x13409, 0, 0, 0, 0}, +#undef V464 +#define V464 (*(V + 464)) + {0x1F008, 0, 0, 0, 0}, +#undef V465 +#define V465 (*(V + 465)) + {0x1A808, 0, 0, 0, 0}, +#undef V466 +#define V466 (*(V + 466)) + {0xBF02E, 0, 0, 0, 0}, +#undef V467 +#define V467 (*(V + 467)) + {0x13408, 0, 0, 0, 0}, +#undef V468 +#define V468 (*(V + 468)) + {0x13413, 0, 0, 0, 0}, +#undef V469 +#define V469 (*(V + 469)) + {0x1F001, -35332, 0, 0, 0}, +#undef V470 +#define V470 (*(V + 470)) + {0x1F032, 0, 0, 0, 0}, +#undef V471 +#define V471 (*(V + 471)) + {0x1F001, -42280, 0, 0, 0}, +#undef V472 +#define V472 (*(V + 472)) + {0x1F001, -42308, 0, 0, 0}, +#undef V473 +#define V473 (*(V + 473)) + {0x1F001, -42319, 0, 0, 0}, +#undef V474 +#define V474 (*(V + 474)) + {0x1F001, -42315, 0, 0, 0}, +#undef V475 +#define V475 (*(V + 475)) + {0x1F001, -42305, 0, 0, 0}, +#undef V476 +#define V476 (*(V + 476)) + {0x1F001, -42258, 0, 0, 0}, +#undef V477 +#define V477 (*(V + 477)) + {0x1F001, -42282, 0, 0, 0}, +#undef V478 +#define V478 (*(V + 478)) + {0x1F001, -42261, 0, 0, 0}, +#undef V479 +#define V479 (*(V + 479)) + {0x1F001, 928, 0, 0, 0}, +#undef V480 +#define V480 (*(V + 480)) + {0x1F002, 0, -928, -928, 0}, +#undef V481 +#define V481 (*(V + 481)) + {0x1F002, 0, -38864, -38864, 0}, +#undef V482 +#define V482 (*(V + 482)) + {0x1F020, 0, 0, 0, 0}, +#undef V483 +#define V483 (*(V + 483)) + {0x1F220, 0, 0, 0, 0}, +#undef V484 +#define V484 (*(V + 484)) + {0x1F01F, 0, 0, 0, 0}, +#undef V485 +#define V485 (*(V + 485)) + {0x1F200, 0, 0, 0, 0}, +#undef V486 +#define V486 (*(V + 486)) + {0x10807, 0, 0, 0, 0}, +#undef V487 +#define V487 (*(V + 487)) + {0x20806, 0, 0, 0, 0}, +#undef V488 +#define V488 (*(V + 488)) + {0xF00D, 0, 0, 0, 26}, +#undef V489 +#define V489 (*(V + 489)) + {0x23406, 0, 0, 0, 0}, +#undef V490 +#define V490 (*(V + 490)) + {0xF032, 0, 0, 0, 0}, +#undef V491 +#define V491 (*(V + 491)) + {0x3431, 0, 0, 0, 0}, +#undef V492 +#define V492 (*(V + 492)) + {0xB3421, 0, 0, 0, 0}, +#undef V493 +#define V493 (*(V + 493)) + {0xB3429, 0, 0, 0, 0}, +#undef V494 +#define V494 (*(V + 494)) + {0xB3424, 0, 0, 0, 0}, +#undef V495 +#define V495 (*(V + 495)) + {0xB3426, 0, 0, 0, 0}, +#undef V496 +#define V496 (*(V + 496)) + {0x7342C, 0, 0, 0, 0}, +#undef V497 +#define V497 (*(V + 497)) + {0x5342A, 0, 0, 0, 0}, +#undef V498 +#define V498 (*(V + 498)) + {0x43422, 0, 0, 0, 0}, +#undef V499 +#define V499 (*(V + 499)) + {0xF11E, 0, 0, 0, 0}, +#undef V500 +#define V500 (*(V + 500)) + {0xB3438, 0, 0, 0, 0}, +#undef V501 +#define V501 (*(V + 501)) + {0x7342A, 0, 0, 0, 0}, +#undef V502 +#define V502 (*(V + 502)) + {0x33490, 0, 0, 0, 0}, +#undef V503 +#define V503 (*(V + 503)) + {0x433490, 0, 0, 0, 0}, +#undef V504 +#define V504 (*(V + 504)) + {0x833490, 0, 0, 0, 0}, +#undef V505 +#define V505 (*(V + 505)) + {0xC33490, 0, 0, 0, 0}, +#undef V506 +#define V506 (*(V + 506)) + {0x1033490, 0, 0, 0, 0}, +#undef V507 +#define V507 (*(V + 507)) + {0x1433490, 0, 0, 0, 0}, +#undef V508 +#define V508 (*(V + 508)) + {0x1833490, 0, 0, 0, 0}, +#undef V509 +#define V509 (*(V + 509)) + {0x1C33490, 0, 0, 0, 0}, +#undef V510 +#define V510 (*(V + 510)) + {0x2033490, 0, 0, 0, 0}, +#undef V511 +#define V511 (*(V + 511)) + {0x2433490, 0, 0, 0, 0}, +#undef V512 +#define V512 (*(V + 512)) + {0x13401, 32, 0, 0, 0}, +#undef V513 +#define V513 (*(V + 513)) + {0x13402, 0, -32, -32, 0}, +#undef V514 +#define V514 (*(V + 514)) + {0xB342E, 0, 0, 0, 0}, +#undef V515 +#define V515 (*(V + 515)) + {0xBF01B, 0, 0, 0, 0}, +#undef V516 +#define V516 (*(V + 516)) + {0xBF011, 0, 0, 0, 0}, +#undef V517 +#define V517 (*(V + 517)) + {0x3F013, 0, 0, 0, 0}, +#undef V518 +#define V518 (*(V + 518)) + {0x1F001, 40, 0, 0, 0}, +#undef V519 +#define V519 (*(V + 519)) + {0x1F002, 0, -40, -40, 0}, +#undef V520 +#define V520 (*(V + 520)) + {0x2F013, 0, 0, 0, 0}, +#undef V521 +#define V521 (*(V + 521)) + {0x2F033, 0, 0, 0, 0}, +#undef V522 +#define V522 (*(V + 522)) + {0x42F093, 0, 0, 0, 0}, +#undef V523 +#define V523 (*(V + 523)) + {0x82F093, 0, 0, 0, 0}, +#undef V524 +#define V524 (*(V + 524)) + {0xC2F093, 0, 0, 0, 0}, +#undef V525 +#define V525 (*(V + 525)) + {0x102F093, 0, 0, 0, 0}, +#undef V526 +#define V526 (*(V + 526)) + {0x2F02C, 0, 0, 0, 0}, +#undef V527 +#define V527 (*(V + 527)) + {0x2F001, 64, 0, 0, 0}, +#undef V528 +#define V528 (*(V + 528)) + {0x2F002, 0, -64, -64, 0}, +#undef V529 +#define V529 (*(V + 529)) + {0x46F093, 0, 0, 0, 0}, +#undef V530 +#define V530 (*(V + 530)) + {0x86F093, 0, 0, 0, 0}, +#undef V531 +#define V531 (*(V + 531)) + {0xC6F093, 0, 0, 0, 0}, +#undef V532 +#define V532 (*(V + 532)) + {0x106F093, 0, 0, 0, 0}, +#undef V533 +#define V533 (*(V + 533)) + {0x146F093, 0, 0, 0, 0}, +#undef V534 +#define V534 (*(V + 534)) + {0x186F093, 0, 0, 0, 0}, +#undef V535 +#define V535 (*(V + 535)) + {0x1C6F093, 0, 0, 0, 0}, +#undef V536 +#define V536 (*(V + 536)) + {0x206F093, 0, 0, 0, 0}, +#undef V537 +#define V537 (*(V + 537)) + {0x246F093, 0, 0, 0, 0}, +#undef V538 +#define V538 (*(V + 538)) + {0x6F013, 0, 0, 0, 0}, +#undef V539 +#define V539 (*(V + 539)) + {0x1F01B, 0, 0, 0, 0}, +#undef V540 +#define V540 (*(V + 540)) + {0x1F00D, 0, 0, 0, 9}, +#undef V541 +#define V541 (*(V + 541)) + {0x10833, 0, 0, 0, 0}, +#undef V542 +#define V542 (*(V + 542)) + {0x1F00F, 0, 0, 0, 216}, +#undef V543 +#define V543 (*(V + 543)) + {0x1F00F, 0, 0, 0, 226}, +#undef V544 +#define V544 (*(V + 544)) + {0x1342F, 0, 0, 0, 0}, +#undef V545 +#define V545 (*(V + 545)) + {0x2F001, 34, 0, 0, 0}, +#undef V546 +#define V546 (*(V + 546)) + {0x2F002, 0, -34, -34, 0}, + }; + + static const NUnicode::NPrivate::TUnidataTable::TValuePtr P[][32] = { + { + &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0, + &V0, &V1, &V2, &V1, &V2, &V2, &V0, &V0, + &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0, + &V0, &V0, &V0, &V0, &V3, &V3, &V3, &V4, + }, // P[0] + { + &V5, &V6, &V7, &V8, &V9, &V8, &V10, &V11, + &V12, &V13, &V10, &V14, &V15, &V16, &V15, &V17, + &V18, &V19, &V20, &V21, &V22, &V23, &V24, &V25, + &V26, &V27, &V15, &V6, &V28, &V28, &V28, &V6, + }, // P[1] + { + &V10, &V29, &V29, &V29, &V29, &V29, &V29, &V30, + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + &V30, &V30, &V30, &V12, &V10, &V13, &V31, &V32, + }, // P[2] + { + &V31, &V33, &V33, &V33, &V33, &V33, &V33, &V34, + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + &V34, &V34, &V34, &V12, &V28, &V13, &V28, &V0, + }, // P[3] + { + &V0, &V0, &V0, &V0, &V0, &V35, &V0, &V0, + &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0, + &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0, + &V0, &V0, &V0, &V0, &V0, &V0, &V0, &V0, + }, // P[4] + { + &V36, &V10, &V9, &V9, &V9, &V9, &V37, &V10, + &V38, &V37, &V39, &V40, &V28, &V41, &V37, &V38, + &V42, &V43, &V44, &V45, &V38, &V46, &V10, &V47, + &V38, &V48, &V39, &V49, &V50, &V50, &V50, &V10, + }, // P[5] + { + &V51, &V51, &V51, &V51, &V51, &V51, &V30, &V51, + &V51, &V51, &V51, &V51, &V51, &V51, &V51, &V51, + &V30, &V51, &V51, &V51, &V51, &V51, &V51, &V28, + &V30, &V51, &V51, &V51, &V51, &V51, &V30, &V52, + }, // P[6] + { + &V53, &V53, &V53, &V53, &V53, &V53, &V34, &V53, + &V53, &V53, &V53, &V53, &V53, &V53, &V53, &V53, + &V34, &V53, &V53, &V53, &V53, &V53, &V53, &V28, + &V34, &V53, &V53, &V53, &V53, &V53, &V34, &V54, + }, // P[7] + { + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V57, &V58, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + }, // P[8] + { + &V55, &V56, &V55, &V56, &V55, &V56, &V57, &V58, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V59, &V60, &V61, &V62, &V55, &V56, &V55, &V56, + &V52, &V55, &V56, &V55, &V56, &V55, &V56, &V61, + }, // P[9] + { + &V62, &V57, &V58, &V55, &V56, &V55, &V56, &V55, + &V56, &V63, &V57, &V58, &V55, &V56, &V55, &V56, + &V55, &V56, &V57, &V58, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + }, // P[10] + { + &V55, &V56, &V55, &V56, &V55, &V56, &V57, &V58, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V64, &V55, &V56, &V55, &V56, &V55, &V56, &V65, + }, // P[11] + { + &V66, &V67, &V57, &V58, &V57, &V58, &V68, &V57, + &V58, &V69, &V69, &V57, &V58, &V52, &V70, &V71, + &V72, &V57, &V58, &V69, &V73, &V74, &V75, &V76, + &V57, &V58, &V77, &V52, &V75, &V78, &V79, &V80, + }, // P[12] + { + &V55, &V56, &V57, &V58, &V57, &V58, &V81, &V57, + &V58, &V81, &V52, &V52, &V57, &V58, &V81, &V55, + &V56, &V82, &V82, &V57, &V58, &V57, &V58, &V83, + &V57, &V58, &V52, &V84, &V57, &V58, &V52, &V85, + }, // P[13] + { + &V84, &V84, &V84, &V84, &V86, &V87, &V88, &V86, + &V87, &V88, &V86, &V87, &V88, &V55, &V56, &V55, + &V56, &V55, &V56, &V55, &V56, &V55, &V56, &V55, + &V56, &V55, &V56, &V55, &V56, &V89, &V55, &V56, + }, // P[14] + { + &V55, &V56, &V55, &V56, &V57, &V58, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V90, &V86, &V87, &V88, &V55, &V56, &V91, &V92, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + }, // P[15] + { + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V57, &V58, &V55, &V56, + }, // P[16] + { + &V93, &V52, &V57, &V58, &V57, &V58, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V52, &V52, &V52, &V52, + &V52, &V52, &V94, &V57, &V58, &V95, &V96, &V97, + }, // P[17] + { + &V97, &V57, &V58, &V98, &V99, &V100, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V101, &V102, &V103, &V104, &V105, &V52, &V106, &V106, + &V52, &V107, &V52, &V108, &V109, &V52, &V52, &V52, + }, // P[18] + { + &V106, &V110, &V52, &V111, &V52, &V112, &V113, &V52, + &V114, &V115, &V113, &V116, &V117, &V52, &V52, &V115, + &V52, &V118, &V119, &V52, &V52, &V120, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V121, &V52, &V52, + }, // P[19] + { + &V122, &V52, &V52, &V122, &V52, &V52, &V52, &V123, + &V122, &V124, &V125, &V125, &V126, &V52, &V52, &V52, + &V52, &V52, &V127, &V52, &V84, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V128, &V129, &V52, + }, // P[20] + { + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + &V130, &V131, &V131, &V132, &V132, &V132, &V132, &V132, + }, // P[21] + { + &V132, &V132, &V31, &V31, &V31, &V31, &V131, &V133, + &V131, &V131, &V131, &V131, &V131, &V131, &V131, &V131, + &V134, &V134, &V31, &V31, &V31, &V31, &V31, &V31, + &V38, &V38, &V38, &V38, &V38, &V38, &V31, &V31, + }, // P[22] + { + &V130, &V130, &V130, &V130, &V130, &V31, &V31, &V31, + &V31, &V31, &V31, &V31, &V131, &V31, &V132, &V31, + &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V31, + &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V31, + }, // P[23] + { + &V135, &V135, &V135, &V135, &V135, &V136, &V135, &V135, + &V135, &V135, &V135, &V135, &V135, &V136, &V136, &V135, + &V136, &V135, &V136, &V135, &V135, &V137, &V138, &V138, + &V138, &V138, &V137, &V139, &V138, &V138, &V138, &V138, + }, // P[24] + { + &V138, &V140, &V140, &V141, &V141, &V141, &V141, &V142, + &V142, &V138, &V138, &V138, &V138, &V141, &V141, &V138, + &V141, &V141, &V138, &V138, &V143, &V143, &V143, &V143, + &V144, &V138, &V138, &V138, &V138, &V136, &V136, &V136, + }, // P[25] + { + &V145, &V145, &V135, &V145, &V145, &V146, &V136, &V138, + &V138, &V138, &V136, &V136, &V136, &V138, &V138, &V147, + &V136, &V136, &V136, &V138, &V138, &V138, &V138, &V136, + &V137, &V138, &V138, &V136, &V148, &V149, &V149, &V148, + }, // P[26] + { + &V149, &V149, &V148, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V57, &V58, &V57, &V58, &V150, &V31, &V57, &V58, + &V151, &V151, &V152, &V79, &V79, &V79, &V153, &V154, + }, // P[27] + { + &V151, &V151, &V151, &V151, &V38, &V155, &V156, &V153, + &V157, &V157, &V157, &V151, &V158, &V151, &V159, &V159, + &V90, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + }, // P[28] + { + &V30, &V30, &V151, &V30, &V30, &V30, &V30, &V30, + &V30, &V30, &V51, &V51, &V160, &V161, &V161, &V161, + &V90, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + }, // P[29] + { + &V34, &V34, &V162, &V34, &V34, &V34, &V34, &V34, + &V34, &V34, &V53, &V53, &V163, &V164, &V164, &V165, + &V166, &V167, &V168, &V169, &V169, &V170, &V171, &V172, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + }, // P[30] + { + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V173, &V174, &V175, &V176, &V177, &V178, &V28, &V57, + &V58, &V179, &V57, &V58, &V52, &V93, &V93, &V93, + }, // P[31] + { + &V180, &V180, &V181, &V180, &V181, &V181, &V181, &V180, + &V181, &V181, &V181, &V181, &V180, &V180, &V180, &V181, + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + &V30, &V51, &V30, &V30, &V30, &V30, &V30, &V30, + }, // P[32] + { + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + &V34, &V53, &V34, &V34, &V34, &V34, &V34, &V34, + }, // P[33] + { + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + &V182, &V182, &V183, &V182, &V183, &V183, &V183, &V182, + &V183, &V183, &V183, &V183, &V182, &V182, &V182, &V183, + }, // P[34] + { + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V55, &V56, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + }, // P[35] + { + &V57, &V58, &V184, &V136, &V136, &V136, &V136, &V136, + &V185, &V185, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + }, // P[36] + { + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + }, // P[37] + { + &V186, &V55, &V56, &V57, &V58, &V57, &V58, &V57, + &V58, &V57, &V58, &V57, &V58, &V57, &V58, &V187, + &V55, &V56, &V55, &V56, &V57, &V58, &V55, &V56, + &V57, &V58, &V55, &V56, &V55, &V56, &V55, &V56, + }, // P[38] + { + &V57, &V58, &V55, &V56, &V55, &V56, &V55, &V56, + &V57, &V58, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V57, &V58, + &V55, &V56, &V57, &V58, &V57, &V58, &V57, &V58, + }, // P[39] + { + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V151, &V188, &V188, &V188, &V188, &V188, &V188, &V188, + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188, + }, // P[40] + { + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188, + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188, + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V151, + &V151, &V132, &V189, &V189, &V189, &V189, &V189, &V189, + }, // P[41] + { + &V151, &V190, &V190, &V190, &V190, &V190, &V190, &V190, + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190, + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190, + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190, + }, // P[42] + { + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V63, + &V151, &V191, &V192, &V151, &V151, &V37, &V37, &V9, + &V151, &V138, &V136, &V136, &V136, &V136, &V138, &V136, + &V136, &V136, &V193, &V138, &V136, &V136, &V136, &V136, + }, // P[43] + { + &V136, &V136, &V138, &V138, &V138, &V138, &V138, &V138, + &V136, &V136, &V138, &V136, &V136, &V193, &V194, &V136, + &V195, &V196, &V197, &V198, &V199, &V200, &V201, &V202, + &V203, &V204, &V204, &V205, &V206, &V207, &V208, &V209, + }, // P[44] + { + &V210, &V211, &V212, &V210, &V136, &V138, &V210, &V203, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + }, // P[45] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V151, &V151, &V151, &V151, &V151, + &V213, &V213, &V213, &V210, &V210, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[46] + { + &V214, &V214, &V214, &V214, &V214, &V214, &V28, &V28, + &V215, &V8, &V8, &V216, &V15, &V217, &V37, &V37, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V218, &V219, &V220, &V221, &V41, &V151, &V217, &V221, + }, // P[47] + { + &V222, &V222, &V223, &V223, &V223, &V223, &V223, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + }, // P[48] + { + &V224, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V225, &V226, &V227, &V218, &V219, + &V220, &V228, &V229, &V135, &V135, &V141, &V138, &V136, + &V136, &V136, &V136, &V136, &V138, &V136, &V136, &V138, + }, // P[49] + { + &V230, &V231, &V232, &V233, &V234, &V235, &V236, &V237, + &V238, &V239, &V8, &V240, &V240, &V217, &V222, &V222, + &V241, &V222, &V222, &V222, &V222, &V242, &V242, &V242, + &V242, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + }, // P[50] + { + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + }, // P[51] + { + &V223, &V222, &V223, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V223, &V221, &V222, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V214, &V37, &V136, + }, // P[52] + { + &V136, &V136, &V136, &V138, &V136, &V243, &V243, &V136, + &V136, &V37, &V138, &V136, &V136, &V138, &V222, &V222, + &V244, &V245, &V246, &V247, &V248, &V249, &V250, &V251, + &V252, &V253, &V222, &V222, &V222, &V254, &V254, &V222, + }, // P[53] + { + &V217, &V221, &V221, &V221, &V221, &V221, &V221, &V221, + &V221, &V221, &V217, &V217, &V217, &V217, &V151, &V41, + &V222, &V255, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + }, // P[54] + { + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V136, &V138, &V136, &V136, &V138, &V136, &V136, &V138, + &V138, &V138, &V136, &V138, &V138, &V136, &V138, &V136, + }, // P[55] + { + &V136, &V136, &V138, &V136, &V138, &V136, &V138, &V136, + &V138, &V136, &V136, &V151, &V151, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + }, // P[56] + { + &V222, &V222, &V222, &V222, &V222, &V222, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V222, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[57] + { + &V256, &V257, &V258, &V259, &V260, &V261, &V262, &V263, + &V264, &V265, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + }, // P[58] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V138, &V136, &V266, &V266, &V37, &V10, + &V6, &V6, &V266, &V151, &V151, &V151, &V151, &V151, + }, // P[59] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V136, &V136, + &V136, &V136, &V267, &V136, &V136, &V136, &V136, &V136, + }, // P[60] + { + &V136, &V136, &V136, &V136, &V267, &V136, &V136, &V136, + &V267, &V136, &V136, &V136, &V136, &V136, &V151, &V151, + &V210, &V210, &V210, &V210, &V210, &V210, &V210, &V210, + &V210, &V210, &V210, &V210, &V210, &V210, &V210, &V151, + }, // P[61] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V138, &V138, &V138, &V151, &V151, &V210, &V151, + }, // P[62] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[63] + { + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V151, &V222, &V222, + &V222, &V222, &V222, &V222, &V222, &V222, &V151, &V151, + }, // P[64] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + }, // P[65] + { + &V136, &V136, &V214, &V138, &V136, &V136, &V138, &V136, + &V136, &V138, &V136, &V136, &V136, &V138, &V138, &V138, + &V225, &V226, &V227, &V136, &V136, &V136, &V138, &V136, + &V136, &V138, &V138, &V136, &V136, &V136, &V136, &V136, + }, // P[66] + { + &V147, &V147, &V147, &V268, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[67] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V269, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V269, &V84, &V84, &V269, &V84, &V84, &V84, + &V84, &V84, &V147, &V268, &V270, &V84, &V268, &V268, + }, // P[68] + { + &V268, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V268, &V268, &V268, &V268, &V271, &V268, &V268, + &V84, &V136, &V138, &V136, &V136, &V147, &V147, &V147, + &V272, &V272, &V272, &V272, &V272, &V272, &V272, &V272, + }, // P[69] + { + &V84, &V84, &V147, &V147, &V191, &V191, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V189, &V134, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[70] + { + &V84, &V147, &V268, &V268, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V84, + &V84, &V151, &V151, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[71] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V151, &V151, &V151, &V84, &V84, + &V84, &V84, &V151, &V151, &V283, &V84, &V284, &V268, + }, // P[72] + { + &V268, &V147, &V147, &V147, &V147, &V151, &V151, &V268, + &V268, &V151, &V151, &V285, &V285, &V271, &V84, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V284, + &V151, &V151, &V151, &V151, &V272, &V272, &V151, &V272, + }, // P[73] + { + &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V84, &V84, &V9, &V9, &V286, &V286, &V286, &V286, + &V286, &V286, &V184, &V9, &V151, &V151, &V151, &V151, + }, // P[74] + { + &V151, &V147, &V147, &V268, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V84, + &V84, &V151, &V151, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[75] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V272, &V151, &V84, &V272, &V151, + &V84, &V84, &V151, &V151, &V283, &V151, &V268, &V268, + }, // P[76] + { + &V268, &V147, &V147, &V151, &V151, &V151, &V151, &V147, + &V147, &V151, &V151, &V147, &V147, &V271, &V151, &V151, + &V151, &V147, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V272, &V272, &V272, &V84, &V151, &V272, &V151, + }, // P[77] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V147, &V147, &V84, &V84, &V84, &V147, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[78] + { + &V151, &V147, &V147, &V268, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V84, + &V84, &V84, &V151, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[79] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V151, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V283, &V84, &V268, &V268, + }, // P[80] + { + &V268, &V147, &V147, &V147, &V147, &V147, &V151, &V147, + &V147, &V268, &V151, &V268, &V268, &V271, &V151, &V151, + &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[81] + { + &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V189, &V9, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V84, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[82] + { + &V151, &V147, &V268, &V268, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V84, + &V84, &V151, &V151, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[83] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V151, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V283, &V84, &V284, &V147, + }, // P[84] + { + &V268, &V147, &V147, &V147, &V147, &V151, &V151, &V268, + &V285, &V151, &V151, &V285, &V285, &V271, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V287, &V284, + &V151, &V151, &V151, &V151, &V272, &V272, &V151, &V84, + }, // P[85] + { + &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V184, &V84, &V286, &V286, &V286, &V286, &V286, &V286, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[86] + { + &V151, &V151, &V147, &V84, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V151, &V151, &V151, &V84, &V84, + &V84, &V151, &V84, &V84, &V269, &V84, &V151, &V151, + &V151, &V84, &V84, &V151, &V84, &V151, &V84, &V84, + }, // P[87] + { + &V151, &V151, &V151, &V84, &V84, &V151, &V151, &V151, + &V84, &V84, &V84, &V151, &V151, &V151, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V151, &V151, &V284, &V268, + }, // P[88] + { + &V147, &V268, &V268, &V151, &V151, &V151, &V268, &V268, + &V268, &V151, &V285, &V285, &V285, &V271, &V151, &V151, + &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V284, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[89] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V286, &V286, &V286, &V37, &V37, &V37, &V37, &V37, + &V37, &V9, &V37, &V151, &V151, &V151, &V151, &V151, + }, // P[90] + { + &V147, &V268, &V268, &V268, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[91] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V151, &V84, &V147, &V147, + }, // P[92] + { + &V147, &V268, &V268, &V268, &V268, &V151, &V147, &V147, + &V288, &V151, &V147, &V147, &V147, &V271, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V289, &V290, &V151, + &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V151, + }, // P[93] + { + &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V291, &V291, &V291, &V291, &V291, &V291, &V291, &V184, + }, // P[94] + { + &V84, &V147, &V268, &V268, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[95] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V151, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V283, &V84, &V268, &V292, + }, // P[96] + { + &V285, &V268, &V284, &V268, &V268, &V151, &V292, &V285, + &V285, &V151, &V285, &V285, &V147, &V271, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V284, &V284, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V84, &V151, + }, // P[97] + { + &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V151, &V84, &V84, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[98] + { + &V151, &V147, &V268, &V268, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[99] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V151, &V151, &V84, &V284, &V268, + }, // P[100] + { + &V268, &V147, &V147, &V147, &V147, &V151, &V268, &V268, + &V268, &V151, &V285, &V285, &V285, &V271, &V84, &V184, + &V151, &V151, &V151, &V151, &V84, &V84, &V84, &V284, + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V84, + }, // P[101] + { + &V84, &V84, &V147, &V147, &V151, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V184, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[102] + { + &V151, &V151, &V268, &V268, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V151, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[103] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V151, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V151, &V84, &V151, &V151, + }, // P[104] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V151, &V151, &V293, &V151, &V151, &V151, &V151, &V284, + &V268, &V268, &V147, &V147, &V147, &V151, &V147, &V151, + &V268, &V268, &V285, &V268, &V285, &V285, &V285, &V284, + }, // P[105] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V151, &V151, &V268, &V268, &V189, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[106] + { + &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[107] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V147, &V84, &V39, &V147, &V147, &V147, &V147, + &V294, &V294, &V271, &V151, &V151, &V151, &V151, &V9, + }, // P[108] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V134, &V147, + &V295, &V295, &V295, &V295, &V147, &V147, &V147, &V189, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V189, &V189, &V151, &V151, &V151, &V151, + }, // P[109] + { + &V151, &V84, &V84, &V151, &V84, &V151, &V151, &V84, + &V84, &V151, &V84, &V151, &V151, &V84, &V151, &V151, + &V151, &V151, &V151, &V151, &V84, &V84, &V84, &V84, + &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[110] + { + &V151, &V84, &V84, &V84, &V151, &V84, &V151, &V84, + &V151, &V151, &V84, &V84, &V151, &V84, &V84, &V84, + &V84, &V147, &V84, &V39, &V147, &V147, &V147, &V147, + &V296, &V296, &V151, &V147, &V147, &V84, &V151, &V151, + }, // P[111] + { + &V84, &V84, &V84, &V84, &V84, &V151, &V134, &V151, + &V297, &V297, &V297, &V297, &V147, &V147, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V39, &V39, &V84, &V84, + }, // P[112] + { + &V84, &V184, &V184, &V184, &V189, &V189, &V189, &V189, + &V189, &V189, &V189, &V189, &V298, &V189, &V189, &V189, + &V189, &V189, &V189, &V184, &V189, &V184, &V184, &V184, + &V138, &V138, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[113] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V184, &V138, &V184, &V138, + &V184, &V299, &V12, &V13, &V12, &V13, &V268, &V268, + }, // P[114] + { + &V84, &V84, &V84, &V272, &V84, &V84, &V84, &V84, + &V151, &V84, &V84, &V84, &V84, &V272, &V84, &V84, + &V84, &V84, &V272, &V84, &V84, &V84, &V84, &V272, + &V84, &V84, &V84, &V84, &V272, &V84, &V84, &V84, + }, // P[115] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V272, &V84, &V84, &V84, &V151, &V151, &V151, + &V151, &V300, &V301, &V302, &V303, &V302, &V302, &V304, + &V302, &V304, &V301, &V301, &V301, &V301, &V147, &V268, + }, // P[116] + { + &V301, &V302, &V136, &V136, &V271, &V189, &V136, &V136, + &V84, &V84, &V84, &V84, &V84, &V147, &V147, &V147, + &V147, &V147, &V147, &V302, &V147, &V147, &V147, &V147, + &V151, &V147, &V147, &V147, &V147, &V302, &V147, &V147, + }, // P[117] + { + &V147, &V147, &V302, &V147, &V147, &V147, &V147, &V302, + &V147, &V147, &V147, &V147, &V302, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V302, &V147, &V147, &V147, &V151, &V184, &V184, + }, // P[118] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V138, &V184, + &V184, &V184, &V184, &V184, &V184, &V151, &V184, &V184, + &V189, &V189, &V189, &V189, &V189, &V184, &V184, &V184, + &V184, &V189, &V189, &V151, &V151, &V151, &V151, &V151, + }, // P[119] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[120] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V269, &V84, + &V84, &V84, &V84, &V268, &V268, &V147, &V287, &V147, + &V147, &V268, &V147, &V147, &V147, &V147, &V147, &V283, + &V268, &V271, &V271, &V268, &V268, &V147, &V147, &V84, + }, // P[121] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V189, &V189, &V189, &V189, &V189, &V189, + &V84, &V84, &V84, &V84, &V84, &V84, &V268, &V268, + &V147, &V147, &V84, &V84, &V84, &V84, &V147, &V147, + }, // P[122] + { + &V147, &V84, &V268, &V268, &V268, &V84, &V84, &V268, + &V268, &V268, &V268, &V268, &V268, &V268, &V84, &V84, + &V84, &V147, &V147, &V147, &V147, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[123] + { + &V84, &V84, &V147, &V268, &V268, &V147, &V147, &V268, + &V268, &V268, &V268, &V268, &V268, &V138, &V84, &V268, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V268, &V268, &V268, &V147, &V184, &V184, + }, // P[124] + { + &V305, &V305, &V305, &V305, &V305, &V305, &V305, &V305, + &V305, &V305, &V305, &V305, &V305, &V305, &V305, &V305, + &V305, &V305, &V305, &V305, &V305, &V305, &V305, &V305, + &V305, &V305, &V305, &V305, &V305, &V305, &V305, &V305, + }, // P[125] + { + &V305, &V305, &V305, &V305, &V305, &V305, &V151, &V305, + &V151, &V151, &V151, &V151, &V151, &V305, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[126] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V189, &V130, &V84, &V84, &V84, + }, // P[127] + { + &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306, + &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306, + &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306, + &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306, + }, // P[128] + { + &V307, &V308, &V308, &V308, &V308, &V308, &V308, &V308, + &V308, &V308, &V308, &V308, &V308, &V308, &V308, &V308, + &V308, &V308, &V308, &V308, &V308, &V308, &V307, &V307, + &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307, + }, // P[129] + { + &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307, + &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307, + &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307, + &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307, + }, // P[130] + { + &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307, + &V309, &V309, &V309, &V309, &V309, &V309, &V309, &V309, + &V309, &V309, &V309, &V309, &V309, &V309, &V309, &V309, + &V309, &V309, &V309, &V309, &V309, &V309, &V309, &V309, + }, // P[131] + { + &V309, &V309, &V309, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + }, // P[132] + { + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + }, // P[133] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151, + }, // P[134] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[135] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + }, // P[136] + { + &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[137] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[138] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V151, &V151, &V136, &V136, &V136, + }, // P[139] + { + &V189, &V189, &V191, &V191, &V191, &V191, &V191, &V191, + &V189, &V311, &V312, &V313, &V314, &V315, &V316, &V317, + &V318, &V319, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V286, &V151, &V151, &V151, + }, // P[140] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[141] + { + &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320, + &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320, + &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320, + &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320, + }, // P[142] + { + &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320, + &V320, &V320, &V320, &V320, &V320, &V320, &V320, &V320, + &V165, &V165, &V165, &V165, &V165, &V165, &V151, &V151, + &V172, &V172, &V172, &V172, &V172, &V172, &V151, &V151, + }, // P[143] + { + &V192, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[144] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V189, &V191, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[145] + { + &V5, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V12, &V13, &V151, &V151, &V151, + }, // P[146] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V189, &V189, &V189, &V321, &V321, + &V321, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[147] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84, + &V84, &V84, &V147, &V147, &V271, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[148] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V147, &V147, &V271, &V189, &V189, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[149] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V147, &V147, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[150] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V84, &V84, + &V84, &V151, &V147, &V147, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[151] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V147, &V147, &V268, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V268, &V268, + }, // P[152] + { + &V268, &V268, &V268, &V268, &V268, &V268, &V147, &V268, + &V268, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V271, &V147, &V189, &V189, &V189, &V134, + &V189, &V189, &V189, &V9, &V84, &V136, &V151, &V151, + }, // P[153] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + &V291, &V291, &V291, &V291, &V291, &V291, &V291, &V291, + &V291, &V291, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[154] + { + &V10, &V6, &V6, &V6, &V6, &V10, &V192, &V10, + &V6, &V6, &V10, &V147, &V147, &V147, &V41, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[155] + { + &V84, &V84, &V84, &V132, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[156] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[157] + { + &V84, &V84, &V84, &V84, &V84, &V147, &V147, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[158] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V194, &V84, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[159] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[160] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + }, // P[161] + { + &V147, &V147, &V147, &V268, &V268, &V268, &V268, &V147, + &V147, &V268, &V268, &V268, &V151, &V151, &V151, &V151, + &V268, &V268, &V147, &V268, &V268, &V268, &V268, &V268, + &V268, &V193, &V136, &V138, &V151, &V151, &V151, &V151, + }, // P[162] + { + &V37, &V151, &V151, &V151, &V6, &V6, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[163] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[164] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[165] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V311, &V151, &V151, &V151, &V37, &V37, + }, // P[166] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[167] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V136, + &V138, &V268, &V268, &V147, &V151, &V151, &V189, &V189, + }, // P[168] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V268, &V147, &V268, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V151, + }, // P[169] + { + &V271, &V268, &V147, &V268, &V268, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V268, &V268, &V268, + &V268, &V268, &V268, &V147, &V147, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V151, &V151, &V138, + }, // P[170] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[171] + { + &V189, &V189, &V189, &V189, &V189, &V189, &V189, &V134, + &V189, &V189, &V189, &V189, &V189, &V189, &V151, &V151, + &V136, &V136, &V136, &V136, &V136, &V138, &V138, &V138, + &V138, &V138, &V138, &V136, &V136, &V138, &V185, &V151, + }, // P[172] + { + &V147, &V147, &V147, &V147, &V268, &V84, &V269, &V84, + &V269, &V84, &V269, &V84, &V269, &V84, &V269, &V84, + &V84, &V84, &V269, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[173] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V283, &V284, &V147, &V147, + &V147, &V147, &V147, &V285, &V147, &V285, &V268, &V268, + }, // P[174] + { + &V285, &V285, &V147, &V285, &V322, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V189, &V189, &V189, &V189, &V189, &V189, + }, // P[175] + { + &V189, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V136, &V138, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V151, &V151, &V151, + }, // P[176] + { + &V147, &V147, &V268, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[177] + { + &V84, &V268, &V147, &V147, &V147, &V147, &V268, &V268, + &V147, &V147, &V322, &V271, &V147, &V147, &V84, &V84, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[178] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V283, &V268, + &V147, &V147, &V268, &V268, &V268, &V147, &V268, &V147, + &V147, &V147, &V322, &V322, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V189, &V189, &V189, &V189, + }, // P[179] + { + &V84, &V84, &V84, &V84, &V268, &V268, &V268, &V268, + &V268, &V268, &V268, &V268, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V268, &V268, &V147, &V283, + &V151, &V151, &V151, &V189, &V189, &V189, &V189, &V189, + }, // P[180] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V84, &V84, &V84, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[181] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V134, &V134, &V134, &V134, &V134, &V134, &V189, &V189, + }, // P[182] + { + &V323, &V324, &V325, &V326, &V326, &V327, &V328, &V329, + &V330, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[183] + { + &V189, &V189, &V189, &V189, &V189, &V189, &V189, &V189, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V136, &V136, &V136, &V189, &V143, &V138, &V138, &V138, + &V138, &V138, &V136, &V136, &V138, &V138, &V138, &V138, + }, // P[184] + { + &V136, &V268, &V143, &V143, &V143, &V143, &V143, &V143, + &V143, &V84, &V84, &V84, &V84, &V138, &V84, &V84, + &V84, &V84, &V268, &V268, &V136, &V84, &V84, &V151, + &V136, &V136, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[185] + { + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + }, // P[186] + { + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V130, &V130, &V130, &V132, + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + &V130, &V130, &V130, &V132, &V130, &V130, &V130, &V130, + }, // P[187] + { + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + &V130, &V130, &V130, &V130, &V130, &V130, &V132, &V130, + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + }, // P[188] + { + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + &V130, &V130, &V130, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V130, &V331, &V52, &V52, &V52, &V332, &V52, &V52, + }, // P[189] + { + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V130, &V130, &V130, &V130, &V130, + }, // P[190] + { + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + }, // P[191] + { + &V136, &V136, &V138, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V138, &V136, &V136, &V149, &V333, &V138, + &V140, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + }, // P[192] + { + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V151, &V151, + &V151, &V151, &V151, &V136, &V148, &V138, &V136, &V138, + }, // P[193] + { + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + }, // P[194] + { + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V90, &V90, + &V90, &V90, &V63, &V334, &V52, &V52, &V335, &V52, + }, // P[195] + { + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V55, &V56, &V55, &V56, &V55, &V56, + &V55, &V56, &V57, &V58, &V57, &V58, &V57, &V58, + }, // P[196] + { + &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336, + &V337, &V337, &V337, &V337, &V337, &V337, &V337, &V337, + &V336, &V336, &V336, &V336, &V336, &V336, &V151, &V151, + &V337, &V337, &V337, &V337, &V337, &V337, &V151, &V151, + }, // P[197] + { + &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336, + &V337, &V337, &V337, &V337, &V337, &V337, &V337, &V337, + &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336, + &V337, &V337, &V337, &V337, &V337, &V337, &V337, &V337, + }, // P[198] + { + &V336, &V336, &V336, &V336, &V336, &V336, &V151, &V151, + &V337, &V337, &V337, &V337, &V337, &V337, &V151, &V151, + &V90, &V336, &V90, &V336, &V90, &V336, &V90, &V336, + &V151, &V337, &V151, &V337, &V151, &V337, &V151, &V337, + }, // P[199] + { + &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336, + &V337, &V337, &V337, &V337, &V337, &V337, &V337, &V337, + &V338, &V339, &V340, &V341, &V340, &V341, &V342, &V343, + &V344, &V345, &V346, &V347, &V348, &V349, &V151, &V151, + }, // P[200] + { + &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336, + &V350, &V350, &V350, &V350, &V350, &V350, &V350, &V350, + &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336, + &V350, &V350, &V350, &V350, &V350, &V350, &V350, &V350, + }, // P[201] + { + &V336, &V336, &V336, &V336, &V336, &V336, &V336, &V336, + &V350, &V350, &V350, &V350, &V350, &V350, &V350, &V350, + &V336, &V336, &V90, &V351, &V90, &V151, &V90, &V90, + &V337, &V337, &V352, &V353, &V354, &V38, &V355, &V38, + }, // P[202] + { + &V38, &V155, &V90, &V351, &V90, &V151, &V90, &V90, + &V356, &V357, &V356, &V357, &V354, &V155, &V155, &V155, + &V336, &V336, &V90, &V358, &V151, &V151, &V90, &V90, + &V337, &V337, &V359, &V360, &V151, &V155, &V155, &V155, + }, // P[203] + { + &V336, &V336, &V90, &V358, &V90, &V361, &V90, &V90, + &V337, &V337, &V362, &V363, &V364, &V155, &V365, &V365, + &V151, &V151, &V90, &V351, &V90, &V151, &V90, &V90, + &V366, &V367, &V368, &V369, &V354, &V365, &V38, &V151, + }, // P[204] + { + &V370, &V370, &V371, &V371, &V371, &V371, &V371, &V371, + &V371, &V371, &V371, &V372, &V373, &V373, &V374, &V375, + &V192, &V376, &V377, &V377, &V377, &V377, &V10, &V378, + &V379, &V380, &V381, &V379, &V40, &V49, &V382, &V40, + }, // P[205] + { + &V10, &V10, &V10, &V10, &V378, &V378, &V383, &V10, + &V384, &V385, &V386, &V386, &V386, &V386, &V386, &V36, + &V8, &V8, &V387, &V388, &V388, &V11, &V389, &V389, + &V10, &V40, &V49, &V10, &V383, &V6, &V378, &V32, + }, // P[206] + { + &V32, &V10, &V10, &V10, &V390, &V12, &V13, &V383, + &V383, &V383, &V10, &V10, &V10, &V10, &V10, &V6, + &V10, &V10, &V28, &V10, &V32, &V10, &V10, &V389, + &V10, &V10, &V10, &V10, &V10, &V10, &V10, &V371, + }, // P[207] + { + &V373, &V41, &V41, &V41, &V41, &V151, &V386, &V386, + &V41, &V386, &V41, &V41, &V41, &V41, &V41, &V41, + &V391, &V130, &V151, &V151, &V392, &V393, &V394, &V395, + &V396, &V397, &V398, &V399, &V400, &V401, &V402, &V130, + }, // P[208] + { + &V391, &V48, &V44, &V45, &V392, &V393, &V394, &V395, + &V396, &V397, &V398, &V399, &V400, &V401, &V402, &V151, + &V130, &V130, &V130, &V130, &V130, &V130, &V130, &V130, + &V130, &V130, &V130, &V130, &V130, &V151, &V151, &V151, + }, // P[209] + { + &V9, &V9, &V9, &V9, &V9, &V9, &V9, &V9, + &V403, &V9, &V9, &V9, &V9, &V9, &V9, &V9, + &V9, &V9, &V9, &V9, &V9, &V9, &V9, &V9, + &V9, &V9, &V9, &V9, &V9, &V9, &V9, &V151, + }, // P[210] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V136, &V136, &V143, &V143, &V136, &V136, &V136, &V136, + &V143, &V143, &V143, &V136, &V136, &V185, &V185, &V185, + }, // P[211] + { + &V185, &V136, &V185, &V185, &V185, &V143, &V143, &V136, + &V138, &V136, &V143, &V143, &V138, &V138, &V138, &V138, + &V136, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[212] + { + &V404, &V404, &V168, &V404, &V37, &V404, &V404, &V168, + &V37, &V404, &V63, &V168, &V168, &V168, &V63, &V63, + &V168, &V168, &V168, &V63, &V37, &V168, &V404, &V37, + &V28, &V168, &V168, &V168, &V168, &V168, &V37, &V37, + }, // P[213] + { + &V404, &V404, &V404, &V37, &V168, &V37, &V405, &V37, + &V168, &V37, &V406, &V407, &V168, &V168, &V42, &V63, + &V168, &V168, &V408, &V168, &V63, &V39, &V39, &V39, + &V39, &V63, &V37, &V404, &V63, &V63, &V168, &V168, + }, // P[214] + { + &V400, &V28, &V28, &V28, &V28, &V168, &V63, &V63, + &V63, &V63, &V37, &V28, &V37, &V37, &V409, &V184, + &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50, + &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50, + }, // P[215] + { + &V410, &V410, &V410, &V410, &V410, &V410, &V410, &V410, + &V410, &V410, &V410, &V410, &V410, &V410, &V410, &V410, + &V411, &V411, &V411, &V411, &V411, &V411, &V411, &V411, + &V411, &V411, &V411, &V411, &V411, &V411, &V411, &V411, + }, // P[216] + { + &V321, &V321, &V321, &V57, &V58, &V321, &V321, &V321, + &V321, &V50, &V37, &V37, &V151, &V151, &V151, &V151, + &V28, &V28, &V28, &V28, &V28, &V37, &V37, &V37, + &V37, &V37, &V412, &V412, &V37, &V37, &V37, &V37, + }, // P[217] + { + &V28, &V37, &V37, &V28, &V37, &V37, &V28, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V412, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[218] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V413, &V412, &V412, + &V37, &V37, &V28, &V37, &V28, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[219] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[220] + { + &V28, &V28, &V28, &V28, &V412, &V28, &V28, &V28, + &V28, &V412, &V28, &V28, &V412, &V28, &V28, &V28, + &V28, &V28, &V414, &V43, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[221] + { + &V28, &V28, &V28, &V28, &V412, &V28, &V412, &V28, + &V28, &V28, &V28, &V28, &V400, &V400, &V28, &V400, + &V400, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[222] + { + &V28, &V412, &V28, &V28, &V412, &V28, &V28, &V412, + &V28, &V412, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[223] + { + &V412, &V28, &V412, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V412, &V412, &V412, + &V412, &V412, &V28, &V28, &V412, &V412, &V28, &V28, + &V412, &V412, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[224] + { + &V412, &V412, &V28, &V28, &V412, &V412, &V28, &V28, + &V412, &V412, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[225] + { + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V412, &V412, &V412, &V412, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[226] + { + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[227] + { + &V412, &V412, &V412, &V412, &V28, &V28, &V28, &V28, + &V28, &V28, &V412, &V412, &V412, &V412, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[228] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V12, &V13, &V12, &V13, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[229] + { + &V28, &V28, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V415, &V416, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[230] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[231] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V37, &V28, &V37, &V37, &V37, + }, // P[232] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V184, &V37, &V37, + &V37, &V37, &V37, &V28, &V28, &V28, &V28, &V28, + }, // P[233] + { + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[234] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V28, &V28, &V28, &V28, + }, // P[235] + { + &V28, &V28, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151, + }, // P[236] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[237] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[238] + { + &V417, &V418, &V419, &V420, &V421, &V422, &V423, &V424, + &V425, &V50, &V50, &V50, &V50, &V50, &V50, &V50, + &V50, &V50, &V50, &V50, &V417, &V418, &V419, &V420, + &V421, &V422, &V423, &V424, &V425, &V50, &V50, &V50, + }, // P[239] + { + &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50, + &V48, &V44, &V45, &V392, &V393, &V394, &V395, &V396, + &V397, &V426, &V426, &V426, &V426, &V426, &V426, &V426, + &V426, &V426, &V426, &V426, &V427, &V427, &V427, &V427, + }, // P[240] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V428, &V428, + &V428, &V428, &V428, &V428, &V428, &V428, &V428, &V428, + }, // P[241] + { + &V428, &V428, &V428, &V428, &V428, &V428, &V428, &V428, + &V428, &V428, &V428, &V428, &V428, &V428, &V428, &V428, + &V429, &V429, &V429, &V429, &V429, &V429, &V429, &V429, + &V429, &V429, &V429, &V429, &V429, &V429, &V429, &V429, + }, // P[242] + { + &V429, &V429, &V429, &V429, &V429, &V429, &V429, &V429, + &V429, &V429, &V430, &V291, &V291, &V291, &V291, &V291, + &V291, &V291, &V291, &V291, &V291, &V431, &V432, &V433, + &V434, &V435, &V436, &V437, &V438, &V439, &V291, &V440, + }, // P[243] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V28, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[244] + { + &V37, &V28, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[245] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[246] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V28, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[247] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V184, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[248] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V12, &V13, &V12, &V13, &V12, &V13, &V382, &V441, + &V12, &V13, &V12, &V13, &V12, &V13, &V431, &V432, + &V433, &V434, &V435, &V436, &V437, &V438, &V439, &V291, + }, // P[249] + { + &V431, &V432, &V433, &V434, &V435, &V436, &V437, &V438, + &V439, &V291, &V431, &V432, &V433, &V434, &V435, &V436, + &V437, &V438, &V439, &V291, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[250] + { + &V28, &V28, &V28, &V28, &V28, &V12, &V13, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[251] + { + &V28, &V28, &V28, &V28, &V28, &V28, &V12, &V13, + &V12, &V13, &V12, &V13, &V12, &V13, &V12, &V13, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[252] + { + &V28, &V28, &V28, &V12, &V13, &V12, &V13, &V12, + &V13, &V12, &V13, &V12, &V13, &V12, &V13, &V12, + &V13, &V12, &V13, &V12, &V13, &V12, &V13, &V12, + &V13, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[253] + { + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V12, &V13, &V12, &V13, &V28, &V28, &V28, &V28, + }, // P[254] + { + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V12, &V13, &V28, &V28, + }, // P[255] + { + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V400, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[256] + { + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V400, &V400, &V400, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[257] + { + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V442, &V28, &V28, &V28, + }, // P[258] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + &V28, &V28, &V28, &V28, &V28, &V28, &V28, &V28, + }, // P[259] + { + &V28, &V28, &V28, &V28, &V28, &V37, &V37, &V28, + &V28, &V28, &V28, &V28, &V28, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[260] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V151, &V151, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[261] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V151, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[262] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V151, &V151, &V151, &V37, &V37, &V37, + }, // P[263] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V151, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[264] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V37, &V37, &V37, &V37, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[265] + { + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188, + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188, + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188, + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188, + }, // P[266] + { + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V188, + &V188, &V188, &V188, &V188, &V188, &V188, &V188, &V151, + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190, + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190, + }, // P[267] + { + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190, + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190, + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V190, + &V190, &V190, &V190, &V190, &V190, &V190, &V190, &V151, + }, // P[268] + { + &V57, &V58, &V443, &V444, &V445, &V446, &V447, &V57, + &V58, &V57, &V58, &V57, &V58, &V448, &V449, &V450, + &V451, &V52, &V57, &V58, &V52, &V57, &V58, &V52, + &V52, &V52, &V52, &V52, &V130, &V130, &V452, &V452, + }, // P[269] + { + &V57, &V58, &V57, &V58, &V52, &V37, &V37, &V37, + &V37, &V37, &V37, &V57, &V58, &V57, &V58, &V136, + &V136, &V136, &V57, &V58, &V151, &V151, &V151, &V151, + &V151, &V6, &V6, &V6, &V10, &V291, &V6, &V10, + }, // P[270] + { + &V453, &V453, &V453, &V453, &V453, &V453, &V453, &V453, + &V453, &V453, &V453, &V453, &V453, &V453, &V453, &V453, + &V453, &V453, &V453, &V453, &V453, &V453, &V453, &V453, + &V453, &V453, &V453, &V453, &V453, &V453, &V453, &V453, + }, // P[271] + { + &V453, &V453, &V453, &V453, &V453, &V453, &V151, &V453, + &V151, &V151, &V151, &V151, &V151, &V453, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[272] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V130, + &V189, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V271, + }, // P[273] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[274] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + }, // P[275] + { + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + }, // P[276] + { + &V10, &V10, &V40, &V49, &V40, &V49, &V10, &V10, + &V10, &V40, &V49, &V10, &V40, &V49, &V10, &V10, + &V10, &V10, &V10, &V10, &V10, &V10, &V10, &V192, + &V10, &V10, &V192, &V10, &V40, &V49, &V10, &V10, + }, // P[277] + { + &V40, &V49, &V12, &V13, &V12, &V13, &V12, &V13, + &V12, &V13, &V10, &V10, &V10, &V10, &V6, &V133, + &V10, &V47, &V6, &V10, &V6, &V6, &V10, &V10, + &V10, &V10, &V377, &V377, &V6, &V10, &V10, &V10, + }, // P[278] + { + &V192, &V6, &V382, &V10, &V10, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[279] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V151, &V37, &V37, &V37, &V37, &V404, + }, // P[280] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V404, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[281] + { + &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404, + &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404, + &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404, + &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404, + }, // P[282] + { + &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404, + &V404, &V404, &V404, &V404, &V404, &V404, &V404, &V404, + &V404, &V404, &V404, &V404, &V404, &V404, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[283] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151, + }, // P[284] + { + &V371, &V6, &V6, &V10, &V37, &V134, &V454, &V455, + &V12, &V13, &V12, &V13, &V382, &V441, &V382, &V441, + &V12, &V13, &V37, &V37, &V12, &V13, &V12, &V13, + &V12, &V13, &V12, &V13, &V377, &V382, &V441, &V441, + }, // P[285] + { + &V37, &V455, &V455, &V455, &V455, &V455, &V455, &V455, + &V455, &V455, &V456, &V194, &V137, &V193, &V457, &V457, + &V377, &V134, &V134, &V134, &V134, &V134, &V404, &V37, + &V458, &V458, &V458, &V134, &V84, &V10, &V37, &V37, + }, // P[286] + { + &V151, &V459, &V459, &V459, &V459, &V459, &V459, &V459, + &V459, &V459, &V459, &V459, &V460, &V459, &V460, &V459, + &V460, &V459, &V460, &V459, &V460, &V459, &V460, &V459, + &V460, &V459, &V460, &V459, &V460, &V459, &V460, &V459, + }, // P[287] + { + &V460, &V459, &V460, &V459, &V459, &V460, &V459, &V460, + &V459, &V460, &V459, &V459, &V459, &V459, &V459, &V459, + &V460, &V460, &V459, &V460, &V460, &V459, &V460, &V460, + &V459, &V460, &V460, &V459, &V460, &V460, &V459, &V459, + }, // P[288] + { + &V459, &V459, &V459, &V459, &V459, &V459, &V459, &V459, + &V459, &V459, &V459, &V459, &V459, &V459, &V459, &V459, + &V459, &V459, &V459, &V459, &V460, &V459, &V459, &V151, + &V151, &V461, &V461, &V38, &V38, &V134, &V462, &V463, + }, // P[289] + { + &V192, &V464, &V464, &V464, &V464, &V464, &V464, &V464, + &V464, &V464, &V464, &V464, &V465, &V464, &V465, &V464, + &V465, &V464, &V465, &V464, &V465, &V464, &V465, &V464, + &V465, &V464, &V465, &V464, &V465, &V464, &V465, &V464, + }, // P[290] + { + &V465, &V464, &V465, &V464, &V464, &V465, &V464, &V465, + &V464, &V465, &V464, &V464, &V464, &V464, &V464, &V464, + &V465, &V465, &V464, &V465, &V465, &V464, &V465, &V465, + &V464, &V465, &V465, &V464, &V465, &V465, &V464, &V464, + }, // P[291] + { + &V464, &V464, &V464, &V464, &V464, &V464, &V464, &V464, + &V464, &V464, &V464, &V464, &V464, &V464, &V464, &V464, + &V464, &V464, &V464, &V464, &V465, &V464, &V464, &V465, + &V465, &V465, &V465, &V466, &V134, &V134, &V462, &V467, + }, // P[292] + { + &V151, &V151, &V151, &V151, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[293] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151, + &V151, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + }, // P[294] + { + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + }, // P[295] + { + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V151, + &V184, &V184, &V468, &V468, &V468, &V468, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + }, // P[296] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V151, + }, // P[297] + { + &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V464, &V464, &V464, &V464, &V464, &V464, &V464, &V464, + &V464, &V464, &V464, &V464, &V464, &V464, &V464, &V464, + }, // P[298] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V404, &V404, &V151, + }, // P[299] + { + &V468, &V468, &V468, &V468, &V468, &V468, &V468, &V468, + &V468, &V468, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + }, // P[300] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V404, &V50, &V50, &V50, &V50, &V50, &V50, &V50, + &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50, + }, // P[301] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V404, &V404, &V404, &V184, + }, // P[302] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V50, &V50, &V50, &V50, &V50, &V50, &V50, + &V50, &V50, &V50, &V50, &V50, &V50, &V50, &V50, + }, // P[303] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V404, &V404, &V404, &V404, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + }, // P[304] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V151, + }, // P[305] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + }, // P[306] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V404, + &V404, &V404, &V404, &V427, &V427, &V427, &V427, &V427, + }, // P[307] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V404, &V404, + }, // P[308] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V404, + }, // P[309] + { + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + }, // P[310] + { + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[311] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V134, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[312] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[313] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[314] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V132, &V132, &V132, &V132, &V132, &V132, &V191, &V191, + }, // P[315] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V134, &V6, &V6, &V6, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[316] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V84, &V84, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[317] + { + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V84, &V136, + &V185, &V185, &V185, &V10, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V10, &V133, + }, // P[318] + { + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V130, &V130, &V136, &V136, + }, // P[319] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V321, &V321, + &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321, + &V136, &V136, &V189, &V191, &V191, &V191, &V191, &V191, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[320] + { + &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V31, + &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V31, + &V31, &V31, &V31, &V31, &V31, &V31, &V31, &V131, + &V131, &V131, &V131, &V131, &V131, &V131, &V131, &V131, + }, // P[321] + { + &V31, &V31, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V52, &V52, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + }, // P[322] + { + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V130, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V57, &V58, &V57, &V58, &V469, &V57, &V58, + }, // P[323] + { + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V131, &V470, &V470, &V57, &V58, &V471, &V52, &V84, + &V57, &V58, &V57, &V58, &V52, &V52, &V57, &V58, + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + }, // P[324] + { + &V57, &V58, &V57, &V58, &V57, &V58, &V57, &V58, + &V57, &V58, &V472, &V473, &V474, &V475, &V472, &V151, + &V476, &V477, &V478, &V479, &V57, &V58, &V57, &V58, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[325] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V84, + &V130, &V130, &V52, &V84, &V84, &V84, &V84, &V84, + }, // P[326] + { + &V84, &V84, &V147, &V84, &V84, &V84, &V271, &V84, + &V84, &V84, &V84, &V147, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[327] + { + &V84, &V84, &V84, &V268, &V268, &V147, &V147, &V268, + &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151, + &V286, &V286, &V286, &V286, &V286, &V286, &V184, &V184, + &V9, &V42, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[328] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V10, &V10, &V10, &V10, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[329] + { + &V268, &V268, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[330] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V268, &V268, &V268, &V268, + &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268, + }, // P[331] + { + &V268, &V268, &V268, &V268, &V271, &V147, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V191, &V191, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[332] + { + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V84, &V84, &V84, &V84, &V84, &V84, + &V189, &V189, &V189, &V84, &V189, &V84, &V151, &V151, + }, // P[333] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[334] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V147, &V147, + &V147, &V147, &V147, &V138, &V138, &V138, &V189, &V189, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[335] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V268, &V322, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V189, + }, // P[336] + { + &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306, + &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306, + &V306, &V306, &V306, &V306, &V306, &V306, &V306, &V306, + &V306, &V306, &V306, &V306, &V306, &V151, &V151, &V151, + }, // P[337] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V283, &V268, &V268, &V147, &V147, + &V147, &V147, &V268, &V268, &V147, &V268, &V268, &V268, + }, // P[338] + { + &V322, &V189, &V189, &V189, &V189, &V189, &V189, &V189, + &V189, &V189, &V189, &V189, &V189, &V189, &V151, &V134, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V189, &V189, + }, // P[339] + { + &V84, &V84, &V84, &V84, &V84, &V147, &V132, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V84, &V84, &V84, &V84, &V84, &V151, + }, // P[340] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V147, &V147, &V147, &V147, &V147, &V147, &V268, + &V268, &V147, &V147, &V268, &V268, &V147, &V147, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[341] + { + &V84, &V84, &V84, &V147, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V147, &V268, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V189, &V191, &V191, &V191, + }, // P[342] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V132, &V84, &V84, &V84, &V84, &V84, &V84, &V184, + &V184, &V184, &V84, &V268, &V147, &V268, &V84, &V84, + }, // P[343] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V136, &V84, &V136, &V136, &V138, &V84, &V84, &V136, + &V136, &V84, &V84, &V84, &V84, &V84, &V136, &V136, + }, // P[344] + { + &V84, &V136, &V84, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V84, &V84, &V134, &V189, &V189, + }, // P[345] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V268, &V147, &V147, &V268, &V268, + &V189, &V189, &V84, &V134, &V134, &V268, &V271, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[346] + { + &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V151, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[347] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + }, // P[348] + { + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V52, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V480, &V52, &V52, &V52, &V52, + &V52, &V52, &V52, &V470, &V130, &V130, &V130, &V130, + }, // P[349] + { + &V52, &V52, &V52, &V52, &V52, &V52, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481, + &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481, + }, // P[350] + { + &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481, + &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481, + &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481, + &V481, &V481, &V481, &V481, &V481, &V481, &V481, &V481, + }, // P[351] + { + &V84, &V84, &V84, &V268, &V268, &V147, &V268, &V268, + &V147, &V268, &V268, &V189, &V268, &V271, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[352] + { + &V269, &V269, &V269, &V269, &V269, &V269, &V269, &V269, + &V269, &V269, &V269, &V269, &V269, &V269, &V269, &V269, + &V269, &V269, &V269, &V269, &V269, &V269, &V269, &V269, + &V269, &V269, &V269, &V269, &V269, &V269, &V269, &V269, + }, // P[353] + { + &V269, &V269, &V269, &V269, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307, + &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V307, + }, // P[354] + { + &V307, &V307, &V307, &V307, &V307, &V307, &V307, &V151, + &V151, &V151, &V151, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + }, // P[355] + { + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V310, &V310, &V310, &V310, + &V310, &V310, &V310, &V310, &V151, &V151, &V151, &V151, + }, // P[356] + { + &V482, &V482, &V482, &V482, &V482, &V482, &V482, &V482, + &V482, &V482, &V482, &V482, &V482, &V482, &V482, &V482, + &V482, &V482, &V482, &V482, &V482, &V482, &V482, &V482, + &V482, &V482, &V482, &V482, &V482, &V482, &V482, &V482, + }, // P[357] + { + &V483, &V483, &V483, &V483, &V483, &V483, &V483, &V483, + &V483, &V483, &V483, &V483, &V483, &V483, &V483, &V483, + &V483, &V483, &V483, &V483, &V483, &V483, &V483, &V483, + &V483, &V483, &V483, &V483, &V483, &V483, &V483, &V483, + }, // P[358] + { + &V484, &V484, &V484, &V484, &V484, &V484, &V484, &V484, + &V484, &V484, &V484, &V484, &V484, &V484, &V484, &V484, + &V484, &V484, &V484, &V484, &V484, &V484, &V484, &V484, + &V484, &V484, &V484, &V484, &V484, &V484, &V484, &V484, + }, // P[359] + { + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + }, // P[360] + { + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + }, // P[361] + { + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V454, &V454, + &V486, &V454, &V486, &V454, &V454, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V454, + }, // P[362] + { + &V486, &V454, &V486, &V454, &V454, &V486, &V486, &V454, + &V454, &V454, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + }, // P[363] + { + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V151, &V151, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + }, // P[364] + { + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[365] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V63, &V63, &V63, &V63, &V63, + &V151, &V151, &V151, &V151, &V151, &V487, &V488, &V487, + }, // P[366] + { + &V489, &V489, &V489, &V489, &V489, &V489, &V489, &V489, + &V489, &V398, &V487, &V487, &V487, &V487, &V487, &V487, + &V487, &V487, &V487, &V487, &V487, &V487, &V487, &V151, + &V487, &V487, &V487, &V487, &V487, &V151, &V487, &V151, + }, // P[367] + { + &V487, &V487, &V151, &V487, &V487, &V151, &V487, &V487, + &V487, &V487, &V487, &V487, &V487, &V487, &V487, &V489, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + }, // P[368] + { + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + }, // P[369] + { + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V490, &V490, &V490, &V490, &V490, &V490, + &V490, &V490, &V490, &V490, &V490, &V490, &V490, &V490, + }, // P[370] + { + &V490, &V490, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + }, // P[371] + { + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V13, &V12, + }, // P[372] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + }, // P[373] + { + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V151, &V151, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + }, // P[374] + { + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[375] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V491, &V37, &V151, &V151, + }, // P[376] + { + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V383, &V383, &V383, &V383, &V383, &V383, &V383, &V401, + &V402, &V383, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[377] + { + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V138, + &V138, &V138, &V138, &V138, &V138, &V138, &V136, &V136, + &V378, &V492, &V492, &V493, &V493, &V401, &V402, &V401, + &V402, &V401, &V402, &V401, &V402, &V401, &V402, &V401, + }, // P[378] + { + &V402, &V494, &V495, &V494, &V495, &V10, &V10, &V401, + &V402, &V378, &V378, &V378, &V378, &V493, &V493, &V493, + &V496, &V383, &V496, &V151, &V383, &V496, &V383, &V383, + &V492, &V401, &V402, &V401, &V402, &V401, &V402, &V497, + }, // P[379] + { + &V378, &V378, &V398, &V498, &V400, &V400, &V400, &V151, + &V378, &V403, &V497, &V378, &V151, &V151, &V151, &V151, + &V242, &V242, &V242, &V222, &V242, &V151, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + }, // P[380] + { + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V151, &V151, &V499, + }, // P[381] + { + &V151, &V383, &V389, &V497, &V403, &V497, &V378, &V500, + &V401, &V402, &V378, &V398, &V496, &V498, &V496, &V501, + &V502, &V503, &V504, &V505, &V506, &V507, &V508, &V509, + &V510, &V511, &V496, &V383, &V400, &V400, &V400, &V383, + }, // P[382] + { + &V378, &V512, &V512, &V512, &V512, &V512, &V512, &V512, + &V512, &V512, &V512, &V512, &V512, &V512, &V512, &V512, + &V512, &V512, &V512, &V512, &V512, &V512, &V512, &V512, + &V512, &V512, &V512, &V401, &V378, &V402, &V38, &V493, + }, // P[383] + { + &V38, &V513, &V513, &V513, &V513, &V513, &V513, &V513, + &V513, &V513, &V513, &V513, &V513, &V513, &V513, &V513, + &V513, &V513, &V513, &V513, &V513, &V513, &V513, &V513, + &V513, &V513, &V513, &V401, &V400, &V402, &V400, &V401, + }, // P[384] + { + &V402, &V383, &V494, &V495, &V383, &V514, &V467, &V467, + &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467, + &V152, &V467, &V467, &V467, &V467, &V467, &V467, &V467, + &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467, + }, // P[385] + { + &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467, + &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467, + &V467, &V467, &V467, &V467, &V467, &V467, &V467, &V467, + &V467, &V467, &V467, &V467, &V467, &V467, &V152, &V152, + }, // P[386] + { + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V39, + &V39, &V39, &V39, &V39, &V39, &V39, &V39, &V151, + }, // P[387] + { + &V151, &V151, &V39, &V39, &V39, &V39, &V39, &V39, + &V151, &V151, &V39, &V39, &V39, &V39, &V39, &V39, + &V151, &V151, &V39, &V39, &V39, &V39, &V39, &V39, + &V151, &V151, &V39, &V39, &V39, &V151, &V151, &V151, + }, // P[388] + { + &V403, &V403, &V400, &V38, &V404, &V403, &V403, &V151, + &V404, &V400, &V400, &V400, &V400, &V404, &V404, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V515, &V515, &V515, &V37, &V37, &V151, &V151, + }, // P[389] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[390] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V151, &V84, &V84, &V151, &V84, + }, // P[391] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151, + }, // P[392] + { + &V189, &V10, &V189, &V151, &V151, &V151, &V151, &V286, + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + }, // P[393] + { + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V151, &V151, &V151, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[394] + { + &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516, + &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516, + &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516, + &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516, + }, // P[395] + { + &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516, + &V516, &V516, &V516, &V516, &V516, &V516, &V516, &V516, + &V516, &V516, &V516, &V516, &V516, &V291, &V291, &V291, + &V291, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[396] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V291, &V291, &V37, &V184, &V184, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151, + }, // P[397] + { + &V37, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[398] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[399] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V138, &V151, &V151, + }, // P[400] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151, + }, // P[401] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[402] + { + &V138, &V517, &V517, &V517, &V517, &V517, &V517, &V517, + &V517, &V517, &V517, &V517, &V517, &V517, &V517, &V517, + &V517, &V517, &V517, &V517, &V517, &V517, &V517, &V517, + &V517, &V517, &V517, &V517, &V151, &V151, &V151, &V151, + }, // P[403] + { + &V286, &V286, &V286, &V286, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[404] + { + &V84, &V321, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V321, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[405] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V136, &V136, + &V136, &V136, &V136, &V151, &V151, &V151, &V151, &V151, + }, // P[406] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V189, + }, // P[407] + { + &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V189, &V321, &V321, &V321, &V321, &V321, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[408] + { + &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518, + &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518, + &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518, + &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518, + }, // P[409] + { + &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518, + &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519, + &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519, + &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519, + }, // P[410] + { + &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519, + &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[411] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151, + }, // P[412] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518, + &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518, + }, // P[413] + { + &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518, + &V518, &V518, &V518, &V518, &V518, &V518, &V518, &V518, + &V518, &V518, &V518, &V518, &V151, &V151, &V151, &V151, + &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519, + }, // P[414] + { + &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519, + &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519, + &V519, &V519, &V519, &V519, &V519, &V519, &V519, &V519, + &V519, &V519, &V519, &V519, &V151, &V151, &V151, &V151, + }, // P[415] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[416] + { + &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V189, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[417] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[418] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V151, + &V213, &V151, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + }, // P[419] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V213, + &V213, &V151, &V151, &V151, &V213, &V151, &V151, &V213, + }, // P[420] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V210, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + }, // P[421] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V521, + &V521, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + }, // P[422] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V151, + }, // P[423] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V520, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[424] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V151, &V213, &V213, &V151, &V151, + &V151, &V151, &V151, &V520, &V520, &V520, &V520, &V520, + }, // P[425] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V520, &V520, + &V520, &V520, &V520, &V520, &V151, &V151, &V151, &V10, + }, // P[426] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V151, &V151, &V151, &V151, &V151, &V210, + }, // P[427] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + }, // P[428] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V151, &V151, &V151, &V151, &V520, &V520, &V213, &V213, + }, // P[429] + { + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + &V151, &V151, &V520, &V520, &V520, &V520, &V520, &V520, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + }, // P[430] + { + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + }, // P[431] + { + &V213, &V147, &V147, &V147, &V151, &V147, &V147, &V151, + &V151, &V151, &V151, &V151, &V147, &V138, &V147, &V136, + &V213, &V213, &V213, &V213, &V151, &V213, &V213, &V213, + &V151, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + }, // P[432] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V151, &V151, &V151, &V151, + &V136, &V143, &V138, &V151, &V151, &V151, &V151, &V271, + }, // P[433] + { + &V522, &V523, &V524, &V525, &V520, &V520, &V520, &V520, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V210, &V210, &V210, &V210, &V210, &V210, &V526, &V526, + &V210, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[434] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V520, &V520, &V210, + }, // P[435] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V520, &V520, &V520, + }, // P[436] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V521, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + }, // P[437] + { + &V213, &V213, &V213, &V213, &V213, &V136, &V138, &V151, + &V151, &V151, &V151, &V520, &V520, &V520, &V520, &V520, + &V210, &V210, &V210, &V210, &V210, &V210, &V210, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[438] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V151, + &V151, &V10, &V10, &V10, &V10, &V10, &V10, &V10, + }, // P[439] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V151, &V151, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + }, // P[440] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V151, &V151, &V151, &V151, &V151, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + }, // P[441] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V213, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V210, &V210, &V210, &V210, &V151, &V151, &V151, + }, // P[442] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[443] + { + &V213, &V213, &V213, &V213, &V213, &V213, &V213, &V213, + &V213, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[444] + { + &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527, + &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527, + &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527, + &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527, + }, // P[445] + { + &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527, + &V527, &V527, &V527, &V527, &V527, &V527, &V527, &V527, + &V527, &V527, &V527, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[446] + { + &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528, + &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528, + &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528, + &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528, + }, // P[447] + { + &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528, + &V528, &V528, &V528, &V528, &V528, &V528, &V528, &V528, + &V528, &V528, &V528, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V520, &V520, &V520, &V520, &V520, &V520, + }, // P[448] + { + &V529, &V530, &V531, &V532, &V533, &V534, &V535, &V536, + &V537, &V538, &V538, &V538, &V538, &V538, &V538, &V538, + &V538, &V538, &V538, &V538, &V538, &V538, &V538, &V538, + &V538, &V538, &V538, &V538, &V538, &V538, &V538, &V151, + }, // P[449] + { + &V268, &V147, &V268, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[450] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + }, // P[451] + { + &V147, &V147, &V147, &V147, &V147, &V147, &V271, &V191, + &V191, &V189, &V189, &V189, &V189, &V189, &V151, &V151, + &V151, &V151, &V431, &V432, &V433, &V434, &V435, &V436, + &V437, &V438, &V439, &V291, &V291, &V291, &V291, &V291, + }, // P[452] + { + &V291, &V291, &V291, &V291, &V291, &V291, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V271, + }, // P[453] + { + &V147, &V147, &V268, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V269, &V84, &V269, &V84, &V84, &V84, + }, // P[454] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V269, &V84, &V84, &V84, &V84, + &V268, &V268, &V268, &V147, &V147, &V147, &V147, &V268, + &V268, &V271, &V270, &V189, &V189, &V539, &V189, &V189, + }, // P[455] + { + &V191, &V191, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[456] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[457] + { + &V136, &V136, &V136, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[458] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V287, + &V147, &V147, &V147, &V147, &V268, &V147, &V288, &V288, + &V147, &V147, &V147, &V271, &V271, &V151, &V273, &V274, + &V275, &V276, &V277, &V278, &V279, &V280, &V281, &V282, + }, // P[459] + { + &V189, &V191, &V191, &V191, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[460] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V283, &V189, &V189, &V84, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[461] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V268, &V268, &V268, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V268, + }, // P[462] + { + &V322, &V84, &V84, &V84, &V84, &V191, &V191, &V189, + &V189, &V189, &V283, &V147, &V147, &V189, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V84, &V189, &V84, &V189, &V189, &V189, + }, // P[463] + { + &V151, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V286, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[464] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V151, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[465] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V268, &V268, &V268, &V147, + &V147, &V147, &V268, &V268, &V147, &V322, &V283, &V147, + &V191, &V191, &V189, &V189, &V189, &V189, &V147, &V151, + }, // P[466] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V84, &V151, &V84, &V84, &V84, &V84, &V151, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V84, + }, // P[467] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V189, &V151, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[468] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V147, + }, // P[469] + { + &V268, &V268, &V268, &V147, &V147, &V147, &V147, &V147, + &V147, &V283, &V271, &V151, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[470] + { + &V147, &V147, &V268, &V268, &V151, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V84, + &V84, &V151, &V151, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[471] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V151, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V283, &V84, &V284, &V268, + }, // P[472] + { + &V147, &V268, &V268, &V268, &V268, &V151, &V151, &V268, + &V268, &V151, &V151, &V285, &V285, &V322, &V151, &V151, + &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V284, + &V151, &V151, &V151, &V151, &V151, &V84, &V84, &V84, + }, // P[473] + { + &V84, &V84, &V268, &V268, &V151, &V151, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V151, &V151, &V151, + &V136, &V136, &V136, &V136, &V136, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[474] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V268, &V268, &V268, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + }, // P[475] + { + &V268, &V268, &V271, &V147, &V147, &V268, &V283, &V84, + &V84, &V84, &V84, &V191, &V191, &V191, &V189, &V189, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V189, &V151, &V189, &V151, &V151, + }, // P[476] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V284, &V268, &V268, &V147, &V147, &V147, &V147, &V147, + &V147, &V268, &V287, &V285, &V285, &V284, &V285, &V147, + }, // P[477] + { + &V147, &V268, &V271, &V283, &V84, &V84, &V189, &V84, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[478] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V284, + &V268, &V268, &V147, &V147, &V147, &V147, &V151, &V151, + &V268, &V268, &V285, &V285, &V147, &V147, &V268, &V271, + }, // P[479] + { + &V283, &V189, &V191, &V191, &V189, &V189, &V189, &V189, + &V189, &V189, &V189, &V189, &V189, &V189, &V189, &V189, + &V189, &V189, &V189, &V189, &V189, &V189, &V189, &V189, + &V84, &V84, &V84, &V84, &V147, &V147, &V151, &V151, + }, // P[480] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V268, &V268, &V268, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V268, &V268, &V147, &V268, &V271, + }, // P[481] + { + &V147, &V191, &V191, &V189, &V84, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[482] + { + &V10, &V10, &V10, &V10, &V10, &V10, &V10, &V10, + &V10, &V10, &V10, &V10, &V10, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[483] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V147, &V268, &V147, &V268, &V268, + &V147, &V147, &V147, &V147, &V147, &V147, &V322, &V283, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[484] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[485] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V151, &V147, &V147, &V147, + }, // P[486] + { + &V268, &V268, &V147, &V147, &V147, &V147, &V268, &V147, + &V147, &V147, &V147, &V271, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V286, &V286, &V189, &V189, &V189, &V184, + }, // P[487] + { + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + &V30, &V30, &V30, &V30, &V30, &V30, &V30, &V30, + }, // P[488] + { + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + &V34, &V34, &V34, &V34, &V34, &V34, &V34, &V34, + }, // P[489] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V84, + }, // P[490] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[491] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[492] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V268, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V151, + &V147, &V147, &V147, &V147, &V147, &V147, &V268, &V540, + }, // P[493] + { + &V84, &V191, &V191, &V189, &V189, &V189, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V286, &V286, &V286, &V286, &V286, &V286, + }, // P[494] + { + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V286, &V151, &V151, &V151, + &V189, &V189, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[495] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V151, &V151, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + }, // P[496] + { + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V151, &V268, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V268, &V147, &V147, &V268, &V147, &V147, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[497] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[498] + { + &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321, + &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321, + &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321, + &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321, + }, // P[499] + { + &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V321, + &V321, &V321, &V321, &V321, &V321, &V321, &V321, &V151, + &V189, &V191, &V191, &V189, &V189, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[500] + { + &V84, &V84, &V84, &V84, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[501] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[502] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[503] + { + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V151, &V151, &V151, &V191, &V191, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[504] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + }, // P[505] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V151, &V151, + &V143, &V143, &V143, &V143, &V143, &V191, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[506] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V189, + &V189, &V189, &V189, &V189, &V184, &V184, &V184, &V184, + }, // P[507] + { + &V134, &V134, &V134, &V134, &V189, &V184, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V273, &V274, &V275, &V276, &V277, &V278, &V279, &V280, + &V281, &V282, &V151, &V286, &V286, &V286, &V286, &V286, + }, // P[508] + { + &V286, &V286, &V151, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V151, &V151, &V151, &V151, &V151, &V84, &V84, &V84, + }, // P[509] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[510] + { + &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V84, &V268, &V268, &V268, &V268, &V268, &V268, &V268, + &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268, + }, // P[511] + { + &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268, + &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268, + &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V268, + &V268, &V268, &V268, &V268, &V268, &V268, &V268, &V151, + }, // P[512] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V147, + &V147, &V147, &V147, &V132, &V132, &V132, &V132, &V132, + &V132, &V132, &V132, &V132, &V132, &V132, &V132, &V132, + }, // P[513] + { + &V134, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[514] + { + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[515] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[516] + { + &V464, &V459, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[517] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V84, &V84, &V84, &V151, &V151, &V151, + }, // P[518] + { + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V84, &V84, &V84, &V84, &V84, &V84, &V84, &V84, + &V84, &V84, &V151, &V151, &V184, &V147, &V143, &V191, + }, // P[519] + { + &V41, &V41, &V41, &V41, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[520] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[521] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V151, + &V151, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[522] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V541, &V541, + }, // P[523] + { + &V541, &V541, &V541, &V541, &V541, &V542, &V542, &V143, + &V143, &V143, &V184, &V184, &V184, &V543, &V542, &V542, + &V542, &V542, &V542, &V41, &V41, &V41, &V41, &V41, + &V41, &V41, &V41, &V138, &V138, &V138, &V138, &V138, + }, // P[524] + { + &V138, &V138, &V138, &V184, &V184, &V136, &V136, &V136, + &V136, &V136, &V138, &V138, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[525] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V136, &V136, &V136, &V136, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V541, &V541, &V541, &V541, &V541, + }, // P[526] + { + &V541, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[527] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[528] + { + &V37, &V37, &V136, &V136, &V136, &V37, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[529] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[530] + { + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V286, &V286, &V286, &V286, &V286, &V286, + &V286, &V286, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[531] + { + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[532] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + }, // P[533] + { + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V151, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[534] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + }, // P[535] + { + &V168, &V168, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V168, &V151, &V168, &V168, + }, // P[536] + { + &V151, &V151, &V168, &V151, &V151, &V168, &V168, &V151, + &V151, &V168, &V168, &V168, &V168, &V151, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63, + &V63, &V63, &V151, &V63, &V151, &V63, &V63, &V63, + }, // P[537] + { + &V63, &V63, &V63, &V63, &V151, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + }, // P[538] + { + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[539] + { + &V63, &V63, &V63, &V63, &V168, &V168, &V151, &V168, + &V168, &V168, &V168, &V151, &V151, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V151, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V151, &V63, &V63, + }, // P[540] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V168, &V168, &V151, &V168, &V168, &V168, &V168, &V151, + }, // P[541] + { + &V168, &V168, &V168, &V168, &V168, &V151, &V168, &V151, + &V151, &V151, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V151, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[542] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + }, // P[543] + { + &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[544] + { + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[545] + { + &V168, &V168, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V168, &V168, &V168, &V168, + }, // P[546] + { + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[547] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + }, // P[548] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V151, &V151, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + }, // P[549] + { + &V168, &V544, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V400, &V63, &V63, &V63, &V63, + }, // P[550] + { + &V63, &V63, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V544, &V63, &V63, &V63, &V63, + }, // P[551] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V400, &V63, &V63, + &V63, &V63, &V63, &V63, &V168, &V168, &V168, &V168, + }, // P[552] + { + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V544, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[553] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V400, + &V63, &V63, &V63, &V63, &V63, &V63, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + }, // P[554] + { + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V544, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[555] + { + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V400, &V63, &V63, &V63, &V63, &V63, &V63, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + }, // P[556] + { + &V168, &V168, &V168, &V168, &V168, &V168, &V168, &V168, + &V168, &V544, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + &V63, &V63, &V63, &V63, &V63, &V63, &V63, &V63, + }, // P[557] + { + &V63, &V63, &V63, &V400, &V63, &V63, &V63, &V63, + &V63, &V63, &V168, &V63, &V151, &V151, &V502, &V503, + &V504, &V505, &V506, &V507, &V508, &V509, &V510, &V511, + &V502, &V503, &V504, &V505, &V506, &V507, &V508, &V509, + }, // P[558] + { + &V510, &V511, &V502, &V503, &V504, &V505, &V506, &V507, + &V508, &V509, &V510, &V511, &V502, &V503, &V504, &V505, + &V506, &V507, &V508, &V509, &V510, &V511, &V502, &V503, + &V504, &V505, &V506, &V507, &V508, &V509, &V510, &V511, + }, // P[559] + { + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + }, // P[560] + { + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V184, + &V184, &V184, &V184, &V147, &V147, &V147, &V147, &V147, + }, // P[561] + { + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V147, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[562] + { + &V184, &V184, &V184, &V184, &V147, &V184, &V184, &V191, + &V191, &V191, &V191, &V189, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V147, &V147, &V147, &V147, &V147, + }, // P[563] + { + &V151, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[564] + { + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V151, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V136, &V136, &V136, &V136, &V136, &V136, &V136, + &V136, &V151, &V151, &V136, &V136, &V136, &V136, &V136, + }, // P[565] + { + &V136, &V136, &V151, &V136, &V136, &V151, &V136, &V136, + &V136, &V136, &V136, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[566] + { + &V213, &V213, &V213, &V213, &V213, &V151, &V151, &V520, + &V520, &V520, &V520, &V520, &V520, &V520, &V520, &V520, + &V138, &V138, &V138, &V138, &V138, &V138, &V138, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[567] + { + &V545, &V545, &V545, &V545, &V545, &V545, &V545, &V545, + &V545, &V545, &V545, &V545, &V545, &V545, &V545, &V545, + &V545, &V545, &V545, &V545, &V545, &V545, &V545, &V545, + &V545, &V545, &V545, &V545, &V545, &V545, &V545, &V545, + }, // P[568] + { + &V545, &V545, &V546, &V546, &V546, &V546, &V546, &V546, + &V546, &V546, &V546, &V546, &V546, &V546, &V546, &V546, + &V546, &V546, &V546, &V546, &V546, &V546, &V546, &V546, + &V546, &V546, &V546, &V546, &V546, &V546, &V546, &V546, + }, // P[569] + { + &V546, &V546, &V546, &V546, &V136, &V136, &V136, &V136, + &V136, &V136, &V283, &V151, &V151, &V151, &V151, &V151, + &V256, &V257, &V258, &V259, &V260, &V261, &V262, &V263, + &V264, &V265, &V151, &V151, &V151, &V151, &V526, &V526, + }, // P[570] + { + &V242, &V242, &V242, &V242, &V151, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + }, // P[571] + { + &V151, &V242, &V242, &V151, &V242, &V151, &V151, &V242, + &V151, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V151, &V242, &V242, &V242, &V242, + &V151, &V242, &V151, &V242, &V151, &V151, &V151, &V151, + }, // P[572] + { + &V151, &V151, &V242, &V151, &V151, &V151, &V151, &V242, + &V151, &V242, &V151, &V242, &V151, &V242, &V242, &V242, + &V151, &V242, &V242, &V151, &V242, &V151, &V151, &V242, + &V151, &V242, &V151, &V242, &V151, &V242, &V151, &V242, + }, // P[573] + { + &V151, &V242, &V242, &V151, &V242, &V151, &V151, &V242, + &V242, &V242, &V242, &V151, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V151, &V242, &V242, &V242, &V242, + &V151, &V242, &V242, &V242, &V242, &V151, &V242, &V151, + }, // P[574] + { + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V151, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V151, &V151, &V151, &V151, + }, // P[575] + { + &V151, &V242, &V242, &V242, &V151, &V242, &V242, &V242, + &V242, &V242, &V151, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V242, &V242, &V242, &V242, + &V242, &V242, &V242, &V242, &V151, &V151, &V151, &V151, + }, // P[576] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V28, &V28, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[577] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[578] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[579] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151, + &V151, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[580] + { + &V151, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V151, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[581] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[582] + { + &V391, &V391, &V48, &V44, &V45, &V392, &V393, &V394, + &V395, &V396, &V397, &V291, &V291, &V151, &V151, &V151, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + }, // P[583] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V151, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + }, // P[584] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[585] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V404, &V404, &V151, &V151, &V151, &V151, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[586] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V427, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[587] + { + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[588] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + &V184, &V184, &V184, &V184, &V184, &V184, &V184, &V184, + }, // P[589] + { + &V427, &V427, &V427, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + }, // P[590] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V427, &V427, &V427, &V151, &V151, &V151, &V151, + }, // P[591] + { + &V427, &V427, &V427, &V427, &V427, &V427, &V427, &V427, + &V427, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V427, &V427, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[592] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V31, &V31, &V31, &V31, &V31, + }, // P[593] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[594] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V151, &V151, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[595] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[596] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[597] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + }, // P[598] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[599] + { + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151, + }, // P[600] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V37, &V151, &V151, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151, + }, // P[601] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V151, &V151, &V151, &V151, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V151, + }, // P[602] + { + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V37, &V37, &V37, &V37, &V37, &V37, + &V37, &V37, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[603] + { + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[604] + { + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[605] + { + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V454, &V454, + &V454, &V454, &V454, &V454, &V454, &V454, &V151, &V151, + }, // P[606] + { + &V454, &V454, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[607] + { + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V486, &V486, + &V486, &V486, &V486, &V486, &V486, &V486, &V151, &V151, + }, // P[608] + { + &V151, &V41, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[609] + { + &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41, + &V386, &V386, &V41, &V41, &V41, &V41, &V41, &V41, + &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41, + &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41, + }, // P[610] + { + &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41, + &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41, + &V41, &V41, &V41, &V41, &V41, &V41, &V41, &V41, + &V41, &V41, &V41, &V386, &V41, &V386, &V41, &V41, + }, // P[611] + { + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V147, &V147, &V147, &V147, &V147, &V147, &V147, &V147, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + &V151, &V151, &V151, &V151, &V151, &V151, &V151, &V151, + }, // P[612] + { + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + &V485, &V485, &V485, &V485, &V485, &V485, &V151, &V151, + }, // P[613] + { + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + &V485, &V485, &V485, &V485, &V485, &V485, &V485, &V485, + &V485, &V485, &V485, &V485, &V485, &V485, + }, // P[614] + }; // static const NUnicode::NPrivate::TUnidataTable::TValuePtr P[][32] + + static const NUnicode::NPrivate::TUnidataTable::TValuePtr* const Indexes[] = { + P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7], P[8], P[9], P[10], P[11], P[12], P[13], P[14], P[15], + P[16], P[17], P[18], P[19], P[20], P[21], P[22], P[23], P[24], P[25], P[26], P[27], P[28], P[29], P[30], P[31], + P[32], P[33], P[34], P[35], P[36], P[37], P[38], P[39], P[37], P[40], P[41], P[42], P[43], P[44], P[45], P[46], + P[47], P[48], P[49], P[50], P[51], P[51], P[52], P[53], P[54], P[55], P[56], P[51], P[51], P[57], P[58], P[59], + P[60], P[61], P[62], P[63], P[63], P[64], P[65], P[66], P[67], P[68], P[69], P[70], P[71], P[72], P[73], P[74], + P[75], P[76], P[77], P[78], P[79], P[80], P[81], P[82], P[83], P[84], P[85], P[86], P[87], P[88], P[89], P[90], + P[91], P[92], P[93], P[94], P[95], P[96], P[97], P[98], P[99], P[100], P[101], P[102], P[103], P[104], P[105], P[106], + P[107], P[108], P[109], P[63], P[110], P[111], P[112], P[63], P[113], P[114], P[115], P[116], P[117], P[118], P[119], P[63], + P[120], P[121], P[122], P[123], P[124], P[125], P[126], P[127], P[128], P[128], P[128], P[129], P[130], P[131], P[132], P[133], + P[120], P[120], P[134], P[120], P[135], P[136], P[137], P[120], P[138], P[120], P[139], P[140], P[141], P[142], P[142], P[143], + P[144], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[120], P[120], P[120], P[145], P[146], P[120], P[120], P[147], P[148], P[149], P[150], P[151], P[120], P[152], P[153], P[154], + P[155], P[120], P[156], P[157], P[158], P[159], P[120], P[160], P[161], P[162], P[163], P[164], P[120], P[165], P[166], P[167], + P[168], P[120], P[169], P[170], P[171], P[172], P[63], P[63], P[173], P[174], P[175], P[176], P[177], P[178], P[120], P[179], + P[120], P[180], P[181], P[182], P[183], P[63], P[184], P[185], P[186], P[187], P[188], P[189], P[190], P[191], P[192], P[193], + P[194], P[194], P[194], P[194], P[195], P[194], P[194], P[196], P[197], P[198], P[199], P[200], P[201], P[202], P[203], P[204], + P[205], P[206], P[207], P[208], P[209], P[210], P[211], P[212], P[213], P[214], P[215], P[216], P[217], P[218], P[219], P[220], + P[221], P[222], P[223], P[224], P[225], P[226], P[227], P[228], P[229], P[230], P[231], P[232], P[233], P[234], P[235], P[236], + P[167], P[237], P[238], P[239], P[240], P[241], P[242], P[243], P[167], P[167], P[167], P[167], P[167], P[244], P[245], P[246], + P[167], P[167], P[167], P[247], P[167], P[248], P[167], P[167], P[167], P[167], P[167], P[249], P[250], P[167], P[251], P[252], + P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[227], P[227], P[227], P[227], P[253], P[227], P[254], P[255], + P[256], P[227], P[227], P[257], P[227], P[227], P[258], P[227], P[167], P[259], P[260], P[261], P[262], P[263], P[264], P[265], + P[266], P[267], P[268], P[269], P[37], P[37], P[37], P[270], P[271], P[272], P[120], P[273], P[274], P[275], P[275], P[276], + P[277], P[278], P[279], P[63], P[280], P[167], P[167], P[281], P[282], P[282], P[282], P[282], P[282], P[282], P[283], P[284], + P[285], P[286], P[287], P[288], P[289], P[290], P[291], P[292], P[293], P[294], P[295], P[295], P[296], P[297], P[167], P[298], + P[299], P[300], P[301], P[302], P[300], P[303], P[304], P[305], P[306], P[306], P[306], P[307], P[306], P[306], P[308], P[309], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[311], P[167], P[167], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[311], P[63], + P[312], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[120], P[120], P[120], P[120], P[313], P[167], P[314], P[315], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[316], P[317], P[37], P[318], P[319], P[120], P[120], P[320], P[321], P[322], P[37], P[323], P[324], P[325], P[63], P[326], + P[327], P[328], P[120], P[329], P[330], P[331], P[332], P[333], P[334], P[335], P[336], P[337], P[67], P[338], P[339], P[340], + P[120], P[341], P[342], P[343], P[120], P[344], P[345], P[346], P[347], P[348], P[349], P[350], P[351], P[351], P[120], P[352], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], + P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[353], P[354], P[355], P[356], + P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], + P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[357], P[358], P[358], P[358], P[358], + P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], + P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], P[359], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], + P[362], P[363], P[361], P[364], P[361], P[361], P[365], P[63], P[366], P[367], P[368], P[369], P[369], P[370], P[371], P[369], + P[369], P[369], P[369], P[369], P[369], P[369], P[369], P[369], P[369], P[372], P[373], P[369], P[374], P[369], P[375], P[376], + P[377], P[378], P[379], P[380], P[369], P[369], P[369], P[381], P[382], P[383], P[384], P[385], P[386], P[387], P[388], P[389], + P[390], P[391], P[392], P[63], P[120], P[120], P[120], P[297], P[393], P[394], P[395], P[396], P[397], P[398], P[399], P[400], + P[63], P[63], P[63], P[63], P[401], P[120], P[402], P[403], P[120], P[404], P[405], P[406], P[407], P[120], P[408], P[63], + P[409], P[410], P[411], P[120], P[412], P[413], P[414], P[415], P[120], P[416], P[120], P[417], P[63], P[63], P[63], P[63], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[274], P[160], P[418], P[63], P[63], P[63], P[63], + P[419], P[420], P[421], P[422], P[423], P[424], P[63], P[425], P[426], P[427], P[63], P[63], P[428], P[429], P[430], P[431], + P[432], P[433], P[434], P[435], P[436], P[63], P[437], P[438], P[428], P[439], P[440], P[441], P[442], P[443], P[63], P[63], + P[428], P[428], P[444], P[63], P[445], P[446], P[447], P[448], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[449], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[450], P[451], P[452], P[453], P[454], P[455], P[456], P[457], P[458], P[459], P[460], P[461], P[177], P[462], P[463], P[464], + P[465], P[466], P[63], P[63], P[467], P[468], P[469], P[470], P[471], P[472], P[473], P[474], P[63], P[63], P[63], P[63], + P[120], P[475], P[476], P[63], P[120], P[477], P[478], P[63], P[63], P[63], P[63], P[63], P[120], P[479], P[480], P[63], + P[120], P[481], P[482], P[483], P[120], P[484], P[485], P[63], P[486], P[487], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[488], P[489], P[490], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[120], P[491], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[492], P[493], P[494], P[495], P[496], P[497], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[498], P[63], P[63], P[63], + P[499], P[499], P[499], P[500], P[120], P[120], P[120], P[120], P[120], P[120], P[501], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[120], P[502], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[120], P[120], P[503], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[120], P[491], P[161], P[504], P[63], P[63], P[505], P[506], P[120], P[507], P[508], P[509], P[510], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[120], P[120], P[511], P[512], P[513], P[63], P[63], P[514], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[515], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[120], + P[120], P[120], P[120], P[120], P[120], P[120], P[120], P[516], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[517], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[120], P[120], P[120], P[518], P[519], P[520], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[521], P[231], P[522], P[523], P[524], P[525], P[526], P[527], P[528], + P[167], P[167], P[529], P[63], P[63], P[63], P[63], P[63], P[167], P[167], P[530], P[531], P[63], P[63], P[63], P[63], + P[532], P[533], P[534], P[535], P[536], P[537], P[538], P[539], P[540], P[541], P[542], P[543], P[544], P[532], P[533], P[545], + P[535], P[546], P[547], P[548], P[539], P[549], P[550], P[551], P[552], P[553], P[554], P[555], P[556], P[557], P[558], P[559], + P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], P[231], + P[560], P[561], P[560], P[562], P[563], P[564], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[565], P[566], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[428], P[428], P[428], P[428], P[428], P[428], P[567], P[63], P[568], P[569], P[570], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[571], P[572], P[573], P[574], P[575], P[576], P[63], P[577], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[167], P[578], P[167], P[167], P[579], P[580], P[581], P[582], P[583], P[584], P[585], P[586], P[587], P[588], P[63], P[589], + P[590], P[591], P[592], P[63], P[63], P[63], P[63], P[63], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[593], + P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], P[167], + P[167], P[167], P[167], P[167], P[167], P[167], P[594], P[595], P[167], P[167], P[167], P[579], P[167], P[167], P[596], P[63], + P[578], P[167], P[597], P[167], P[598], P[599], P[63], P[63], P[600], P[601], P[602], P[63], P[603], P[63], P[398], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[604], P[63], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[605], P[310], P[310], P[310], P[310], P[310], P[310], + P[606], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], P[310], + P[310], P[310], P[310], P[310], P[310], P[607], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], P[361], + P[608], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[609], P[610], P[611], P[611], P[63], P[63], P[63], P[63], P[560], P[560], P[560], P[560], P[560], P[560], P[560], P[612], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], P[63], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[613], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], + P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[360], P[614], + }; // static const NUnicode::NPrivate::TUnidataTable::TValuePtr* const Indexes[] + + static const size_t Size = 1114110; +}} // namespace NUnidataTableGenerated + +namespace NUnicode { + namespace NPrivate { + const NUnicode::NPrivate::TUnidataTable& UnidataTable() { + static const NUnicode::NPrivate::TUnidataTable data(NUnidataTableGenerated::Indexes, NUnidataTableGenerated::Size); + return data; + } + } // namespace NPrivate +} // namespace NUnicode +namespace NUnicode { + namespace NPrivate { + const size_t DEFAULT_KEY = 0xE001; + static_assert(NUnidataTableGenerated::Size > DEFAULT_KEY, "table size should be greater then default key"); + } +} diff --git a/util/charset/recode_result.cpp b/util/charset/recode_result.cpp new file mode 100644 index 0000000000..23638027bb --- /dev/null +++ b/util/charset/recode_result.cpp @@ -0,0 +1 @@ +#include "recode_result.h" diff --git a/util/charset/recode_result.h b/util/charset/recode_result.h new file mode 100644 index 0000000000..2c7366e7b2 --- /dev/null +++ b/util/charset/recode_result.h @@ -0,0 +1,9 @@ +#pragma once + +enum RECODE_RESULT { + RECODE_OK, + RECODE_EOINPUT, + RECODE_EOOUTPUT, + RECODE_BROKENSYMBOL, + RECODE_ERROR, +}; diff --git a/util/charset/unicode_table.cpp b/util/charset/unicode_table.cpp new file mode 100644 index 0000000000..574c50d9ec --- /dev/null +++ b/util/charset/unicode_table.cpp @@ -0,0 +1 @@ +#include "unicode_table.h" diff --git a/util/charset/unicode_table.h b/util/charset/unicode_table.h new file mode 100644 index 0000000000..9e171b2583 --- /dev/null +++ b/util/charset/unicode_table.h @@ -0,0 +1,123 @@ +#pragma once + +#include <util/system/yassert.h> +#include <util/system/defaults.h> +#include <util/generic/typetraits.h> + +namespace NUnicodeTable { + template <class Value> + struct TValueSelector; + + template <class Value> + struct TValueSelector { + using TStored = const Value; + using TValueRef = const Value&; + using TValuePtr = const Value*; + + static inline TValueRef Get(TValuePtr val) { + return *val; + } + }; + + template <class Value> + struct TValueSelector<const Value*> { + using TStored = const Value[]; + using TValueRef = const Value*; + using TValuePtr = const Value*; + + static inline TValueRef Get(TValuePtr val) { + return val; + } + }; + + template <class Value> + struct TValues { + using TSelector = TValueSelector<Value>; + + using TStored = typename TSelector::TStored; + using TValueRef = typename TSelector::TValueRef; + using TValuePtr = typename TSelector::TValuePtr; + + using TData = const TValuePtr*; + + static inline TValuePtr Get(TData table, size_t index) { + static_assert(std::is_pointer<TData>::value, "expect std::is_pointer<TData>::value"); + return table[index]; + } + + static inline TValueRef Get(TValuePtr val) { + return TSelector::Get(val); + } + }; + + template <int Shift, class TChild> + struct TSubtable { + using TStored = typename TChild::TStored; + using TValueRef = typename TChild::TValueRef; + using TValuePtr = typename TChild::TValuePtr; + using TData = const typename TChild::TData*; + + static inline TValuePtr Get(TData table, size_t key) { + static_assert(std::is_pointer<TData>::value, "expect std::is_pointer<TData>::value"); + return TChild::Get(table[key >> Shift], key & ((1 << Shift) - 1)); + } + + static inline TValueRef Get(TValuePtr val) { + return TChild::Get(val); + } + }; + + template <class T> + class TTable { + private: + using TImpl = T; + using TData = typename TImpl::TData; + + const TData Data; + const size_t MSize; + + public: + using TStored = typename TImpl::TStored; + using TValueRef = typename TImpl::TValueRef; + using TValuePtr = typename TImpl::TValuePtr; + + private: + inline TValueRef GetImpl(size_t key) const { + TValuePtr val = TImpl::Get(Data, key); + + return TImpl::Get(val); + } + + inline TValueRef Get(size_t key) const { + return GetImpl(key); + } + + public: + TTable(TData data, size_t size) + : Data(data) + , MSize(size) + { + static_assert(std::is_pointer<TData>::value, "expect std::is_pointer<TData>::value"); + } + + inline TValueRef Get(size_t key, TValueRef value) const { + if (key >= Size()) + return value; + + return GetImpl(key); + } + + inline TValueRef Get(size_t key, size_t defaultKey) const { + if (key >= Size()) + return Get(defaultKey); + + return GetImpl(key); + } + + inline size_t Size() const { + return MSize; + } + }; + + const size_t UNICODE_TABLE_SHIFT = 5; +} diff --git a/util/charset/unidata.cpp b/util/charset/unidata.cpp new file mode 100644 index 0000000000..db4dc126ab --- /dev/null +++ b/util/charset/unidata.cpp @@ -0,0 +1 @@ +#include "unidata.h" diff --git a/util/charset/unidata.h b/util/charset/unidata.h new file mode 100644 index 0000000000..400d314186 --- /dev/null +++ b/util/charset/unidata.h @@ -0,0 +1,421 @@ +#pragma once + +#include "unicode_table.h" + +#include <util/system/defaults.h> // wchar32, ui64, ULL() + +enum WC_TYPE { // TODO move no NUnicode + Lu_UPPER = 1, // 'Ъ' + Ll_LOWER = 2, // 'ъ' + Lt_TITLE = 3, // 'Ъ' + Lm_EXTENDER = 4, // '-' + Lm_LETTER = 5, // 'ъ' + Lo_OTHER = 6, // '?' + Lo_IDEOGRAPH = 7, // '?' + Lo_KATAKANA = 8, // '?' + Lo_HIRAGANA = 9, // '?' + Lo_LEADING = 10, // '?' + Lo_VOWEL = 11, // '?' + Lo_TRAILING = 12, // '?' + + Mn_NONSPACING = 13, // '`' + Me_ENCLOSING = 14, // '`' + Mc_SPACING = 15, // '`' + + Nd_DIGIT = 16, // '9' // convert to digit + Nl_LETTER = 17, // 'X' // X,V,C,L,I ... + Nl_IDEOGRAPH = 18, // '?' + No_OTHER = 19, // '9' + + Zs_SPACE = 20, // ' ' [\40\240] SPACE ... NO-BREAK SPACE (00A0) + Zs_ZWSPACE = 21, // ' ' // nothing ? + Zl_LINE = 22, // '\n' + Zp_PARAGRAPH = 23, // '\n' + + Cc_ASCII = 24, // '\x1A' // can not happen + Cc_SPACE = 25, // '\x1A' // can not happen + Cc_SEPARATOR = 26, // '\x1A' // can not happen + + Cf_FORMAT = 27, // '\x1A' // nothing ? + Cf_JOIN = 28, // '\x1A' // nothing ? + Cf_BIDI = 29, // '\x1A' // nothing ? + Cf_ZWNBSP = 30, // '\x1A' // nothing ? + + Cn_UNASSIGNED = 0, // '?' + Co_PRIVATE = 0, // '?' + Cs_LOW = 31, // '?' + Cs_HIGH = 32, // '?' + + Pd_DASH = 33, // '-' + Pd_HYPHEN = 34, // '-' [-] HYPHEN-MINUS + Ps_START = 35, // '(' [([{] LEFT PARENTHESIS ... LEFT CURLY BRACKET + Ps_QUOTE = 36, // '"' + Pe_END = 37, // ')' [)]}] RIGHT PARENTHESIS ... RIGHT CURLY BRACKET + Pe_QUOTE = 38, // '"' + Pi_QUOTE = 39, // '"' + Pf_QUOTE = 40, // '"' + Pc_CONNECTOR = 41, // '_' [_] LOW LINE + Po_OTHER = 42, // '*' [#%&*/@\] NUMBER SIGN ... REVERSE SOLIDUS + Po_QUOTE = 43, // '"' ["] QUOTATION MARK + Po_TERMINAL = 44, // '.' [!,.:;?] EXCLAMATION MARK ... QUESTION MARK + Po_EXTENDER = 45, // '-' [№] MIDDLE DOT (00B7) + Po_HYPHEN = 46, // '-' + + Sm_MATH = 47, // '=' [+<=>|~] PLUS SIGN ... TILDE + Sm_MINUS = 48, // '-' + Sc_CURRENCY = 49, // '$' [$] DOLLAR SIGN + Sk_MODIFIER = 50, // '`' [^`] CIRCUMFLEX ACCENT ... GRAVE ACCENT + So_OTHER = 51, // '°' [°] DEGREE SIGN (00B0) + + Ps_SINGLE_QUOTE = 52, // '\'' ['] OPENING SINGLE QUOTE + Pe_SINGLE_QUOTE = 53, // '\'' ['] CLOSING SINGLE QUOTE + Pi_SINGLE_QUOTE = 54, // '\'' ['] INITIAL SINGLE QUOTE + Pf_SINGLE_QUOTE = 55, // '\'' ['] FINAL SINGLE QUOTE + Po_SINGLE_QUOTE = 56, // '\'' ['] APOSTROPHE and PRIME + + CCL_NUM = 57, + CCL_MASK = 0x3F, + + IS_ASCII_XDIGIT = 1 << 6, + IS_DIGIT = 1 << 7, + IS_NONBREAK = 1 << 8, + + IS_PRIVATE = 1 << 9, + + IS_COMPAT = 1 << 10, + IS_CANON = 1 << 11, + + NFD_QC = 1 << 12, + NFC_QC = 1 << 13, + NFKD_QC = 1 << 14, + NFKC_QC = 1 << 15, + + BIDI_OFFSET = 16, + SVAL_OFFSET = 22, +}; + +const size_t DEFCHAR_BUF = 58; // CCL_NUM + 1 + +#define SHIFT(i) (ULL(1) << (i)) + +namespace NUnicode { + using TCombining = ui8; + + namespace NPrivate { + struct TProperty { + ui32 Info; + i32 Lower; + i32 Upper; + i32 Title; + TCombining Combining; + }; + + extern const size_t DEFAULT_KEY; + + using TUnidataTable = NUnicodeTable::TTable<NUnicodeTable::TSubtable<NUnicodeTable::UNICODE_TABLE_SHIFT, NUnicodeTable::TValues<TProperty>>>; + const TUnidataTable& UnidataTable(); + + inline const TProperty& CharProperty(wchar32 ch) { + return UnidataTable().Get(ch, DEFAULT_KEY); + } + + inline ui32 CharInfo(wchar32 ch) { + return CharProperty(ch).Info; + } + + inline bool IsBidi(wchar32 ch, ui32 type) { + return ((NUnicode::NPrivate::CharInfo(ch) >> BIDI_OFFSET) & 15) == type; + } + } + + inline size_t UnicodeInstancesLimit() { + return NPrivate::UnidataTable().Size(); + } + + inline TCombining DecompositionCombining(wchar32 ch) { + return NPrivate::CharProperty(ch).Combining; + } + + inline WC_TYPE CharType(wchar32 ch) { + return (WC_TYPE)(NUnicode::NPrivate::CharInfo(ch) & CCL_MASK); + } + inline bool CharHasType(wchar32 ch, ui64 type_bits) { + return (SHIFT(NUnicode::CharType(ch)) & type_bits) != 0; + } +} + +// all usefull properties + +inline bool IsComposed(wchar32 ch) { + return NUnicode::NPrivate::CharInfo(ch) & (IS_COMPAT | IS_CANON); +} +inline bool IsCanonComposed(wchar32 ch) { + return NUnicode::NPrivate::CharInfo(ch) & IS_CANON; +} +inline bool IsCompatComposed(wchar32 ch) { + return NUnicode::NPrivate::CharInfo(ch) & IS_COMPAT; +} + +inline bool IsWhitespace(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cc_SPACE) | SHIFT(Zs_SPACE) | SHIFT(Zs_ZWSPACE) | SHIFT(Zl_LINE) | SHIFT(Zp_PARAGRAPH)); +} +inline bool IsAsciiCntrl(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cc_ASCII) | SHIFT(Cc_SPACE) | SHIFT(Cc_SEPARATOR)); +} +inline bool IsBidiCntrl(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cf_BIDI)); +} +inline bool IsJoinCntrl(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cf_JOIN)); +} +inline bool IsFormatCntrl(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cf_FORMAT)); +} +inline bool IsIgnorableCntrl(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cf_FORMAT) | SHIFT(Cf_JOIN) | SHIFT(Cf_BIDI) | SHIFT(Cf_ZWNBSP)); +} +inline bool IsCntrl(wchar32 ch) { + return NUnicode::CharHasType(ch, + SHIFT(Cf_FORMAT) | SHIFT(Cf_JOIN) | SHIFT(Cf_BIDI) | SHIFT(Cf_ZWNBSP) | + SHIFT(Cc_ASCII) | SHIFT(Cc_SPACE) | SHIFT(Cc_SEPARATOR)); +} +inline bool IsZerowidth(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cf_FORMAT) | SHIFT(Cf_JOIN) | SHIFT(Cf_BIDI) | SHIFT(Cf_ZWNBSP) | SHIFT(Zs_ZWSPACE)); +} +inline bool IsLineSep(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Zl_LINE)); +} +inline bool IsParaSep(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Zp_PARAGRAPH)); +} +inline bool IsDash(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Pd_DASH) | SHIFT(Pd_HYPHEN) | SHIFT(Sm_MINUS)); +} +inline bool IsHyphen(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Pd_HYPHEN) | SHIFT(Po_HYPHEN)); +} +inline bool IsQuotation(wchar32 ch) { + return NUnicode::CharHasType(ch, + SHIFT(Po_QUOTE) | SHIFT(Ps_QUOTE) | SHIFT(Pe_QUOTE) | SHIFT(Pi_QUOTE) | + SHIFT(Pf_QUOTE) | SHIFT(Po_SINGLE_QUOTE) | SHIFT(Ps_SINGLE_QUOTE) | + SHIFT(Pe_SINGLE_QUOTE) | SHIFT(Pi_SINGLE_QUOTE) | SHIFT(Pf_SINGLE_QUOTE)); +} + +inline bool IsSingleQuotation(wchar32 ch) { + return NUnicode::CharHasType(ch, + SHIFT(Po_SINGLE_QUOTE) | SHIFT(Ps_SINGLE_QUOTE) | SHIFT(Pe_SINGLE_QUOTE) | + SHIFT(Pi_SINGLE_QUOTE) | SHIFT(Pf_SINGLE_QUOTE)); +} + +inline bool IsTerminal(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Po_TERMINAL)); +} +inline bool IsPairedPunct(wchar32 ch) { + return NUnicode::CharHasType(ch, + SHIFT(Ps_START) | SHIFT(Pe_END) | SHIFT(Ps_QUOTE) | SHIFT(Pe_QUOTE) | + SHIFT(Pi_QUOTE) | SHIFT(Pf_QUOTE) | SHIFT(Ps_SINGLE_QUOTE) | + SHIFT(Pe_SINGLE_QUOTE) | SHIFT(Pi_SINGLE_QUOTE) | SHIFT(Pf_SINGLE_QUOTE)); +} +inline bool IsLeftPunct(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Ps_START) | SHIFT(Ps_QUOTE) | SHIFT(Ps_SINGLE_QUOTE)); +} +inline bool IsRightPunct(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Pe_END) | SHIFT(Pe_QUOTE) | SHIFT(Pe_SINGLE_QUOTE)); +} +inline bool IsCombining(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Mc_SPACING) | SHIFT(Mn_NONSPACING) | SHIFT(Me_ENCLOSING)); +} +inline bool IsNonspacing(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Mn_NONSPACING) | SHIFT(Me_ENCLOSING)); +} +inline bool IsAlphabetic(wchar32 ch) { + return NUnicode::CharHasType(ch, + SHIFT(Lu_UPPER) | SHIFT(Ll_LOWER) | SHIFT(Lt_TITLE) | SHIFT(Lm_EXTENDER) | SHIFT(Lm_LETTER) | SHIFT(Lo_OTHER) | SHIFT(Nl_LETTER)); +} +inline bool IsIdeographic(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Lo_IDEOGRAPH) | SHIFT(Nl_IDEOGRAPH)); +} +inline bool IsKatakana(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Lo_KATAKANA)); +} +inline bool IsHiragana(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Lo_HIRAGANA)); +} +inline bool IsHangulLeading(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Lo_LEADING)); +} +inline bool IsHangulVowel(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Lo_VOWEL)); +} +inline bool IsHangulTrailing(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Lo_TRAILING)); +} +inline bool IsHexdigit(wchar32 ch) { + return NUnicode::NPrivate::CharInfo(ch) & IS_ASCII_XDIGIT; +} +inline bool IsDecdigit(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Nd_DIGIT)); +} +inline bool IsNumeric(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Nd_DIGIT) | SHIFT(Nl_LETTER) | SHIFT(Nl_IDEOGRAPH) | SHIFT(No_OTHER)); +} +inline bool IsCurrency(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Sc_CURRENCY)); +} +inline bool IsMath(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Sm_MATH)); +} +inline bool IsSymbol(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Sm_MATH) | SHIFT(Sm_MINUS) | SHIFT(Sc_CURRENCY) | SHIFT(Sk_MODIFIER) | SHIFT(So_OTHER)); +} +inline bool IsLowSurrogate(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cs_LOW)); +} +inline bool IsHighSurrogate(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cs_HIGH)); +} +inline bool IsNonbreak(wchar32 ch) { + return NUnicode::NPrivate::CharInfo(ch) & IS_NONBREAK; +} +inline bool IsPrivate(wchar32 ch) { + return (NUnicode::NPrivate::CharInfo(ch) & IS_PRIVATE) && !NUnicode::CharHasType(ch, SHIFT(Cs_HIGH)); +} +inline bool IsUnassigned(wchar32 ch) { + return (NUnicode::CharType(ch) == 0) && !(NUnicode::NPrivate::CharInfo(ch) & IS_PRIVATE); +} +inline bool IsPrivateHighSurrogate(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Cs_HIGH)) && (NUnicode::NPrivate::CharInfo(ch) & IS_PRIVATE); +} + +// transformations + +inline wchar32 ToLower(wchar32 ch) { + return static_cast<wchar32>(ch + NUnicode::NPrivate::CharProperty(ch).Lower); +} +inline wchar32 ToUpper(wchar32 ch) { + return static_cast<wchar32>(ch + NUnicode::NPrivate::CharProperty(ch).Upper); +} +inline wchar32 ToTitle(wchar32 ch) { + return static_cast<wchar32>(ch + NUnicode::NPrivate::CharProperty(ch).Title); +} + +inline int ToDigit(wchar32 ch) { + ui32 i = NUnicode::NPrivate::CharInfo(ch); + return (i & IS_DIGIT) ? static_cast<int>(i >> SVAL_OFFSET) : -1; +} + +// BIDI properties + +inline bool IsBidiLeft(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 1); +} +inline bool IsBidiRight(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 2); +} +inline bool IsBidiEuronum(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 3); +} +inline bool IsBidiEurosep(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 4); +} +inline bool IsBidiEuroterm(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 5); +} +inline bool IsBidiArabnum(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 6); +} +inline bool IsBidiCommsep(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 7); +} +inline bool IsBidiBlocksep(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 8); +} +inline bool IsBidiSegmsep(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 9); +} +inline bool IsBidiSpace(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 10); +} +inline bool IsBidiNeutral(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 11); +} +inline bool IsBidiNotappl(wchar32 ch) { + return NUnicode::NPrivate::IsBidi(ch, 0); +} + +inline bool IsSpace(wchar32 ch) { + return IsWhitespace(ch); +} +inline bool IsLower(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Ll_LOWER)); +} +inline bool IsUpper(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Lu_UPPER)); +} +inline bool IsTitle(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Lt_TITLE)); +} +inline bool IsAlpha(wchar32 ch) { + return NUnicode::CharHasType(ch, + SHIFT(Lu_UPPER) | SHIFT(Ll_LOWER) | SHIFT(Lt_TITLE) | SHIFT(Lm_LETTER) | SHIFT(Lm_EXTENDER) | + SHIFT(Lo_OTHER) | SHIFT(Lo_IDEOGRAPH) | SHIFT(Lo_KATAKANA) | SHIFT(Lo_HIRAGANA) | + SHIFT(Lo_LEADING) | SHIFT(Lo_VOWEL) | SHIFT(Lo_TRAILING)); +} +inline bool IsAlnum(wchar32 ch) { + return NUnicode::CharHasType(ch, + SHIFT(Lu_UPPER) | SHIFT(Ll_LOWER) | SHIFT(Lt_TITLE) | SHIFT(Lm_LETTER) | SHIFT(Lm_EXTENDER) | + SHIFT(Lo_OTHER) | SHIFT(Lo_IDEOGRAPH) | SHIFT(Lo_KATAKANA) | SHIFT(Lo_HIRAGANA) | + SHIFT(Lo_LEADING) | SHIFT(Lo_VOWEL) | SHIFT(Lo_TRAILING) | + SHIFT(Nd_DIGIT) | SHIFT(Nl_LETTER) | SHIFT(Nl_IDEOGRAPH) | SHIFT(No_OTHER)); +} +inline bool IsPunct(wchar32 ch) { + return NUnicode::CharHasType(ch, + SHIFT(Pd_DASH) | + SHIFT(Pd_HYPHEN) | SHIFT(Ps_START) | SHIFT(Ps_QUOTE) | SHIFT(Pe_END) | SHIFT(Pe_QUOTE) | SHIFT(Pc_CONNECTOR) | + SHIFT(Po_OTHER) | SHIFT(Po_QUOTE) | SHIFT(Po_TERMINAL) | SHIFT(Po_EXTENDER) | SHIFT(Po_HYPHEN) | + SHIFT(Pi_QUOTE) | SHIFT(Pf_QUOTE)); +} +inline bool IsXdigit(wchar32 ch) { + return IsHexdigit(ch); +} +inline bool IsDigit(wchar32 ch) { + return IsDecdigit(ch); +} + +inline bool IsCommonDigit(wchar32 ch) { + // IsDigit returns true for some exotic symbols like "VAI DIGIT TWO" (U+A622) + // and cannot be used safely with FromString() convertors + const wchar32 ZERO = '0'; + const wchar32 NINE = '9'; + return ch >= ZERO && ch <= NINE; +} + +inline bool IsGraph(wchar32 ch) { + return IsAlnum(ch) || IsPunct(ch) || IsSymbol(ch); +} +inline bool IsBlank(wchar32 ch) { + return NUnicode::CharHasType(ch, SHIFT(Zs_SPACE) | SHIFT(Zs_ZWSPACE)) || ch == '\t'; +} +inline bool IsPrint(wchar32 ch) { + return IsAlnum(ch) || IsPunct(ch) || IsSymbol(ch) || IsBlank(ch); +} + +inline bool IsRomanDigit(wchar32 ch) { + if (NUnicode::CharHasType(ch, SHIFT(Nl_LETTER)) && 0x2160 <= ch && ch <= 0x2188) + return true; + if (ch < 127) { + switch (static_cast<char>(::ToLower(ch))) { + case 'i': + case 'v': + case 'x': + case 'l': + case 'c': + case 'd': + case 'm': + return true; + } + } + return false; +} + +#undef SHIFT diff --git a/util/charset/ut/utf8/invalid_UTF8.bin b/util/charset/ut/utf8/invalid_UTF8.bin Binary files differnew file mode 100644 index 0000000000..3972ab163e --- /dev/null +++ b/util/charset/ut/utf8/invalid_UTF8.bin diff --git a/util/charset/ut/utf8/test1.txt b/util/charset/ut/utf8/test1.txt new file mode 100644 index 0000000000..47a0c36486 --- /dev/null +++ b/util/charset/ut/utf8/test1.txt @@ -0,0 +1,505 @@ +Sentences that contain all letters commonly used in a language +-------------------------------------------------------------- + +Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> -- 2001-09-02 + +This file is UTF-8 encoded. + + +Danish (da) +--------- + + Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen + Wolther spillede på xylofon. + (= Quiz contestants were eating strawbery with cream while Wolther + the circus clown played on xylophone.) + +German (de) +----------- + + Falsches Üben von Xylophonmusik quält jeden größeren Zwerg + (= Wrongful practicing of xylophone music tortures every larger dwarf) + + Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich + (= Twelve boxing fighters hunted Eva across the dike of Sylt) + + Heizölrückstoßabdämpfung + (= fuel oil recoil absorber) + (jqvwxy missing, but all non-ASCII letters in one word) + +English (en) +------------ + + The quick brown fox jumps over the lazy dog + +Spanish (es) +------------ + + El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y + frío, añoraba a su querido cachorro. + (Contains every letter and every accent, but not every combination + of vowel + acute.) + +French (fr) +----------- + + Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à + côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce + qui lui permet de penser à la cænogenèse de l'être dont il est question + dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, + pense-t-il, diminue çà et là la qualité de son œuvre. + + l'île exiguë + Où l'obèse jury mûr + Fête l'haï volapük, + Âne ex aéquo au whist, + Ôtez ce vœu déçu. + + Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en + canoë au delà des îles, près du mälström où brûlent les novæ. + +Irish Gaelic (ga) +----------------- + + D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh + +Hungarian (hu) +-------------- + + Árvíztűrő tükörfúrógép + (= flood-proof mirror-drilling machine, only all non-ASCII letters) + +Icelandic (is) +-------------- + + Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa + + Sævör grét áðan því úlpan var ónýt + (some ASCII letters missing) + +Japanese (jp) +------------- + + Hiragana: (Iroha) + + いろはにほへとちりぬるを + わかよたれそつねならむ + うゐのおくやまけふこえて + あさきゆめみしゑひもせす + + Katakana: + + イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム + ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン + +Hebrew (iw) +----------- + + ? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה + +Polish (pl) +----------- + + Pchnąć w tę łódź jeża lub ośm skrzyń fig + (= To push a hedgehog or eight bins of figs in this boat) + +Russian (ru) +------------ + + В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! + (= Would a citrus live in the bushes of south? Yes, but only a fake one!) + +Thai (th) +--------- + + [--------------------------|------------------------] + ๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน + จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร + ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย + ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอย ฯ + + [The copyright for the Thai example is owned by The Computer + Association of Thailand under the Royal Patronage of His Majesty the + King.] + +Please let me know if you find others! Special thanks to the people +from all over the world who contributed these sentences. +? *Unicode Transcriptions* Notes <#Notes> + +Glyphs <http://www.macchiato.com/unicode/show.html> | Samples +<http://www.macchiato.com/unicode/Unicode_transcriptions.html> | Charts +<http://www.macchiato.com/unicode/charts.html> | UTF +<http://www.macchiato.com/unicode/convert.html> | Forms +<http://www-4.ibm.com/software/developer/library/utfencodingforms/> | +Home <http://www.macchiato.com>. +<http://member.linkexchange.com/cgi-bin/fc/fastcounter-login?750641> + +Name Text Image +Arabic (Arabic) يونِكود ? +Arabic (Persian) یونیکُد / ?/ +Armenian Յունիկօդ +Bengali য়ূনিকোড +Bopomofo ㄊㄨㄥ˅ ㄧˋ ㄇㄚ˅ +ㄨㄢˋ ㄍㄨㄛˊ ㄇㄚ˅ +Braille +Buhid +Canadian Aboriginal ᔫᗂᑰᑦ +Cherokee ᏳᏂᎪᏛ +Cypriot +Cyrillic (Russian) Юникод ? +Deseret (English) ??????? +Devanagari (Hindi) यूनिकोड ? +Ethiopic ዩኒኮድ +Georgian უნიკოდი ? +Gothic +Greek Γιούνικοντ +Gujarati યૂનિકોડ +Gurmukhi ਯੂਨਿਕੋਡ +Han (Chinese) 统一码 ? +統一碼 ? +万国码 ? +萬國碼 ? +Hangul 유니코드 +Hanunoo +Hebrew יוניקוד +Hebrew (pointed) יוּנִיקוׁד +Hebrew (Yiddish) יוניקאָד ? +Hiragana (Japanese) ゆにこおど +Katakana (Japanese) ユニコード ? +Kannada ಯೂನಿಕೋಡ್ +Khmer យូនីគោដ +Lao +Latin Unicode Unicode +Latin (IPA <#English_Pronunciation>) ˈjunɪˌkoːd ? +Latin (Am. Dict. <#American_Dictionary>) Ūnĭcōde̽ ? +Limbu +Linear B +Malayalam യൂനികോഡ് +Mongolian +Myanmar +Ogham ᚔᚒᚅᚔᚉᚑᚇ / / +Old Italic +Oriya ୟୂନିକୋଡ +Osmanya +Runic (Anglo-Saxon) ᛡᚢᚾᛁᚳᚩᛞ +Shavian +Sinhala යණනිකෞද් +Syriac ܝܘܢܝܩܘܕ +Tagbanwa +Tagalog +Tai Le +Tamil யூனிகோட் +Telugu యూనికోడ్ +Thaana +Thai ยูนืโคด +Tibetan (Dzongkha) ཨུ་ནི་ཀོཌྲ། +Ugaritic +Yi + + + Notes: + +There are different ways to transcribe the word “Unicode”, depending on +the language and script. In some cases there is only one language that +customarily uses a given script; in others there are many languages. The +goal here is at a minimum to collect at least one transcription for each +script in a language customarily written in that script, with more +languages if possible. If the transcription is the same for multiple +languages in a script, then a single representative language is used. + +Still missing are transcriptions for the items above in RED (in at least +one language). I would appreciate any other transcriptions, or +corrections for the ones listed here. Send to mark3@macchiato.com +<mailto:mark3@macchiato.com>, using the directions below: + + * *Supplying Missing Items* + o Most Latin-script languages will follow the spelling, and + change the pronunciation. For any that would not, it would + be good to have the alternate spelling. + o For non-Latin scripts the goal is to match the English + pronunciation — /*not*/ spelling. Above is the IPA <#IPA> + (in phonemic transcription) that should be matched as + closely as possible (without sounding affected in the target + language) + o Text would be best in either the UTF-8 text, or the code + points in hex HTML. E.g. either of the following: + + "Юникод" + + "Юникод" + + Note: for / supplementary characters/ + <http://www.unicode.org/glossary/#supplementary_character>, + there should be one hex number per code point, not two + surrogates + <http://www.unicode.org/glossary/#surrogate_code_point>: + # 𐀀 /*not*/ �&xDC00; + o If you have a good font, I'd also appreciate a GIF. It + should be *96 x 24* bits, with the text centered, in black + on white (plus grays if smoothed). + * *Other Comments* + o Because some browsers won't handle the text, both text and + GIF image are supplied. If you can’t read the text columns, + see Display Problems + <http://www.unicode.org/help/display_problems.html>. + o The Chinese versions (inc. Bopomofo) are translations, not + transcriptions, since "transcription in Chinese is pretty + lame" [J. Becker]. + o There are other "translations" of Unicode that may be in + use, such as the Vietnamese "Thống Nhất Mã". + o For sample pages in different languages on the Unicode site, + see What is Unicode? + <http://www.unicode.org/unicode/standard/WhatIsUnicode.html> + o Americans are not generally used to IPA, and find a variety + of different systems in their dictionaries. This one leaves + the base letters as they are, and uses diacritics for + pronunciation. + * *Etymology of /Unicode/* + o Coined by J. Becker. Not related to previous usages, such as: + + A telegraphic code in which one word or set of letters + represents a sentence or phrase; a telegram or message + in this. (late 19th century, OED) + o According to my references, the prefix "uni" is directly + from Latin while the word "code" is through French. + o The original Indo-European apparently would have been + *oino-kau-do ("one strike give"): *kau apparently being + related to such English words as: hew, haggle, hoe, hag, + hay, hack, caudad, caudal, caudate, caudex, coda, codex, + codicil, coward, incus, and Kovač (personal name: "smith"). + + I will leave the exact derivations to the exegetes, + but I like the association with "haggle" myself. + * *Contributions* + o This draws on contributions or comments from: + + Dixon Au + + Joe Becker + + Maurice Bauhahn + + Abel Cheung + + Peter Constable + + Michael Everson + + Christopher John Fynn + + Michael Kaplan + + George Kiraz + + Abdul Malik + + Siva Nataraja + + Roozbeh Pournader + + Jonathan Rosenne + + Jungshik Shin + +------------------------------------------------------------------------ + + +Terms of Use <http://www.macchiato.com/terms_of_use.html>. Last updated: +MED - 04/20/2003 15:30:33. +<http://member.linkexchange.com/cgi-bin/fc/fastcounter-login?750641> + + + + +UTF-8 encoded sample plain-text file +‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + +Markus Kuhn [ˈmaʳkʊs kuːn] <http://www.cl.cam.ac.uk/~mgk25/> — 2002-07-25 + + +The ASCII compatible UTF-8 encoding used in this plain-text file +is defined in Unicode, ISO 10646-1, and RFC 2279. + + +Using Unicode/UTF-8, you can write in emails and source code things such as + +Mathematics and sciences: + + ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ⎧⎡⎛┌─────┐⎞⎤⎫ + ⎪⎢⎜│a²+b³ ⎟⎥⎪ + ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪ + ⎪⎢⎜⎷ c₈ ⎟⎥⎪ + ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⎨⎢⎜ ⎟⎥⎬ + ⎪⎢⎜ ∞ ⎟⎥⎪ + ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪ + ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪ + 2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣⎝i=1 ⎠⎦⎭ + +Linguistics and dictionaries: + + ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn + Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ] + +APL: + + ((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈ + +Nicer typography in plain text files: + + ╔══════════════════════════════════════════╗ + ║ ║ + ║ • ‘single’ and “double” quotes ║ + ║ ║ + ║ • Curly apostrophes: “We’ve been here” ║ + ║ ║ + ║ • Latin-1 apostrophe and accents: '´` ║ + ║ ║ + ║ • ‚deutsche‘ „Anführungszeichen“ ║ + ║ ║ + ║ • †, ‡, ‰, •, 3–4, —, −5/+5, ™, … ║ + ║ ║ + ║ • ASCII safety test: 1lI|, 0OD, 8B ║ + ║ ╭─────────╮ ║ + ║ • the euro symbol: │ 14.95 € │ ║ + ║ ╰─────────╯ ║ + ╚══════════════════════════════════════════╝ + +Combining characters: + + STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ + +Greek (in Polytonic): + + The Greek anthem: + + Σὲ γνωρίζω ἀπὸ τὴν κόψη + τοῦ σπαθιοῦ τὴν τρομερή, + σὲ γνωρίζω ἀπὸ τὴν ὄψη + ποὺ μὲ βία μετράει τὴ γῆ. + + ᾿Απ᾿ τὰ κόκκαλα βγαλμένη + τῶν ῾Ελλήνων τὰ ἱερά + καὶ σὰν πρῶτα ἀνδρειωμένη + χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά! + + From a speech of Demosthenes in the 4th century BC: + + Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι, + ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς + λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ + τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿ + εἰς τοῦτο προήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ + πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν + οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι, + οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν + ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον + τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι + γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν + προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους + σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ + τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ + τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς + τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον. + + Δημοσθένους, Γ´ ᾿Ολυνθιακὸς + +Georgian: + + From a Unicode conference invitation: + + გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო + კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს, + ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს + ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი, + ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება + ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში, + ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში. + +Russian: + + From a Unicode conference invitation: + + Зарегистрируйтесь сейчас на Десятую Международную Конференцию по + Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии. + Конференция соберет широкий круг экспертов по вопросам глобального + Интернета и Unicode, локализации и интернационализации, воплощению и + применению Unicode в различных операционных системах и программных + приложениях, шрифтах, верстке и многоязычных компьютерных системах. + +Thai (UCS Level 2): + + Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese + classic 'San Gua'): + + [----------------------------|------------------------] + ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่ + สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา + ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนักหนา + โฮจิ๋นเรียกทัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัญ + เหมือนขับไสไล่เสือจากเคหา รับหมาป่าเข้ามาเลยอาสัญ + ฝ่ายอ้องอุ้นยุแยกให้แตกกัน ใช้สาวนั้นเป็นชนวนชื่นชวนใจ + พลันลิฉุยกุยกีกลับก่อเหตุ ช่างอาเพศจริงหนาฟ้าร้องไห้ + ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ + + (The above is a two-column text. If combining characters are handled + correctly, the lines of the second column should be aligned with the + | character above.) + +Ethiopian: + + Proverbs in the Amharic language: + + ሰማይ አይታረስ ንጉሥ አይከሰስ። + ብላ ካለኝ እንደአባቴ በቆመጠኝ። + ጌጥ ያለቤቱ ቁምጥና ነው። + ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው። + የአፍ ወለምታ በቅቤ አይታሽም። + አይጥ በበላ ዳዋ ተመታ። + ሲተረጉሙ ይደረግሙ። + ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል። + ድር ቢያብር አንበሳ ያስር። + ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም። + እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም። + የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ። + ሥራ ከመፍታት ልጄን ላፋታት። + ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል። + የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ። + ተንጋሎ ቢተፉ ተመልሶ ባፉ። + ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው። + እግርህን በፍራሽህ ልክ ዘርጋ። + +Runes: + + ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ + + (Old English, which transcribed into Latin reads 'He cwaeth that he + bude thaem lande northweardum with tha Westsae.' and means 'He said + that he lived in the northern land near the Western Sea.') + +Braille: + + ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌ + + ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞ + ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎ + ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂ + ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙ + ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑ + ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲ + + ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ + + ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹ + ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞ + ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕ + ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹ + ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎ + ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎ + ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳ + ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞ + ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ + + (The first couple of paragraphs of "A Christmas Carol" by Dickens) + +Compact font selection example text: + + ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 + abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ + –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд + ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა + +Greetings in various languages: + + Hello world, Καλημέρα κόσμε, コンニチハ + +Box drawing alignment tests: █ + ▉ + ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳ + ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳ + ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳ + ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳ + ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎ + ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏ + ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█ + ▝▀▘▙▄▟ diff --git a/util/charset/ut/ya.make b/util/charset/ut/ya.make new file mode 100644 index 0000000000..6526815e92 --- /dev/null +++ b/util/charset/ut/ya.make @@ -0,0 +1,17 @@ +UNITTEST_FOR(util/charset) + +OWNER(g:util) +SUBSCRIBER(g:util-subscribers) + +DATA(arcadia/util/charset/ut/utf8) + +SRCS( + utf8_ut.cpp + wide_ut.cpp +) + +INCLUDE(${ARCADIA_ROOT}/util/tests/ya_util_tests.inc) + +REQUIREMENTS(ram:17) + +END() diff --git a/util/charset/utf8.cpp b/util/charset/utf8.cpp new file mode 100644 index 0000000000..efe3a52f61 --- /dev/null +++ b/util/charset/utf8.cpp @@ -0,0 +1,170 @@ +#include "unidata.h" +#include "utf8.h" + +namespace { + enum class ECaseConversion { + ToUpper, + ToLower, + }; + + wchar32 ConvertChar(ECaseConversion conversion, wchar32 ch) { + switch (conversion) { + case ECaseConversion::ToUpper: + return ToUpper(ch); + case ECaseConversion::ToLower: + return ToLower(ch); + } + Y_ASSERT(false); // NOTREACHED + return 0; + } + + bool ConvertCaseUTF8Impl(ECaseConversion conversion, const char* beg, size_t n, + TString& newString) { + const unsigned char* p = (const unsigned char*)beg; + const unsigned char* const end = p + n; + + // first loop searches for the first character, which is changed by ConvertChar + // if there is no changed character, we don't need reallocation/copy + wchar32 cNew = 0; + size_t cLen = 0; + while (p < end) { + wchar32 c; + if (RECODE_OK != SafeReadUTF8Char(c, cLen, p, end)) { + ythrow yexception() + << "failed to decode UTF-8 string at pos " << ((const char*)p - beg); + } + cNew = ConvertChar(conversion, c); + + if (cNew != c) + break; + p += cLen; + } + if (p == end) { + return false; + } + + // some character changed after ToLower. Write new string to newString. + newString.resize(n); + + size_t written = (char*)p - beg; + char* writePtr = newString.begin(); + memcpy(writePtr, beg, written); + writePtr += written; + size_t destSpace = n - written; + + // before each iteration (including the first one) variable 'cNew' contains unwritten symbol + while (true) { + size_t cNewLen; + Y_ASSERT((writePtr - newString.data()) + destSpace == newString.size()); + if (RECODE_EOOUTPUT == + SafeWriteUTF8Char(cNew, cNewLen, (unsigned char*)writePtr, destSpace)) { + destSpace += newString.size(); + newString.resize(newString.size() * 2); + writePtr = newString.begin() + (newString.size() - destSpace); + continue; + } + destSpace -= cNewLen; + writePtr += cNewLen; + p += cLen; + if (p == end) { + newString.resize(newString.size() - destSpace); + return true; + } + wchar32 c = 0; + if (RECODE_OK != SafeReadUTF8Char(c, cLen, p, end)) { + ythrow yexception() + << "failed to decode UTF-8 string at pos " << ((const char*)p - beg); + } + cNew = ConvertChar(conversion, c); + } + Y_ASSERT(false); + return false; + } +} // namespace + +extern const wchar32 BROKEN_RUNE = 0xFFFD; + +static const char* SkipUTF8Chars(const char* begin, const char* end, size_t numChars) { + const unsigned char* uEnd = reinterpret_cast<const unsigned char*>(end); + while (begin != end && numChars > 0) { + const unsigned char* uBegin = reinterpret_cast<const unsigned char*>(begin); + size_t runeLen; + if (GetUTF8CharLen(runeLen, uBegin, uEnd) != RECODE_OK) { + ythrow yexception() << "invalid UTF-8 char"; + } + begin += runeLen; + Y_ASSERT(begin <= end); + --numChars; + } + return begin; +} + +TStringBuf SubstrUTF8(const TStringBuf str, size_t pos, size_t len) { + const char* start = SkipUTF8Chars(str.begin(), str.end(), pos); + const char* end = SkipUTF8Chars(start, str.end(), len); + return TStringBuf(start, end - start); +} + +EUTF8Detect UTF8Detect(const char* s, size_t len) { + const unsigned char* s0 = (const unsigned char*)s; + const unsigned char* send = s0 + len; + wchar32 rune; + size_t rune_len; + EUTF8Detect res = ASCII; + + while (s0 < send) { + RECODE_RESULT rr = SafeReadUTF8Char(rune, rune_len, s0, send); + + if (rr != RECODE_OK) { + return NotUTF8; + } + + if (rune_len > 1) { + res = UTF8; + } + + s0 += rune_len; + } + + return res; +} + +bool ToLowerUTF8Impl(const char* beg, size_t n, TString& newString) { + return ConvertCaseUTF8Impl(ECaseConversion::ToLower, beg, n, newString); +} + +TString ToLowerUTF8(const TString& s) { + TString newString; + bool changed = ToLowerUTF8Impl(s.data(), s.size(), newString); + return changed ? newString : s; +} + +TString ToLowerUTF8(TStringBuf s) { + TString newString; + bool changed = ToLowerUTF8Impl(s.data(), s.size(), newString); + return changed ? newString : TString(s.data(), s.size()); +} + +TString ToLowerUTF8(const char* s) { + return ToLowerUTF8(TStringBuf(s)); +} + +bool ToUpperUTF8Impl(const char* beg, size_t n, TString& newString) { + return ConvertCaseUTF8Impl(ECaseConversion::ToUpper, beg, n, newString); +} + +TString ToUpperUTF8(const TString& s) { + TString newString; + bool changed = ToUpperUTF8Impl(s.data(), s.size(), newString); + return changed ? newString : s; +} + +TString ToUpperUTF8(TStringBuf s) { + TString newString; + bool changed = ToUpperUTF8Impl(s.data(), s.size(), newString); + return changed ? newString : TString(s.data(), s.size()); +} + +TString ToUpperUTF8(const char* s) { + return ToUpperUTF8(TStringBuf(s)); +} diff --git a/util/charset/utf8.h b/util/charset/utf8.h new file mode 100644 index 0000000000..5039b46ae9 --- /dev/null +++ b/util/charset/utf8.h @@ -0,0 +1,388 @@ +#pragma once + +#include "recode_result.h" + +#include <util/generic/strbuf.h> +#include <util/generic/string.h> +#include <util/generic/yexception.h> +#include <util/system/defaults.h> +#include <util/system/yassert.h> + +extern const wchar32 BROKEN_RUNE; + +inline unsigned char UTF8LeadByteMask(size_t utf8_rune_len) { + // Y_ASSERT (utf8_rune_len <= 4); + return "\0\0\037\017\007"[utf8_rune_len]; +} + +inline size_t UTF8RuneLen(const unsigned char lead_byte) { + //b0XXXXXXX + if ((lead_byte & 0x80) == 0x00) { + return 1; + } + //b110XXXXX + if ((lead_byte & 0xe0) == 0xc0) { + return 2; + } + //b1110XXXX + if ((lead_byte & 0xf0) == 0xe0) { + return 3; + } + //b11110XXX + if ((lead_byte & 0xf8) == 0xf0) { + return 4; + } + //b10XXXXXX + return 0; +} + +inline size_t UTF8RuneLenByUCS(wchar32 rune) { + if (rune < 0x80) + return 1U; + else if (rune < 0x800) + return 2U; + else if (rune < 0x10000) + return 3U; + else if (rune < 0x200000) + return 4U; + else if (rune < 0x4000000) + return 5U; + else + return 6U; +} + +inline void PutUTF8LeadBits(wchar32& rune, unsigned char c, size_t len) { + rune = c; + rune &= UTF8LeadByteMask(len); +} + +inline void PutUTF8SixBits(wchar32& rune, unsigned char c) { + rune <<= 6; + rune |= c & 0x3F; +} + +inline bool IsUTF8ContinuationByte(unsigned char c) { + return (c & static_cast<unsigned char>(0xC0)) == static_cast<unsigned char>(0x80); +} + +//! returns length of the current UTF8 character +//! @param n length of the current character, it is assigned in case of valid UTF8 byte sequence +//! @param p pointer to the current character +//! @param e end of the character sequence +inline RECODE_RESULT GetUTF8CharLen(size_t& n, const unsigned char* p, const unsigned char* e) { + Y_ASSERT(p < e); // since p < e then we will check RECODE_EOINPUT only for n > 1 (see calls of this functions) + switch (UTF8RuneLen(*p)) { + case 0: + return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in first byte + + case 1: + n = 1; + return RECODE_OK; + + case 2: + if (p + 2 > e) { + return RECODE_EOINPUT; + } else if (!IsUTF8ContinuationByte(p[1])) { + return RECODE_BROKENSYMBOL; + } else { + n = 2; + return RECODE_OK; + } + case 3: + if (p + 3 > e) { + return RECODE_EOINPUT; + } else if (!IsUTF8ContinuationByte(p[1]) || !IsUTF8ContinuationByte(p[2])) { + return RECODE_BROKENSYMBOL; + } else { + n = 3; + return RECODE_OK; + } + default: // actually 4 + if (p + 4 > e) { + return RECODE_EOINPUT; + } else if (!IsUTF8ContinuationByte(p[1]) || !IsUTF8ContinuationByte(p[2]) || !IsUTF8ContinuationByte(p[3])) { + return RECODE_BROKENSYMBOL; + } else { + n = 4; + return RECODE_OK; + } + } +} + +//! returns number of characters in UTF8 encoded text, stops immediately if UTF8 byte sequence is wrong +//! @param text UTF8 encoded text +//! @param len the length of the text in bytes +//! @param number number of encoded symbols in the text +inline bool GetNumberOfUTF8Chars(const char* text, size_t len, size_t& number) { + const unsigned char* cur = reinterpret_cast<const unsigned char*>(text); + const unsigned char* const last = cur + len; + number = 0; + size_t runeLen; + bool res = true; + while (cur != last) { + if (GetUTF8CharLen(runeLen, cur, last) != RECODE_OK) { // actually it could be RECODE_BROKENSYMBOL only + res = false; + break; + } + cur += runeLen; + Y_ASSERT(cur <= last); + ++number; + } + return res; +} + +inline size_t GetNumberOfUTF8Chars(TStringBuf text) { + size_t number; + if (!GetNumberOfUTF8Chars(text.data(), text.size(), number)) { + ythrow yexception() << "GetNumberOfUTF8Chars failed on invalid utf-8 " << TString(text.substr(0, 50)).Quote(); + } + return number; +} + +//! reads one unicode symbol from a character sequence encoded UTF8 and checks for overlong encoding +//! @param rune value of the current character +//! @param rune_len length of the UTF8 bytes sequence that has been read +//! @param s pointer to the current character +//! @param end the end of the character sequence +inline RECODE_RESULT SafeReadUTF8Char(wchar32& rune, size_t& rune_len, const unsigned char* s, const unsigned char* end) { + rune = BROKEN_RUNE; + rune_len = 0; + wchar32 _rune; + + size_t _len = UTF8RuneLen(*s); + if (s + _len > end) + return RECODE_EOINPUT; //[EOINPUT] + if (_len == 0) + return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in first byte + _rune = *s++; //[00000000 0XXXXXXX] + + if (_len > 1) { + _rune &= UTF8LeadByteMask(_len); + unsigned char ch = *s++; + if (!IsUTF8ContinuationByte(ch)) + return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in second byte + PutUTF8SixBits(_rune, ch); //[00000XXX XXYYYYYY] + if (_len > 2) { + ch = *s++; + if (!IsUTF8ContinuationByte(ch)) + return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in third byte + PutUTF8SixBits(_rune, ch); //[XXXXYYYY YYZZZZZZ] + if (_len > 3) { + ch = *s; + if (!IsUTF8ContinuationByte(ch)) + return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in fourth byte + PutUTF8SixBits(_rune, ch); //[XXXYY YYYYZZZZ ZZQQQQQQ] + if (_rune > 0x10FFFF) // it is not a valid Unicode code point + return RECODE_BROKENSYMBOL; + if (_rune < 0x10000) // check for overlong encoding + return RECODE_BROKENSYMBOL; + } else { + if (_rune < 0x800) // check for overlong encoding + return RECODE_BROKENSYMBOL; + } + } else { + if (_rune < 0x80) // check for overlong encoding + return RECODE_BROKENSYMBOL; + } + } + rune_len = _len; + rune = _rune; + return RECODE_OK; +} + +//! reads one unicode symbol from a character sequence encoded UTF8 and moves pointer to the next character +//! @param c value of the current character +//! @param p pointer to the current character, it will be changed in case of valid UTF8 byte sequence +//! @param e the end of the character sequence +Y_FORCE_INLINE RECODE_RESULT ReadUTF8CharAndAdvance(wchar32& rune, const unsigned char*& p, const unsigned char* e) noexcept { + Y_ASSERT(p < e); // since p < e then we will check RECODE_EOINPUT only for n > 1 (see calls of this functions) + switch (UTF8RuneLen(*p)) { + case 0: + rune = BROKEN_RUNE; + return RECODE_BROKENSYMBOL; //[BROKENSYMBOL] in first byte + + case 1: + rune = *p; //[00000000 0XXXXXXX] + ++p; + return RECODE_OK; + + case 2: + if (p + 2 > e) { + return RECODE_EOINPUT; + } else if (!IsUTF8ContinuationByte(p[1])) { + rune = BROKEN_RUNE; + return RECODE_BROKENSYMBOL; + } else { + PutUTF8LeadBits(rune, *p++, 2); //[00000000 000XXXXX] + PutUTF8SixBits(rune, *p++); //[00000XXX XXYYYYYY] + if (Y_UNLIKELY(rune < 0x80)) { // overlong encoding + p -= 2; + rune = BROKEN_RUNE; + return RECODE_BROKENSYMBOL; + } + return RECODE_OK; + } + case 3: + if (p + 3 > e) { + return RECODE_EOINPUT; + } else if (!IsUTF8ContinuationByte(p[1]) || !IsUTF8ContinuationByte(p[2])) { + rune = BROKEN_RUNE; + return RECODE_BROKENSYMBOL; + } else { + PutUTF8LeadBits(rune, *p++, 3); //[00000000 0000XXXX] + PutUTF8SixBits(rune, *p++); //[000000XX XXYYYYYY] + PutUTF8SixBits(rune, *p++); //[XXXXYYYY YYZZZZZZ] + if (Y_UNLIKELY(rune < 0x800)) { // overlong encoding + p -= 3; + rune = BROKEN_RUNE; + return RECODE_BROKENSYMBOL; + } + return RECODE_OK; + } + case 4: + if (p + 4 > e) { + return RECODE_EOINPUT; + } else if (!IsUTF8ContinuationByte(p[1]) || !IsUTF8ContinuationByte(p[2]) || !IsUTF8ContinuationByte(p[3])) { + rune = BROKEN_RUNE; + return RECODE_BROKENSYMBOL; + } else { + PutUTF8LeadBits(rune, *p++, 4); //[00000000 00000000 00000XXX] + PutUTF8SixBits(rune, *p++); //[00000000 0000000X XXYYYYYY] + PutUTF8SixBits(rune, *p++); //[00000000 0XXXYYYY YYZZZZZZ] + PutUTF8SixBits(rune, *p++); //[000XXXYY YYYYZZZZ ZZQQQQQQ] + if (Y_UNLIKELY(rune < 0x10000 || rune > 0x10FFFF)) { // overlong encoding or non-valid code point + p -= 4; + rune = BROKEN_RUNE; + return RECODE_BROKENSYMBOL; + } + return RECODE_OK; + } + default: // >4 + rune = BROKEN_RUNE; + return RECODE_BROKENSYMBOL; + } +} + +//! writes one unicode symbol into a character sequence encoded UTF8 +//! checks for end of the buffer and returns the result of encoding +//! @param rune value of the current character +//! @param rune_len length of the UTF8 byte sequence that has been written +//! @param s pointer to the output buffer +//! @param tail available size of the buffer +inline RECODE_RESULT SafeWriteUTF8Char(wchar32 rune, size_t& rune_len, unsigned char* s, size_t tail) { + rune_len = 0; + if (rune < 0x80) { + if (tail <= 0) + return RECODE_EOOUTPUT; + *s = static_cast<unsigned char>(rune); + rune_len = 1; + return RECODE_OK; + } + if (rune < 0x800) { + if (tail <= 1) + return RECODE_EOOUTPUT; + *s++ = static_cast<unsigned char>(0xC0 | (rune >> 6)); + *s = static_cast<unsigned char>(0x80 | (rune & 0x3F)); + rune_len = 2; + return RECODE_OK; + } + if (rune < 0x10000) { + if (tail <= 2) + return RECODE_EOOUTPUT; + *s++ = static_cast<unsigned char>(0xE0 | (rune >> 12)); + *s++ = static_cast<unsigned char>(0x80 | ((rune >> 6) & 0x3F)); + *s = static_cast<unsigned char>(0x80 | (rune & 0x3F)); + rune_len = 3; + return RECODE_OK; + } + /*if (rune < 0x200000)*/ { + if (tail <= 3) + return RECODE_EOOUTPUT; + *s++ = static_cast<unsigned char>(0xF0 | ((rune >> 18) & 0x07)); + *s++ = static_cast<unsigned char>(0x80 | ((rune >> 12) & 0x3F)); + *s++ = static_cast<unsigned char>(0x80 | ((rune >> 6) & 0x3F)); + *s = static_cast<unsigned char>(0x80 | (rune & 0x3F)); + rune_len = 4; + return RECODE_OK; + } +} + +inline RECODE_RESULT SafeWriteUTF8Char(wchar32 rune, size_t& rune_len, unsigned char* s, const unsigned char* end) { + return SafeWriteUTF8Char(rune, rune_len, s, end - s); +} + +//! writes one unicode symbol into a character sequence encoded UTF8 +//! @attention this function works as @c SafeWriteUTF8Char it does not check +//! the size of the output buffer, it supposes that buffer is long enough +//! @param rune value of the current character +//! @param rune_len length of the UTF8 byte sequence that has been written +//! @param s pointer to the output buffer +inline void WriteUTF8Char(wchar32 rune, size_t& rune_len, unsigned char* s) { + if (rune < 0x80) { + *s = static_cast<unsigned char>(rune); + rune_len = 1; + return; + } + if (rune < 0x800) { + *s++ = static_cast<unsigned char>(0xC0 | (rune >> 6)); + *s = static_cast<unsigned char>(0x80 | (rune & 0x3F)); + rune_len = 2; + return; + } + if (rune < 0x10000) { + *s++ = static_cast<unsigned char>(0xE0 | (rune >> 12)); + *s++ = static_cast<unsigned char>(0x80 | ((rune >> 6) & 0x3F)); + *s = static_cast<unsigned char>(0x80 | (rune & 0x3F)); + rune_len = 3; + return; + } + /*if (rune < 0x200000)*/ { + *s++ = static_cast<unsigned char>(0xF0 | ((rune >> 18) & 0x07)); + *s++ = static_cast<unsigned char>(0x80 | ((rune >> 12) & 0x3F)); + *s++ = static_cast<unsigned char>(0x80 | ((rune >> 6) & 0x3F)); + *s = static_cast<unsigned char>(0x80 | (rune & 0x3F)); + rune_len = 4; + } +} + +TStringBuf SubstrUTF8(const TStringBuf str, size_t pos, size_t len); + +enum EUTF8Detect { + NotUTF8, + UTF8, + ASCII +}; + +EUTF8Detect UTF8Detect(const char* s, size_t len); + +inline EUTF8Detect UTF8Detect(const TStringBuf input) { + return UTF8Detect(input.data(), input.size()); +} + +inline bool IsUtf(const char* input, size_t len) { + return UTF8Detect(input, len) != NotUTF8; +} + +inline bool IsUtf(const TStringBuf input) { + return IsUtf(input.data(), input.size()); +} + +//! returns true, if result is not the same as input, and put it in newString +//! returns false, if result is unmodified +bool ToLowerUTF8Impl(const char* beg, size_t n, TString& newString); + +TString ToLowerUTF8(const TString& s); +TString ToLowerUTF8(TStringBuf s); +TString ToLowerUTF8(const char* s); + +inline TString ToLowerUTF8(const std::string& s) { + return ToLowerUTF8(TStringBuf(s)); +} + +//! returns true, if result is not the same as input, and put it in newString +//! returns false, if result is unmodified +bool ToUpperUTF8Impl(const char* beg, size_t n, TString& newString); + +TString ToUpperUTF8(const TString& s); +TString ToUpperUTF8(TStringBuf s); +TString ToUpperUTF8(const char* s); diff --git a/util/charset/utf8_ut.cpp b/util/charset/utf8_ut.cpp new file mode 100644 index 0000000000..9e68881cca --- /dev/null +++ b/util/charset/utf8_ut.cpp @@ -0,0 +1,126 @@ +#include "utf8.h" +#include "wide.h" + +#include <util/stream/file.h> +#include <util/ysaveload.h> + +#include <library/cpp/testing/unittest/registar.h> +#include <library/cpp/testing/unittest/env.h> + +Y_UNIT_TEST_SUITE(TUtfUtilTest) { + Y_UNIT_TEST(TestUTF8Len) { + UNIT_ASSERT_EQUAL(GetNumberOfUTF8Chars("привет!"), 7); + } + + Y_UNIT_TEST(TestToLowerUtfString) { + UNIT_ASSERT_VALUES_EQUAL(ToLowerUTF8("xyz XYZ ПРИВЕТ!"), "xyz xyz привет!"); + + UNIT_ASSERT_VALUES_EQUAL(ToLowerUTF8(TStringBuf("xyz")), "xyz"); + + { + TString s = "привет!"; + TString q = "ПРИВЕТ!"; + TString tmp; + UNIT_ASSERT(ToLowerUTF8Impl(s.data(), s.size(), tmp) == false); + UNIT_ASSERT(ToLowerUTF8Impl(q.data(), q.size(), tmp) == true); + } + + { + const char* weird = "\xC8\xBE"; // 'Ⱦ', U+023E. strlen(weird)==2, strlen(tolower_utf8(weird)) is 3 + const char* turkI = "İ"; //strlen("İ") == 2, strlen(tolower_utf8("İ") == 1 + TStringBuf chars[] = {"f", "F", "Б", "б", weird, turkI}; + const int N = Y_ARRAY_SIZE(chars); + //try all combinations of these letters. + int numberOfVariants = 1; + for (int len = 0; len <= 4; ++len) { + for (int i = 0; i < numberOfVariants; ++i) { + TString s; + int k = i; + for (int j = 0; j < len; ++j) { + //Treat 'i' like number in base-N system with digits from 'chars'-array + s += chars[k % N]; + k /= N; + } + + TUtf16String tmp = UTF8ToWide(s); + tmp.to_lower(); + + UNIT_ASSERT_VALUES_EQUAL(ToLowerUTF8(s), WideToUTF8(tmp)); + } + numberOfVariants *= N; + } + } + } + + Y_UNIT_TEST(TestToUpperUtfString) { + UNIT_ASSERT_VALUES_EQUAL(ToUpperUTF8("xyz XYZ привет!"), "XYZ XYZ ПРИВЕТ!"); + + UNIT_ASSERT_VALUES_EQUAL(ToUpperUTF8(TStringBuf("XYZ")), "XYZ"); + + { + TString s = "ПРИВЕТ!"; + TString q = "привет!"; + TString tmp; + UNIT_ASSERT(ToUpperUTF8Impl(s.data(), s.size(), tmp) == false); + UNIT_ASSERT(ToUpperUTF8Impl(q.data(), q.size(), tmp) == true); + } + + { + const char* weird = "\xC8\xBE"; // 'Ⱦ', U+023E. strlen(weird)==2, strlen(ToUpper_utf8(weird)) is 3 + const char* turkI = "İ"; //strlen("İ") == 2, strlen(ToUpper_utf8("İ") == 1 + TStringBuf chars[] = {"F", "f", "б", "Б", turkI, weird}; + const int N = Y_ARRAY_SIZE(chars); + //try all combinations of these letters. + int numberOfVariants = 1; + for (int len = 0; len <= 4; ++len) { + for (int i = 0; i < numberOfVariants; ++i) { + TString s; + int k = i; + for (int j = 0; j < len; ++j) { + //Treat 'i' like number in base-N system with digits from 'chars'-array + s += chars[k % N]; + k /= N; + } + + TUtf16String tmp = UTF8ToWide(s); + tmp.to_upper(); + + UNIT_ASSERT_VALUES_EQUAL(ToUpperUTF8(s), WideToUTF8(tmp)); + } + numberOfVariants *= N; + } + } + } + + Y_UNIT_TEST(TestUTF8ToWide) { + TFileInput in(ArcadiaSourceRoot() + TStringBuf("/util/charset/ut/utf8/test1.txt")); + + TString text = in.ReadAll(); + UNIT_ASSERT(WideToUTF8(UTF8ToWide(text)) == text); + } + + Y_UNIT_TEST(TestInvalidUTF8) { + TVector<TString> testData; + TFileInput input(ArcadiaSourceRoot() + TStringBuf("/util/charset/ut/utf8/invalid_UTF8.bin")); + Load(&input, testData); + + for (const auto& text : testData) { + UNIT_ASSERT_EXCEPTION(UTF8ToWide(text), yexception); + } + } + + Y_UNIT_TEST(TestUTF8ToWideScalar) { + TFileInput in(ArcadiaSourceRoot() + TStringBuf("/util/charset/ut/utf8/test1.txt")); + + TString text = in.ReadAll(); + TUtf16String wtextSSE = UTF8ToWide(text); + TUtf16String wtextScalar = TUtf16String::Uninitialized(text.size()); + const unsigned char* textBegin = reinterpret_cast<const unsigned char*>(text.c_str()); + wchar16* wtextBegin = wtextScalar.begin(); + ::NDetail::UTF8ToWideImplScalar<false>(textBegin, textBegin + text.size(), wtextBegin); + UNIT_ASSERT(wtextBegin == wtextScalar.begin() + wtextSSE.size()); + UNIT_ASSERT(textBegin == reinterpret_cast<const unsigned char*>(text.end())); + wtextScalar.remove(wtextSSE.size()); + UNIT_ASSERT(wtextScalar == wtextSSE); + } +} diff --git a/util/charset/wide.cpp b/util/charset/wide.cpp new file mode 100644 index 0000000000..a287438ddd --- /dev/null +++ b/util/charset/wide.cpp @@ -0,0 +1,626 @@ +#include "wide.h" + +#include <util/generic/mem_copy.h> +#include <util/string/strip.h> + +namespace { + //! the constants are not zero-terminated + const wchar16 LT[] = {'&', 'l', 't', ';'}; + const wchar16 GT[] = {'&', 'g', 't', ';'}; + const wchar16 AMP[] = {'&', 'a', 'm', 'p', ';'}; + const wchar16 BR[] = {'<', 'B', 'R', '>'}; + const wchar16 QUOT[] = {'&', 'q', 'u', 'o', 't', ';'}; + + template <bool insertBr> + inline size_t EscapedLen(wchar16 c) { + switch (c) { + case '<': + return Y_ARRAY_SIZE(LT); + case '>': + return Y_ARRAY_SIZE(GT); + case '&': + return Y_ARRAY_SIZE(AMP); + case '\"': + return Y_ARRAY_SIZE(QUOT); + default: + if (insertBr && (c == '\r' || c == '\n')) + return Y_ARRAY_SIZE(BR); + else + return 1; + } + } +} + +void Collapse(TUtf16String& w) { + CollapseImpl(w, w, 0, IsWhitespace); +} + +size_t Collapse(wchar16* s, size_t n) { + return CollapseImpl(s, n, IsWhitespace); +} + +TWtringBuf StripLeft(const TWtringBuf text) noexcept { + const auto* p = text.data(); + const auto* const pe = text.data() + text.size(); + + for (; p != pe && IsWhitespace(*p); ++p) { + } + + return {p, pe}; +} + +void StripLeft(TUtf16String& text) { + const auto stripped = StripLeft(TWtringBuf(text)); + if (stripped.size() == text.size()) { + return; + } + + text = stripped; +} + +TWtringBuf StripRight(const TWtringBuf text) noexcept { + if (!text) { + return {}; + } + + const auto* const pe = text.data() - 1; + const auto* p = text.data() + text.size() - 1; + + for (; p != pe && IsWhitespace(*p); --p) { + } + + return {pe + 1, p + 1}; +} + +void StripRight(TUtf16String& text) { + const auto stripped = StripRight(TWtringBuf(text)); + if (stripped.size() == text.size()) { + return; + } + + text.resize(stripped.size()); +} + +TWtringBuf Strip(const TWtringBuf text) noexcept { + return StripRight(StripLeft(text)); +} + +void Strip(TUtf16String& text) { + StripLeft(text); + StripRight(text); +} + +template <typename T> +static bool IsReductionOnSymbolsTrue(const TWtringBuf text, T&& f) { + const auto* p = text.data(); + const auto* const pe = text.data() + text.length(); + while (p != pe) { + const auto symbol = ReadSymbolAndAdvance(p, pe); + if (!f(symbol)) { + return false; + } + } + + return true; +} + +bool IsLowerWord(const TWtringBuf text) noexcept { + return IsReductionOnSymbolsTrue(text, [](const wchar32 s) { return IsLower(s); }); +} + +bool IsUpperWord(const TWtringBuf text) noexcept { + return IsReductionOnSymbolsTrue(text, [](const wchar32 s) { return IsUpper(s); }); +} + +bool IsLower(const TWtringBuf text) noexcept { + return IsReductionOnSymbolsTrue(text, [](const wchar32 s) { + if (IsAlpha(s)) { + return IsLower(s); + } + return true; + }); +} + +bool IsUpper(const TWtringBuf text) noexcept { + return IsReductionOnSymbolsTrue(text, [](const wchar32 s) { + if (IsAlpha(s)) { + return IsUpper(s); + } + return true; + }); +} + +bool IsTitleWord(const TWtringBuf text) noexcept { + if (!text) { + return false; + } + + const auto* p = text.data(); + const auto* pe = text.data() + text.size(); + + const auto firstSymbol = ReadSymbolAndAdvance(p, pe); + if (firstSymbol != ToTitle(firstSymbol)) { + return false; + } + + return IsLowerWord({p, pe}); +} + +template <bool stopOnFirstModification, typename TCharType, typename F> +static bool ModifySequence(TCharType*& p, const TCharType* const pe, F&& f) { + while (p != pe) { + const auto symbol = ReadSymbol(p, pe); + const auto modified = f(symbol); + if (symbol != modified) { + if (stopOnFirstModification) { + return true; + } + + WriteSymbol(modified, p); // also moves `p` forward + } else { + p = SkipSymbol(p, pe); + } + } + + return false; +} + +template <bool stopOnFirstModification, typename TCharType, typename F> +static bool ModifySequence(const TCharType*& p, const TCharType* const pe, TCharType*& out, F&& f) { + while (p != pe) { + const auto symbol = stopOnFirstModification ? ReadSymbol(p, pe) : ReadSymbolAndAdvance(p, pe); + const auto modified = f(symbol); + + if (stopOnFirstModification) { + if (symbol != modified) { + return true; + } + + p = SkipSymbol(p, pe); + } + + WriteSymbol(modified, out); + } + + return false; +} + +template <class TStringType> +static void DetachAndFixPointers(TStringType& text, typename TStringType::value_type*& p, const typename TStringType::value_type*& pe) { + const auto pos = p - text.data(); + const auto count = pe - p; + p = text.Detach() + pos; + pe = p + count; +} + +template <class TStringType, typename F> +static bool ModifyStringSymbolwise(TStringType& text, size_t pos, size_t count, F&& f) { + // TODO(yazevnul): this is done for consistency with `TUtf16String::to_lower` and friends + // at r2914050, maybe worth replacing them with asserts. Also see the same code in `ToTitle`. + pos = pos < text.size() ? pos : text.size(); + count = count < text.size() - pos ? count : text.size() - pos; + + // TUtf16String is refcounted and it's `data` method return pointer to the constant memory. + // To simplify the code we do a `const_cast`, though first write to the memory will be done only + // after we call `Detach()` and get pointer to a writable piece of memory. + auto* p = const_cast<typename TStringType::value_type*>(text.data() + pos); + const auto* pe = text.data() + pos + count; + + if (ModifySequence<true>(p, pe, f)) { + DetachAndFixPointers(text, p, pe); + ModifySequence<false>(p, pe, f); + return true; + } + + return false; +} + +bool ToLower(TUtf16String& text, size_t pos, size_t count) { + const auto f = [](const wchar32 s) { return ToLower(s); }; + return ModifyStringSymbolwise(text, pos, count, f); +} + +bool ToUpper(TUtf16String& text, size_t pos, size_t count) { + const auto f = [](const wchar32 s) { return ToUpper(s); }; + return ModifyStringSymbolwise(text, pos, count, f); +} + +bool ToLower(TUtf32String& text, size_t pos, size_t count) { + const auto f = [](const wchar32 s) { return ToLower(s); }; + return ModifyStringSymbolwise(text, pos, count, f); +} + +bool ToUpper(TUtf32String& text, size_t pos, size_t count) { + const auto f = [](const wchar32 s) { return ToUpper(s); }; + return ModifyStringSymbolwise(text, pos, count, f); +} + +bool ToTitle(TUtf16String& text, size_t pos, size_t count) { + if (!text) { + return false; + } + + pos = pos < text.size() ? pos : text.size(); + count = count < text.size() - pos ? count : text.size() - pos; + + const auto toLower = [](const wchar32 s) { return ToLower(s); }; + + auto* p = const_cast<wchar16*>(text.data() + pos); + const auto* pe = text.data() + pos + count; + + const auto firstSymbol = ReadSymbol(p, pe); + if (firstSymbol == ToTitle(firstSymbol)) { + p = SkipSymbol(p, pe); + if (ModifySequence<true>(p, pe, toLower)) { + DetachAndFixPointers(text, p, pe); + ModifySequence<false>(p, pe, toLower); + return true; + } + } else { + DetachAndFixPointers(text, p, pe); + WriteSymbol(ToTitle(ReadSymbol(p, pe)), p); // also moves `p` forward + ModifySequence<false>(p, pe, toLower); + return true; + } + + return false; +} + +bool ToTitle(TUtf32String& text, size_t pos, size_t count) { + if (!text) { + return false; + } + + pos = pos < text.size() ? pos : text.size(); + count = count < text.size() - pos ? count : text.size() - pos; + + const auto toLower = [](const wchar32 s) { return ToLower(s); }; + + auto* p = const_cast<wchar32*>(text.data() + pos); + const auto* pe = text.data() + pos + count; + + const auto firstSymbol = *p; + if (firstSymbol == ToTitle(firstSymbol)) { + p += 1; + if (ModifySequence<true>(p, pe, toLower)) { + DetachAndFixPointers(text, p, pe); + ModifySequence<false>(p, pe, toLower); + return true; + } + } else { + DetachAndFixPointers(text, p, pe); + WriteSymbol(ToTitle(ReadSymbol(p, pe)), p); // also moves `p` forward + ModifySequence<false>(p, pe, toLower); + return true; + } + + return false; +} + +TUtf16String ToLowerRet(TUtf16String text, size_t pos, size_t count) { + ToLower(text, pos, count); + return text; +} + +TUtf16String ToUpperRet(TUtf16String text, size_t pos, size_t count) { + ToUpper(text, pos, count); + return text; +} + +TUtf16String ToTitleRet(TUtf16String text, size_t pos, size_t count) { + ToTitle(text, pos, count); + return text; +} + +TUtf32String ToLowerRet(TUtf32String text, size_t pos, size_t count) { + ToLower(text, pos, count); + return text; +} + +TUtf32String ToUpperRet(TUtf32String text, size_t pos, size_t count) { + ToUpper(text, pos, count); + return text; +} + +TUtf32String ToTitleRet(TUtf32String text, size_t pos, size_t count) { + ToTitle(text, pos, count); + return text; +} + +bool ToLower(const wchar16* text, size_t length, wchar16* out) noexcept { + // TODO(yazevnul): get rid of `text == out` case (it is probably used only in lemmer) and then + // we can declare text and out as `__restrict__` + Y_ASSERT(text == out || !(out >= text && out < text + length)); + const auto f = [](const wchar32 s) { return ToLower(s); }; + const auto* p = text; + const auto* const pe = text + length; + if (ModifySequence<true>(p, pe, out, f)) { + ModifySequence<false>(p, pe, out, f); + return true; + } + return false; +} + +bool ToUpper(const wchar16* text, size_t length, wchar16* out) noexcept { + Y_ASSERT(text == out || !(out >= text && out < text + length)); + const auto f = [](const wchar32 s) { return ToUpper(s); }; + const auto* p = text; + const auto* const pe = text + length; + if (ModifySequence<true>(p, pe, out, f)) { + ModifySequence<false>(p, pe, out, f); + return true; + } + return false; +} + +bool ToTitle(const wchar16* text, size_t length, wchar16* out) noexcept { + if (!length) { + return false; + } + + Y_ASSERT(text == out || !(out >= text && out < text + length)); + + const auto* const textEnd = text + length; + const auto firstSymbol = ReadSymbolAndAdvance(text, textEnd); + const auto firstSymbolTitle = ToTitle(firstSymbol); + + WriteSymbol(firstSymbolTitle, out); + + return ToLower(text, textEnd - text, out) || firstSymbol != firstSymbolTitle; +} + +bool ToLower(wchar16* text, size_t length) noexcept { + const auto f = [](const wchar32 s) { return ToLower(s); }; + const auto* const textEnd = text + length; + if (ModifySequence<true>(text, textEnd, f)) { + ModifySequence<false>(text, textEnd, f); + return true; + } + return false; +} + +bool ToUpper(wchar16* text, size_t length) noexcept { + const auto f = [](const wchar32 s) { return ToUpper(s); }; + const auto* const textEnd = text + length; + if (ModifySequence<true>(text, textEnd, f)) { + ModifySequence<false>(text, textEnd, f); + return true; + } + return false; +} + +bool ToTitle(wchar16* text, size_t length) noexcept { + if (!length) { + return false; + } + + const auto* textEnd = text + length; + const auto firstSymbol = ReadSymbol(text, textEnd); + const auto firstSymbolTitle = ToTitle(firstSymbol); + + // avoid unnacessary writes to the memory + if (firstSymbol != firstSymbolTitle) { + WriteSymbol(firstSymbolTitle, text); + } else { + text = SkipSymbol(text, textEnd); + } + + return ToLower(text, textEnd - text) || firstSymbol != firstSymbolTitle; +} + +bool ToLower(const wchar32* text, size_t length, wchar32* out) noexcept { + // TODO(yazevnul): get rid of `text == out` case (it is probably used only in lemmer) and then + // we can declare text and out as `__restrict__` + Y_ASSERT(text == out || !(out >= text && out < text + length)); + const auto f = [](const wchar32 s) { return ToLower(s); }; + const auto* p = text; + const auto* const pe = text + length; + if (ModifySequence<true>(p, pe, out, f)) { + ModifySequence<false>(p, pe, out, f); + return true; + } + return false; +} + +bool ToUpper(const wchar32* text, size_t length, wchar32* out) noexcept { + Y_ASSERT(text == out || !(out >= text && out < text + length)); + const auto f = [](const wchar32 s) { return ToUpper(s); }; + const auto* p = text; + const auto* const pe = text + length; + if (ModifySequence<true>(p, pe, out, f)) { + ModifySequence<false>(p, pe, out, f); + return true; + } + return false; +} + +bool ToTitle(const wchar32* text, size_t length, wchar32* out) noexcept { + if (!length) { + return false; + } + + Y_ASSERT(text == out || !(out >= text && out < text + length)); + + const auto* const textEnd = text + length; + const auto firstSymbol = ReadSymbolAndAdvance(text, textEnd); + const auto firstSymbolTitle = ToTitle(firstSymbol); + + WriteSymbol(firstSymbolTitle, out); + + return ToLower(text, textEnd - text, out) || firstSymbol != firstSymbolTitle; +} + +bool ToLower(wchar32* text, size_t length) noexcept { + const auto f = [](const wchar32 s) { return ToLower(s); }; + const auto* const textEnd = text + length; + if (ModifySequence<true>(text, textEnd, f)) { + ModifySequence<false>(text, textEnd, f); + return true; + } + return false; +} + +bool ToUpper(wchar32* text, size_t length) noexcept { + const auto f = [](const wchar32 s) { return ToUpper(s); }; + const auto* const textEnd = text + length; + if (ModifySequence<true>(text, textEnd, f)) { + ModifySequence<false>(text, textEnd, f); + return true; + } + return false; +} + +bool ToTitle(wchar32* text, size_t length) noexcept { + if (!length) { + return false; + } + + const auto* textEnd = text + length; + const auto firstSymbol = ReadSymbol(text, textEnd); + const auto firstSymbolTitle = ToTitle(firstSymbol); + + // avoid unnacessary writes to the memory + if (firstSymbol != firstSymbolTitle) { + WriteSymbol(firstSymbolTitle, text); + } else { + text = SkipSymbol(text, textEnd); + } + + return ToLower(text, textEnd - text) || firstSymbol != firstSymbolTitle; +} + +template <typename F> +static TUtf16String ToSmthRet(const TWtringBuf text, size_t pos, size_t count, F&& f) { + pos = pos < text.size() ? pos : text.size(); + count = count < text.size() - pos ? count : text.size() - pos; + + auto res = TUtf16String::Uninitialized(text.size()); + auto* const resBegin = res.Detach(); + + if (pos) { + MemCopy(resBegin, text.data(), pos); + } + + f(text.data() + pos, count, resBegin + pos); + + if (count - pos != text.size()) { + MemCopy(resBegin + pos + count, text.data() + pos + count, text.size() - pos - count); + } + + return res; +} + +template <typename F> +static TUtf32String ToSmthRet(const TUtf32StringBuf text, size_t pos, size_t count, F&& f) { + pos = pos < text.size() ? pos : text.size(); + count = count < text.size() - pos ? count : text.size() - pos; + + auto res = TUtf32String::Uninitialized(text.size()); + auto* const resBegin = res.Detach(); + + if (pos) { + MemCopy(resBegin, text.data(), pos); + } + + f(text.data() + pos, count, resBegin + pos); + + if (count - pos != text.size()) { + MemCopy(resBegin + pos + count, text.data() + pos + count, text.size() - pos - count); + } + + return res; +} + +TUtf16String ToLowerRet(const TWtringBuf text, size_t pos, size_t count) { + return ToSmthRet(text, pos, count, [](const wchar16* theText, size_t length, wchar16* out) { + ToLower(theText, length, out); + }); +} + +TUtf16String ToUpperRet(const TWtringBuf text, size_t pos, size_t count) { + return ToSmthRet(text, pos, count, [](const wchar16* theText, size_t length, wchar16* out) { + ToUpper(theText, length, out); + }); +} + +TUtf16String ToTitleRet(const TWtringBuf text, size_t pos, size_t count) { + return ToSmthRet(text, pos, count, [](const wchar16* theText, size_t length, wchar16* out) { + ToTitle(theText, length, out); + }); +} + +TUtf32String ToLowerRet(const TUtf32StringBuf text, size_t pos, size_t count) { + return ToSmthRet(text, pos, count, [](const wchar32* theText, size_t length, wchar32* out) { + ToLower(theText, length, out); + }); +} + +TUtf32String ToUpperRet(const TUtf32StringBuf text, size_t pos, size_t count) { + return ToSmthRet(text, pos, count, [](const wchar32* theText, size_t length, wchar32* out) { + ToUpper(theText, length, out); + }); +} + +TUtf32String ToTitleRet(const TUtf32StringBuf text, size_t pos, size_t count) { + return ToSmthRet(text, pos, count, [](const wchar32* theText, size_t length, wchar32* out) { + ToTitle(theText, length, out); + }); +} + +template <bool insertBr> +void EscapeHtmlChars(TUtf16String& str) { + static const TUtf16String lt(LT, Y_ARRAY_SIZE(LT)); + static const TUtf16String gt(GT, Y_ARRAY_SIZE(GT)); + static const TUtf16String amp(AMP, Y_ARRAY_SIZE(AMP)); + static const TUtf16String br(BR, Y_ARRAY_SIZE(BR)); + static const TUtf16String quot(QUOT, Y_ARRAY_SIZE(QUOT)); + + size_t escapedLen = 0; + + const TUtf16String& cs = str; + + for (size_t i = 0; i < cs.size(); ++i) + escapedLen += EscapedLen<insertBr>(cs[i]); + + if (escapedLen == cs.size()) + return; + + TUtf16String res; + res.reserve(escapedLen); + + size_t start = 0; + + for (size_t i = 0; i < cs.size(); ++i) { + const TUtf16String* ent = nullptr; + switch (cs[i]) { + case '<': + ent = < + break; + case '>': + ent = > + break; + case '&': + ent = & + break; + case '\"': + ent = " + break; + default: + if (insertBr && (cs[i] == '\r' || cs[i] == '\n')) { + ent = &br; + break; + } else + continue; + } + + res.append(cs.begin() + start, cs.begin() + i); + res.append(ent->begin(), ent->end()); + start = i + 1; + } + + res.append(cs.begin() + start, cs.end()); + res.swap(str); +} + +template void EscapeHtmlChars<false>(TUtf16String& str); +template void EscapeHtmlChars<true>(TUtf16String& str); diff --git a/util/charset/wide.h b/util/charset/wide.h new file mode 100644 index 0000000000..04e6928aab --- /dev/null +++ b/util/charset/wide.h @@ -0,0 +1,843 @@ +#pragma once + +#include "recode_result.h" +#include "unidata.h" +#include "utf8.h" +#include "wide_specific.h" + +#include <util/generic/algorithm.h> +#include <util/generic/string.h> +#include <util/generic/yexception.h> +#include <util/memory/tempbuf.h> +#include <util/system/compiler.h> +#include <util/system/cpu_id.h> +#include <util/system/yassert.h> + +#include <cstring> + +#ifdef _sse2_ + #include <emmintrin.h> +#endif + +template <class T> +class TTempArray; +using TCharTemp = TTempArray<wchar16>; + +namespace NDetail { + inline TString InStringMsg(const char* s, size_t len) { + return (len <= 50) ? " in string " + TString(s, len).Quote() : TString(); + } + + template <bool isPointer> + struct TSelector; + + template <> + struct TSelector<false> { + template <class T> + static inline void WriteSymbol(wchar16 s, T& dest) noexcept { + dest.push_back(s); + } + }; + + template <> + struct TSelector<true> { + template <class T> + static inline void WriteSymbol(wchar16 s, T& dest) noexcept { + *(dest++) = s; + } + }; + + inline wchar32 ReadSurrogatePair(const wchar16* chars) noexcept { + const wchar32 SURROGATE_OFFSET = static_cast<wchar32>(0x10000 - (0xD800 << 10) - 0xDC00); + wchar16 lead = chars[0]; + wchar16 tail = chars[1]; + + Y_ASSERT(IsW16SurrogateLead(lead)); + Y_ASSERT(IsW16SurrogateTail(tail)); + + return (static_cast<wchar32>(lead) << 10) + tail + SURROGATE_OFFSET; + } + + template <class T> + inline void WriteSurrogatePair(wchar32 s, T& dest) noexcept; + +} + +inline wchar16* SkipSymbol(wchar16* begin, const wchar16* end) noexcept { + return begin + W16SymbolSize(begin, end); +} +inline const wchar16* SkipSymbol(const wchar16* begin, const wchar16* end) noexcept { + return begin + W16SymbolSize(begin, end); +} +inline wchar32* SkipSymbol(wchar32* begin, const wchar32* end) noexcept { + Y_ASSERT(begin < end); + return begin + 1; +} +inline const wchar32* SkipSymbol(const wchar32* begin, const wchar32* end) noexcept { + Y_ASSERT(begin < end); + return begin + 1; +} + +inline wchar32 ReadSymbol(const wchar16* begin, const wchar16* end) noexcept { + Y_ASSERT(begin < end); + if (IsW16SurrogateLead(*begin)) { + if (begin + 1 < end && IsW16SurrogateTail(*(begin + 1))) + return ::NDetail::ReadSurrogatePair(begin); + + return BROKEN_RUNE; + } else if (IsW16SurrogateTail(*begin)) { + return BROKEN_RUNE; + } + + return *begin; +} + +inline wchar32 ReadSymbol(const wchar32* begin, const wchar32* end) noexcept { + Y_ASSERT(begin < end); + return *begin; +} + +//! presuming input data is either big enought of null terminated +inline wchar32 ReadSymbolAndAdvance(const wchar16*& begin) noexcept { + Y_ASSERT(*begin); + if (IsW16SurrogateLead(begin[0])) { + if (IsW16SurrogateTail(begin[1])) { + Y_ASSERT(begin[1] != 0); + const wchar32 c = ::NDetail::ReadSurrogatePair(begin); + begin += 2; + return c; + } + ++begin; + return BROKEN_RUNE; + } else if (IsW16SurrogateTail(begin[0])) { + ++begin; + return BROKEN_RUNE; + } + return *(begin++); +} + +//! presuming input data is either big enought of null terminated +inline wchar32 ReadSymbolAndAdvance(const wchar32*& begin) noexcept { + Y_ASSERT(*begin); + return *(begin++); +} + +inline wchar32 ReadSymbolAndAdvance(const wchar16*& begin, const wchar16* end) noexcept { + Y_ASSERT(begin < end); + if (IsW16SurrogateLead(begin[0])) { + if (begin + 1 != end && IsW16SurrogateTail(begin[1])) { + const wchar32 c = ::NDetail::ReadSurrogatePair(begin); + begin += 2; + return c; + } + ++begin; + return BROKEN_RUNE; + } else if (IsW16SurrogateTail(begin[0])) { + ++begin; + return BROKEN_RUNE; + } + return *(begin++); +} + +inline wchar32 ReadSymbolAndAdvance(const wchar32*& begin, const wchar32* end) noexcept { + Y_ASSERT(begin < end); + return *(begin++); +} + +template <class T> +inline size_t WriteSymbol(wchar16 s, T& dest) noexcept { + ::NDetail::TSelector<std::is_pointer<T>::value>::WriteSymbol(s, dest); + return 1; +} + +template <class T> +inline size_t WriteSymbol(wchar32 s, T& dest) noexcept { + if (s > 0xFFFF) { + if (s >= ::NUnicode::UnicodeInstancesLimit()) { + return WriteSymbol(static_cast<wchar16>(BROKEN_RUNE), dest); + } + + ::NDetail::WriteSurrogatePair(s, dest); + return 2; + } + + return WriteSymbol(static_cast<wchar16>(s), dest); +} + +inline bool WriteSymbol(wchar32 s, wchar16*& dest, const wchar16* destEnd) noexcept { + Y_ASSERT(dest < destEnd); + + if (s > 0xFFFF) { + if (s >= NUnicode::UnicodeInstancesLimit()) { + *(dest++) = static_cast<wchar16>(BROKEN_RUNE); + return true; + } + + if (dest + 2 > destEnd) + return false; + + ::NDetail::WriteSurrogatePair(s, dest); + } else { + *(dest++) = static_cast<wchar16>(s); + } + + return true; +} + +inline size_t WriteSymbol(wchar32 s, wchar32*& dest) noexcept { + *(dest++) = s; + return 1; +} + +inline bool WriteSymbol(wchar32 s, wchar32*& dest, const wchar32* destEnd) noexcept { + Y_ASSERT(dest < destEnd); + + *(dest++) = s; + + return true; +} + +template <class T> +inline void ::NDetail::WriteSurrogatePair(wchar32 s, T& dest) noexcept { + const wchar32 LEAD_OFFSET = 0xD800 - (0x10000 >> 10); + Y_ASSERT(s > 0xFFFF && s < ::NUnicode::UnicodeInstancesLimit()); + + wchar16 lead = LEAD_OFFSET + (static_cast<wchar16>(s >> 10)); + wchar16 tail = 0xDC00 + static_cast<wchar16>(s & 0x3FF); + Y_ASSERT(IsW16SurrogateLead(lead)); + Y_ASSERT(IsW16SurrogateTail(tail)); + + WriteSymbol(lead, dest); + WriteSymbol(tail, dest); +} + +class TCharIterator { +private: + const wchar16* Begin; + const wchar16* End; + +public: + inline explicit TCharIterator(const wchar16* end) + : Begin(end) + , End(end) + { + } + + inline TCharIterator(const wchar16* begin, const wchar16* end) + : Begin(begin) + , End(end) + { + } + + inline TCharIterator& operator++() { + Begin = SkipSymbol(Begin, End); + + return *this; + } + + inline bool operator==(const wchar16* other) const { + return Begin == other; + } + inline bool operator!=(const wchar16* other) const { + return !(*this == other); + } + + inline bool operator==(const TCharIterator& other) const { + return *this == other.Begin; + } + inline bool operator!=(const TCharIterator& other) const { + return *this != other.Begin; + } + + inline wchar32 operator*() const { + return ReadSymbol(Begin, End); + } + + inline const wchar16* Get() const { + return Begin; + } +}; + +namespace NDetail { + template <bool robust, typename TCharType> + inline void UTF8ToWideImplScalar(const unsigned char*& cur, const unsigned char* last, TCharType*& dest) noexcept { + wchar32 rune = BROKEN_RUNE; + + while (cur != last) { + if (ReadUTF8CharAndAdvance(rune, cur, last) != RECODE_OK) { + if (robust) { + rune = BROKEN_RUNE; + ++cur; + } else { + break; + } + } + + Y_ASSERT(cur <= last); + WriteSymbol(rune, dest); + } + } + + template <typename TCharType> + inline void UTF16ToUTF32ImplScalar(const wchar16* cur, const wchar16* last, TCharType*& dest) noexcept { + wchar32 rune = BROKEN_RUNE; + + while (cur != last) { + rune = ReadSymbolAndAdvance(cur, last); + Y_ASSERT(cur <= last); + WriteSymbol(rune, dest); + } + } + + template <class TCharType> + inline void UTF8ToWideImplSSE41(const unsigned char*& /*cur*/, const unsigned char* /*last*/, TCharType*& /*dest*/) noexcept { + } + + void UTF8ToWideImplSSE41(const unsigned char*& cur, const unsigned char* last, wchar16*& dest) noexcept; + + void UTF8ToWideImplSSE41(const unsigned char*& cur, const unsigned char* last, wchar32*& dest) noexcept; +} + +//! @return len if robust and position where encoding stopped if not +template <bool robust, typename TCharType> +inline size_t UTF8ToWideImpl(const char* text, size_t len, TCharType* dest, size_t& written) noexcept { + const unsigned char* cur = reinterpret_cast<const unsigned char*>(text); + const unsigned char* last = cur + len; + TCharType* p = dest; +#ifdef _sse_ //can't check for sse4, as we build most of arcadia without sse4 support even on platforms that support it + if (cur + 16 <= last && NX86::CachedHaveSSE41()) { + ::NDetail::UTF8ToWideImplSSE41(cur, last, p); + } +#endif + + ::NDetail::UTF8ToWideImplScalar<robust>(cur, last, p); + written = p - dest; + return cur - reinterpret_cast<const unsigned char*>(text); +} + +template <typename TCharType> +inline size_t UTF8ToWideImpl(const char* text, size_t len, TCharType* dest, size_t& written) { + return UTF8ToWideImpl<false>(text, len, dest, written); +} + +template <bool robust> +inline TUtf16String UTF8ToWide(const char* text, size_t len) { + TUtf16String w = TUtf16String::Uninitialized(len); + size_t written; + size_t pos = UTF8ToWideImpl<robust>(text, len, w.begin(), written); + if (pos != len) + ythrow yexception() << "failed to decode UTF-8 string at pos " << pos << ::NDetail::InStringMsg(text, len); + Y_ASSERT(w.size() >= written); + w.remove(written); + return w; +} + +template <bool robust, typename TCharType> +inline bool UTF8ToWide(const char* text, size_t len, TCharType* dest, size_t& written) noexcept { + return UTF8ToWideImpl<robust>(text, len, dest, written) == len; +} + +//! converts text from UTF8 to unicode, stops immediately it UTF8 byte sequence is wrong +//! @attention destination buffer must be long enough to fit all characters of the text, +//! conversion stops if a broken symbol is met +//! @return @c true if all the text converted successfully, @c false - a broken symbol was found +template <typename TCharType> +inline bool UTF8ToWide(const char* text, size_t len, TCharType* dest, size_t& written) noexcept { + return UTF8ToWide<false>(text, len, dest, written); +} + +template <bool robust> +inline TWtringBuf UTF8ToWide(const TStringBuf src, TUtf16String& dst) { + dst.ReserveAndResize(src.size()); + size_t written = 0; + UTF8ToWideImpl<robust>(src.data(), src.size(), dst.begin(), written); + dst.resize(written); + return dst; +} + +//! if not robust will stop at first error position +template <bool robust> +inline TUtf32StringBuf UTF8ToUTF32(const TStringBuf src, TUtf32String& dst) { + dst.ReserveAndResize(src.size()); + size_t written = 0; + UTF8ToWideImpl<robust>(src.data(), src.size(), dst.begin(), written); + dst.resize(written); + return dst; +} + +inline TWtringBuf UTF8ToWide(const TStringBuf src, TUtf16String& dst) { + return UTF8ToWide<false>(src, dst); +} + +inline TUtf16String UTF8ToWide(const char* text, size_t len) { + return UTF8ToWide<false>(text, len); +} + +template <bool robust> +inline TUtf16String UTF8ToWide(const TStringBuf s) { + return UTF8ToWide<robust>(s.data(), s.size()); +} + +template <bool robust> +inline TUtf32String UTF8ToUTF32(const TStringBuf s) { + TUtf32String r; + UTF8ToUTF32<robust>(s, r); + return r; +} + +inline TUtf16String UTF8ToWide(const TStringBuf s) { + return UTF8ToWide<false>(s.data(), s.size()); +} + +//! converts text from unicode to UTF8 +//! @attention destination buffer must be long enough to fit all characters of the text, +//! @c WriteUTF8Char converts @c wchar32 into maximum 4 bytes of UTF8 so +//! destination buffer must have length equal to <tt> len * 4 </tt> +template <typename TCharType> +inline void WideToUTF8(const TCharType* text, size_t len, char* dest, size_t& written) { + const TCharType* const last = text + len; + unsigned char* p = reinterpret_cast<unsigned char*>(dest); + size_t runeLen; + for (const TCharType* cur = text; cur != last;) { + WriteUTF8Char(ReadSymbolAndAdvance(cur, last), runeLen, p); + Y_ASSERT(runeLen <= 4); + p += runeLen; + } + written = p - reinterpret_cast<unsigned char*>(dest); +} + +constexpr size_t WideToUTF8BufferSize(const size_t inputStringSize) noexcept { + return inputStringSize * 4; // * 4 because the conversion functions can convert unicode character into maximum 4 bytes of UTF8 +} + +inline TStringBuf WideToUTF8(const TWtringBuf src, TString& dst) { + dst.ReserveAndResize(WideToUTF8BufferSize(src.size())); + size_t written = 0; + WideToUTF8(src.data(), src.size(), dst.begin(), written); + Y_ASSERT(dst.size() >= written); + dst.remove(written); + return dst; +} + +inline TString WideToUTF8(const wchar16* text, size_t len) { + TString s = TString::Uninitialized(WideToUTF8BufferSize(len)); + size_t written = 0; + WideToUTF8(text, len, s.begin(), written); + Y_ASSERT(s.size() >= written); + s.remove(written); + return s; +} + +inline TString WideToUTF8(const wchar32* text, size_t len) { + TString s = TString::Uninitialized(WideToUTF8BufferSize(len)); + size_t written = 0; + WideToUTF8(text, len, s.begin(), written); + Y_ASSERT(s.size() >= written); + s.remove(written); + return s; +} + +inline TString WideToUTF8(const TWtringBuf w) { + return WideToUTF8(w.data(), w.size()); +} + +inline TString WideToUTF8(const TUtf32StringBuf w) { + return WideToUTF8(w.data(), w.size()); +} + +inline TUtf16String UTF32ToWide(const wchar32* begin, size_t len) { + TUtf16String res; + res.reserve(len); + + const wchar32* end = begin + len; + for (const wchar32* i = begin; i != end; ++i) { + WriteSymbol(*i, res); + } + + return res; +} + +// adopted from https://chromium.googlesource.com/chromium/src/+/master/base/strings/string_util.cc +// Assuming that a pointer is the size of a "machine word", then +// uintptr_t is an integer type that is also a machine word. + +namespace NDetail { + using TMachineWord = uintptr_t; + const uintptr_t kMachineWordAlignmentMask = sizeof(TMachineWord) - 1; + + inline bool IsAlignedToMachineWord(const void* pointer) { + return !(reinterpret_cast<TMachineWord>(pointer) & kMachineWordAlignmentMask); + } + + template <typename T> + inline T* AlignToMachineWord(T* pointer) { + return reinterpret_cast<T*>(reinterpret_cast<TMachineWord>(pointer) & ~kMachineWordAlignmentMask); + } + + template <size_t size, typename CharacterType> + struct NonASCIIMask; + + template <> + struct + NonASCIIMask<4, wchar16> { + static constexpr ui32 Value() { + return 0xFF80FF80U; + } + }; + + template <> + struct + NonASCIIMask<4, char> { + static constexpr ui32 Value() { + return 0x80808080U; + } + }; + + template <> + struct + NonASCIIMask<8, wchar16> { + static constexpr ui64 Value() { + return 0xFF80FF80FF80FF80ULL; + } + }; + + template <> + struct + NonASCIIMask<8, char> { + static constexpr ui64 Value() { + return 0x8080808080808080ULL; + } + }; + + template <typename TChar> + inline bool DoIsStringASCIISlow(const TChar* first, const TChar* last) { + using TUnsignedChar = std::make_unsigned_t<TChar>; + Y_ASSERT(first <= last); + for (; first != last; ++first) { + if (static_cast<TUnsignedChar>(*first) > 0x7F) { + return false; + } + } + return true; + } + + template <typename TChar> + inline bool DoIsStringASCII(const TChar* first, const TChar* last) { + if (last - first < 10) { + return DoIsStringASCIISlow(first, last); + } + TMachineWord allCharBits = 0; + TMachineWord nonAsciiBitMask = NonASCIIMask<sizeof(TMachineWord), TChar>::Value(); + + // Prologue: align the input. + while (!IsAlignedToMachineWord(first) && first != last) { + allCharBits |= *first; + ++first; + } + + // Compare the values of CPU word size. + const TChar* word_end = AlignToMachineWord(last); + const size_t loopIncrement = sizeof(TMachineWord) / sizeof(TChar); + while (first < word_end) { + allCharBits |= *(reinterpret_cast<const TMachineWord*>(first)); + first += loopIncrement; + + // fast exit + if (allCharBits & nonAsciiBitMask) { + return false; + } + } + + // Process the remaining bytes. + while (first != last) { + allCharBits |= *first; + ++first; + } + + return !(allCharBits & nonAsciiBitMask); + } + +#ifdef _sse2_ + inline bool DoIsStringASCIISSE(const unsigned char* first, const unsigned char* last) { + //scalar version for short strings + if (first + 8 > last) { + return ::NDetail::DoIsStringASCIISlow(first, last); + } + + alignas(16) unsigned char buf[16]; + + while (first + 16 <= last) { + memcpy(buf, first, 16); + __m128i chunk = _mm_load_si128(reinterpret_cast<__m128i*>(buf)); + + int asciiMask = _mm_movemask_epi8(chunk); + if (asciiMask) { + return false; + } + first += 16; + } + + if (first + 8 <= last) { + memcpy(buf, first, 8); + __m128i chunk = _mm_loadl_epi64(reinterpret_cast<__m128i*>(buf)); + + int asciiMask = _mm_movemask_epi8(chunk); + if (asciiMask) { + return false; + } + first += 8; + } + + return ::NDetail::DoIsStringASCIISlow(first, last); + } +#endif //_sse2_ + +} + +//! returns @c true if character sequence has no symbols with value greater than 0x7F +template <typename TChar> +inline bool IsStringASCII(const TChar* first, const TChar* last) { + return ::NDetail::DoIsStringASCII(first, last); +} + +#ifdef _sse2_ +template <> +inline bool IsStringASCII<unsigned char>(const unsigned char* first, const unsigned char* last) { + return ::NDetail::DoIsStringASCIISSE(first, last); +} +template <> +inline bool IsStringASCII<char>(const char* first, const char* last) { + return ::NDetail::DoIsStringASCIISSE(reinterpret_cast<const unsigned char*>(first), reinterpret_cast<const unsigned char*>(last)); +} +#endif + +//! copies elements from one character sequence to another using memcpy +//! for compatibility only +template <typename TChar> +inline void Copy(const TChar* first, size_t len, TChar* result) { + memcpy(result, first, len * sizeof(TChar)); +} + +template <typename TChar1, typename TChar2> +inline void Copy(const TChar1* first, size_t len, TChar2* result) { + Copy(first, first + len, result); +} + +//! copies symbols from one character sequence to another without any conversion +//! @note this function can be used instead of the template constructor of @c std::basic_string: +//! template <typename InputIterator> +//! basic_string(InputIterator begin, InputIterator end, const Allocator& a = Allocator()); +//! and the family of template member functions: append, assign, insert, replace. +template <typename TStringType, typename TChar> +inline TStringType CopyTo(const TChar* first, const TChar* last) { + Y_ASSERT(first <= last); + TStringType str = TStringType::Uninitialized(last - first); + Copy(first, last, str.begin()); + return str; +} + +template <typename TStringType, typename TChar> +inline TStringType CopyTo(const TChar* s, size_t n) { + TStringType str = TStringType::Uninitialized(n); + Copy(s, n, str.begin()); + return str; +} + +inline TString WideToASCII(const TWtringBuf w) { + Y_ASSERT(IsStringASCII(w.begin(), w.end())); + return CopyTo<TString>(w.begin(), w.end()); +} + +inline TUtf16String ASCIIToWide(const TStringBuf s) { + Y_ASSERT(IsStringASCII(s.begin(), s.end())); + return CopyTo<TUtf16String>(s.begin(), s.end()); +} + +inline TUtf32String ASCIIToUTF32(const TStringBuf s) { + Y_ASSERT(IsStringASCII(s.begin(), s.end())); + return CopyTo<TUtf32String>(s.begin(), s.end()); +} + +//! returns @c true if string contains whitespace characters only +inline bool IsSpace(const wchar16* s, size_t n) { + if (n == 0) + return false; + + Y_ASSERT(s); + + const wchar16* const e = s + n; + for (const wchar16* p = s; p != e; ++p) { + if (!IsWhitespace(*p)) + return false; + } + return true; +} + +//! returns @c true if string contains whitespace characters only +inline bool IsSpace(const TWtringBuf s) { + return IsSpace(s.data(), s.length()); +} + +//! replaces multiple sequential whitespace characters with a single space character +void Collapse(TUtf16String& w); + +//! @return new length +size_t Collapse(wchar16* s, size_t n); + +//! Removes leading whitespace characters +TWtringBuf StripLeft(const TWtringBuf text) noexcept Y_WARN_UNUSED_RESULT; +void StripLeft(TUtf16String& text); + +//! Removes trailing whitespace characters +TWtringBuf StripRight(const TWtringBuf text) noexcept Y_WARN_UNUSED_RESULT; +void StripRight(TUtf16String& text); + +//! Removes leading and trailing whitespace characters +TWtringBuf Strip(const TWtringBuf text) noexcept Y_WARN_UNUSED_RESULT; +void Strip(TUtf16String& text); + +/* Check if given word is lowercase/uppercase. Will return false if string contains any + * non-alphabetical symbols. It is expected that `text` is a correct UTF-16 string. + * + * For example `IsLowerWord("hello")` will return `true`, when `IsLowerWord("hello there")` will + * return false because of the space in the middle of the string. Empty string is also considered + * lowercase. + */ +bool IsLowerWord(const TWtringBuf text) noexcept; +bool IsUpperWord(const TWtringBuf text) noexcept; + +/* Will check if given word starts with capital letter and the rest of the word is lowercase. Will + * return `false` for empty string. See also `IsLowerWord`. + */ +bool IsTitleWord(const TWtringBuf text) noexcept; + +/* Check if given string is lowercase/uppercase. Will return `true` if all alphabetic symbols are + * in proper case, all other symbols are ignored. It is expected that `text` is a correct UTF-16 + * string. + * + * For example `IsLowerWord("hello")` will return `true` and `IsLowerWord("hello there")` will + * also return true because. Empty string is also considered lowercase. + * + * NOTE: for any case where `IsLowerWord` returns `true` `IsLower` will also return `true`. + */ +bool IsLower(const TWtringBuf text) noexcept; +bool IsUpper(const TWtringBuf text) noexcept; + +/* Lowercase/uppercase given string inplace. Any alphabetic symbol will be converted to a proper + * case, the rest of the symbols will be kept the same. It is expected that `text` is a correct + * UTF-16 string. + * + * For example `ToLower("heLLo")` will return `"hello"`. + * + * @param text String to modify + * @param pos Position of the first character to modify + * @param count Length of the substring + * @returns `true` if `text` was changed + * + * NOTE: `pos` and `count` are measured in `wchar16`, not in codepoints. + */ +bool ToLower(TUtf16String& text, size_t pos = 0, size_t count = TUtf16String::npos); +bool ToUpper(TUtf16String& text, size_t pos = 0, size_t count = TUtf16String::npos); + +/* Lowercase/uppercase given string inplace. Any alphabetic symbol will be converted to a proper +* case, the rest of the symbols will be kept the same. It is expected that `text` is a correct +* UTF-32 string. +* +* For example `ToLower("heLLo")` will return `"hello"`. +* +* @param text String to modify +* @param pos Position of the first character to modify +* @param count Length of the substring +* @returns `true` if `text` was changed +* +* NOTE: `pos` and `count` are measured in `wchar16`, not in codepoints. +*/ +bool ToLower(TUtf32String& /*text*/, size_t /*pos*/ = 0, size_t /*count*/ = TUtf16String::npos); +bool ToUpper(TUtf32String& /*text*/, size_t /*pos*/ = 0, size_t /*count*/ = TUtf16String::npos); + +/* Titlecase first symbol and lowercase the rest, see `ToLower` for more details. + */ +bool ToTitle(TUtf16String& text, size_t pos = 0, size_t count = TUtf16String::npos); + +/* Titlecase first symbol and lowercase the rest, see `ToLower` for more details. +*/ +bool ToTitle(TUtf32String& /*text*/, size_t /*pos*/ = 0, size_t /*count*/ = TUtf16String::npos); + +/* @param text Pointer to the string to modify + * @param length Length of the string to modify + * @param out Pointer to the character array to write to + * + * NOTE: [text, text+length) and [out, out+length) should not interleave. + * + * TODO(yazevnul): replace these functions with `bool(const TWtringBuf, const TArrayRef<wchar16>)` + * overload. + */ +bool ToLower(const wchar16* text, size_t length, wchar16* out) noexcept; +bool ToUpper(const wchar16* text, size_t length, wchar16* out) noexcept; +bool ToTitle(const wchar16* text, size_t length, wchar16* out) noexcept; + +bool ToLower(const wchar32* text, size_t length, wchar32* out) noexcept; +bool ToUpper(const wchar32* text, size_t length, wchar32* out) noexcept; +bool ToTitle(const wchar32* text, size_t length, wchar32* out) noexcept; + +/* @param text Pointer to the string to modify + * @param length Length of the string to modify + * + * TODO(yazevnul): replace these functions with `bool(const TArrayRef<wchar16>)` overload. + */ +bool ToLower(wchar16* text, size_t length) noexcept; +bool ToUpper(wchar16* text, size_t length) noexcept; +bool ToTitle(wchar16* text, size_t length) noexcept; + +bool ToLower(wchar32* text, size_t length) noexcept; +bool ToUpper(wchar32* text, size_t length) noexcept; +bool ToTitle(wchar32* text, size_t length) noexcept; + +/* Convenience wrappers for `ToLower`, `ToUpper` and `ToTitle`. + */ +TUtf16String ToLowerRet(TUtf16String text, size_t pos = 0, size_t count = TUtf16String::npos) Y_WARN_UNUSED_RESULT; +TUtf16String ToUpperRet(TUtf16String text, size_t pos = 0, size_t count = TUtf16String::npos) Y_WARN_UNUSED_RESULT; +TUtf16String ToTitleRet(TUtf16String text, size_t pos = 0, size_t count = TUtf16String::npos) Y_WARN_UNUSED_RESULT; + +TUtf16String ToLowerRet(const TWtringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT; +TUtf16String ToUpperRet(const TWtringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT; +TUtf16String ToTitleRet(const TWtringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT; + +TUtf32String ToLowerRet(const TUtf32StringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT; +TUtf32String ToUpperRet(const TUtf32StringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT; +TUtf32String ToTitleRet(const TUtf32StringBuf text, size_t pos = 0, size_t count = TWtringBuf::npos) Y_WARN_UNUSED_RESULT; + +//! replaces the '<', '>' and '&' characters in string with '<', '>' and '&' respectively +// insertBr=true - replace '\r' and '\n' with "<BR>" +template <bool insertBr> +void EscapeHtmlChars(TUtf16String& str); + +//! returns number of characters in range. Handle surrogate pairs as one character. +inline size_t CountWideChars(const wchar16* b, const wchar16* e) { + size_t count = 0; + Y_ENSURE(b <= e, TStringBuf("invalid iterators")); + while (b < e) { + b = SkipSymbol(b, e); + ++count; + } + return count; +} + +inline size_t CountWideChars(const TWtringBuf str) { + return CountWideChars(str.begin(), str.end()); +} + +//! checks whether the range is valid UTF-16 sequence +inline bool IsValidUTF16(const wchar16* b, const wchar16* e) { + Y_ENSURE(b <= e, TStringBuf("invalid iterators")); + while (b < e) { + wchar32 symbol = ReadSymbolAndAdvance(b, e); + if (symbol == BROKEN_RUNE) + return false; + } + return true; +} + +inline bool IsValidUTF16(const TWtringBuf str) { + return IsValidUTF16(str.begin(), str.end()); +} diff --git a/util/charset/wide_specific.h b/util/charset/wide_specific.h new file mode 100644 index 0000000000..4ea765b94b --- /dev/null +++ b/util/charset/wide_specific.h @@ -0,0 +1,22 @@ +#pragma once + +#include <util/system/types.h> +#include <util/system/yassert.h> + +inline constexpr bool IsW16SurrogateLead(wchar16 c) noexcept { + return 0xD800 <= c && c <= 0xDBFF; +} + +inline constexpr bool IsW16SurrogateTail(wchar16 c) noexcept { + return 0xDC00 <= c && c <= 0xDFFF; +} + +inline size_t W16SymbolSize(const wchar16* begin, const wchar16* end) { + Y_ASSERT(begin < end); + + if ((begin + 1 != end) && IsW16SurrogateLead(*begin) && IsW16SurrogateTail(*(begin + 1))) { + return 2; + } + + return 1; +} diff --git a/util/charset/wide_sse41.cpp b/util/charset/wide_sse41.cpp new file mode 100644 index 0000000000..d1f2a74851 --- /dev/null +++ b/util/charset/wide_sse41.cpp @@ -0,0 +1,247 @@ +#include <util/charset/wide.h> +#include <util/system/types.h> + +#ifdef SSE41_STUB + +namespace NDetail { + void UTF8ToWideImplSSE41(const unsigned char*&, const unsigned char*, wchar16*&) noexcept { + } + void UTF8ToWideImplSSE41(const unsigned char*&, const unsigned char*, wchar32*&) noexcept { + } +} + +#else + + #include <util/system/compiler.h> + + #include <cstring> + #include <emmintrin.h> + #include <smmintrin.h> + +//processes to the first error, or until less then 16 bytes left +//most code taken from https://woboq.com/blog/utf-8-processing-using-simd.html + +//return dstAdvance 0 in case of problems +static Y_FORCE_INLINE ui32 Unpack16BytesIntoUtf16IfNoSurrogats(const unsigned char*& cur, __m128i& utf16Low, __m128i& utf16High) { + unsigned char curAligned[16]; + + memcpy(curAligned, cur, sizeof(__m128i)); + __m128i chunk = _mm_load_si128(reinterpret_cast<const __m128i*>(curAligned)); + + //only ascii characters - simple copy + if (!_mm_movemask_epi8(chunk)) { + utf16Low = _mm_unpacklo_epi8(chunk, _mm_setzero_si128()); + utf16High = _mm_unpackhi_epi8(chunk, _mm_setzero_si128()); + cur += 16; + return 16; + } + + __m128i chunkSigned = _mm_add_epi8(chunk, _mm_set1_epi8(0x80)); + __m128i isAsciiMask = _mm_cmpgt_epi8(chunk, _mm_set1_epi8(0)); + + __m128i cond2 = _mm_cmplt_epi8(_mm_set1_epi8(0xc2 - 1 - 0x80), chunkSigned); + __m128i state = _mm_set1_epi8(0x0 | (char)0x80); + + __m128i cond3 = _mm_cmplt_epi8(_mm_set1_epi8(0xe0 - 1 - 0x80), chunkSigned); + state = _mm_blendv_epi8(state, _mm_set1_epi8(0x2 | (char)0xc0), cond2); + + int sourceAdvance; + __m128i shifts; + __m128i chunkLow, chunkHigh; + + if (Y_LIKELY(!_mm_movemask_epi8(cond3))) { + //main case: no bloks of size 3 or 4 + + //rune len for start of multi-byte sequences (0 for b0... and b10..., 2 for b110..., etc.) + __m128i count = _mm_and_si128(state, _mm_set1_epi8(0x7)); + + __m128i countSub1 = _mm_subs_epu8(count, _mm_set1_epi8(0x1)); + + shifts = countSub1; + __m128i continuation1 = _mm_slli_si128(countSub1, 1); + + shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 1)); + shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 2)); + + __m128i counts = _mm_or_si128(count, continuation1); + + __m128i isBeginMultibyteMask = _mm_cmpgt_epi8(count, _mm_set1_epi8(0)); + __m128i needNoContinuationMask = _mm_cmpeq_epi8(continuation1, _mm_set1_epi8(0)); + __m128i isBeginMask = _mm_add_epi8(isBeginMultibyteMask, isAsciiMask); + //each symbol should be exactly one of ascii, continuation or begin + __m128i okMask = _mm_cmpeq_epi8(isBeginMask, needNoContinuationMask); + + if (_mm_movemask_epi8(okMask) != 0xFFFF) { + return 0; + } + + shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 4)); + + __m128i mask = _mm_and_si128(state, _mm_set1_epi8(0xf8)); + shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 8)); + + chunk = _mm_andnot_si128(mask, chunk); // from now on, we only have usefull bits + shifts = _mm_and_si128(shifts, _mm_cmplt_epi8(counts, _mm_set1_epi8(2))); // <=1 + + __m128i chunk_right = _mm_slli_si128(chunk, 1); + shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 1), + _mm_srli_si128(_mm_slli_epi16(shifts, 7), 1)); + + chunkLow = _mm_blendv_epi8(chunk, + _mm_or_si128(chunk, _mm_and_si128(_mm_slli_epi16(chunk_right, 6), _mm_set1_epi8(0xc0))), + _mm_cmpeq_epi8(counts, _mm_set1_epi8(1))); + + chunkHigh = _mm_and_si128(chunk, _mm_cmpeq_epi8(counts, _mm_set1_epi8(2))); + + shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 2), + _mm_srli_si128(_mm_slli_epi16(shifts, 6), 2)); + chunkHigh = _mm_srli_epi32(chunkHigh, 2); + + shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 4), + _mm_srli_si128(_mm_slli_epi16(shifts, 5), 4)); + + int c = _mm_extract_epi16(counts, 7); + sourceAdvance = !(c & 0x0200) ? 16 : 15; + + } else { + __m128i mask3 = _mm_slli_si128(cond3, 1); + + __m128i cond4 = _mm_cmplt_epi8(_mm_set1_epi8(0xf0 - 1 - 0x80), chunkSigned); + state = _mm_blendv_epi8(state, _mm_set1_epi8(0x3 | (char)0xe0), cond3); + + // 4 bytes sequences are not vectorize. Fall back to the scalar processing + if (Y_UNLIKELY(_mm_movemask_epi8(cond4))) { + return 0; + } + + //rune len for start of multi-byte sequences (0 for b0... and b10..., 2 for b110..., etc.) + __m128i count = _mm_and_si128(state, _mm_set1_epi8(0x7)); + + __m128i countSub1 = _mm_subs_epu8(count, _mm_set1_epi8(0x1)); + __m128i continuation2 = _mm_slli_si128(_mm_subs_epu8(count, _mm_set1_epi8(0x2)), 2); + + shifts = countSub1; + __m128i continuation1 = _mm_slli_si128(countSub1, 1); + + shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 1)); + __m128i continuationsRunelen = _mm_or_si128(continuation1, continuation2); + + shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 2)); + __m128i counts = _mm_or_si128(count, continuationsRunelen); + + __m128i isBeginMultibyteMask = _mm_cmpgt_epi8(count, _mm_set1_epi8(0)); + __m128i needNoContinuationMask = _mm_cmpeq_epi8(continuationsRunelen, _mm_set1_epi8(0)); + __m128i isBeginMask = _mm_add_epi8(isBeginMultibyteMask, isAsciiMask); + //each symbol should be exactly one of ascii, continuation or begin + __m128i okMask = _mm_cmpeq_epi8(isBeginMask, needNoContinuationMask); + + if (_mm_movemask_epi8(okMask) != 0xFFFF) { + return 0; + } + + shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 4)); + + __m128i mask = _mm_and_si128(state, _mm_set1_epi8(0xf8)); + shifts = _mm_add_epi8(shifts, _mm_slli_si128(shifts, 8)); + + chunk = _mm_andnot_si128(mask, chunk); // from now on, we only have usefull bits + shifts = _mm_and_si128(shifts, _mm_cmplt_epi8(counts, _mm_set1_epi8(2))); // <=1 + + __m128i chunk_right = _mm_slli_si128(chunk, 1); + shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 1), + _mm_srli_si128(_mm_slli_epi16(shifts, 7), 1)); + + chunkLow = _mm_blendv_epi8(chunk, + _mm_or_si128(chunk, _mm_and_si128(_mm_slli_epi16(chunk_right, 6), _mm_set1_epi8(0xc0))), + _mm_cmpeq_epi8(counts, _mm_set1_epi8(1))); + + chunkHigh = _mm_and_si128(chunk, _mm_cmpeq_epi8(counts, _mm_set1_epi8(2))); + + shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 2), + _mm_srli_si128(_mm_slli_epi16(shifts, 6), 2)); + chunkHigh = _mm_srli_epi32(chunkHigh, 2); + + shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 4), + _mm_srli_si128(_mm_slli_epi16(shifts, 5), 4)); + chunkHigh = _mm_or_si128(chunkHigh, + _mm_and_si128(_mm_and_si128(_mm_slli_epi32(chunk_right, 4), _mm_set1_epi8(0xf0)), + mask3)); + + int c = _mm_extract_epi16(counts, 7); + sourceAdvance = !(c & 0x0200) ? 16 : !(c & 0x02) ? 15 + : 14; + } + + shifts = _mm_blendv_epi8(shifts, _mm_srli_si128(shifts, 8), + _mm_srli_si128(_mm_slli_epi16(shifts, 4), 8)); + + chunkHigh = _mm_slli_si128(chunkHigh, 1); + + __m128i shuf = _mm_add_epi8(shifts, _mm_set_epi8(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)); + + chunkLow = _mm_shuffle_epi8(chunkLow, shuf); + chunkHigh = _mm_shuffle_epi8(chunkHigh, shuf); + + utf16Low = _mm_unpacklo_epi8(chunkLow, chunkHigh); + utf16High = _mm_unpackhi_epi8(chunkLow, chunkHigh); + + ui32 s = _mm_extract_epi32(shifts, 3); + ui32 destAdvance = sourceAdvance - (0xff & (s >> (8 * (3 - 16 + sourceAdvance)))); + cur += sourceAdvance; + return destAdvance; +} + +namespace NDetail { + void UTF8ToWideImplSSE41(const unsigned char*& cur, const unsigned char* last, wchar16*& dest) noexcept { + alignas(16) wchar16 destAligned[16]; + + while (cur + 16 <= last) { + __m128i utf16Low; + __m128i utf16High; + ui32 dstAdvance = Unpack16BytesIntoUtf16IfNoSurrogats(cur, utf16Low, utf16High); + + if (dstAdvance == 0) { + break; + } + + _mm_store_si128(reinterpret_cast<__m128i*>(destAligned), utf16Low); + _mm_store_si128(reinterpret_cast<__m128i*>(destAligned) + 1, utf16High); + memcpy(dest, destAligned, sizeof(__m128i) * 2); + dest += dstAdvance; + } + //The rest will be handled sequencially. + // Possible improvement: go back to the vectorized processing after the error or the 4 byte sequence + } + + void UTF8ToWideImplSSE41(const unsigned char*& cur, const unsigned char* last, wchar32*& dest) noexcept { + alignas(16) wchar32 destAligned[16]; + + while (cur + 16 <= last) { + __m128i utf16Low; + __m128i utf16High; + ui32 dstAdvance = Unpack16BytesIntoUtf16IfNoSurrogats(cur, utf16Low, utf16High); + + if (dstAdvance == 0) { + break; + } + + //NOTE: we only work in case without surrogat pairs, so we can make simple copying with zeroes in 2 high bytes + __m128i utf32_lowlow = _mm_unpacklo_epi16(utf16Low, _mm_set1_epi8(0)); + __m128i utf32_lowhigh = _mm_unpackhi_epi16(utf16Low, _mm_set1_epi8(0)); + __m128i utf32_highlow = _mm_unpacklo_epi16(utf16High, _mm_set1_epi8(0)); + __m128i utf32_highhigh = _mm_unpackhi_epi16(utf16High, _mm_set1_epi8(0)); + + _mm_store_si128(reinterpret_cast<__m128i*>(destAligned), utf32_lowlow); + _mm_store_si128(reinterpret_cast<__m128i*>(destAligned) + 1, utf32_lowhigh); + _mm_store_si128(reinterpret_cast<__m128i*>(destAligned) + 2, utf32_highlow); + _mm_store_si128(reinterpret_cast<__m128i*>(destAligned) + 3, utf32_highhigh); + + memcpy(dest, destAligned, sizeof(__m128i) * 4); + dest += dstAdvance; + } + //The rest will be handled sequencially. + // Possible improvement: go back to the vectorized processing after the error or the 4 byte sequence + } +} + +#endif diff --git a/util/charset/wide_ut.cpp b/util/charset/wide_ut.cpp new file mode 100644 index 0000000000..d8f3233e73 --- /dev/null +++ b/util/charset/wide_ut.cpp @@ -0,0 +1,1742 @@ +#include "utf8.h" +#include "wide.h" + +#include <library/cpp/testing/unittest/registar.h> + +#include <util/string/reverse.h> + +#include <algorithm> + +namespace { + //! three UTF8 encoded russian letters (A, B, V) + const char utext[] = "\xd0\x90\xd0\x91\xd0\x92"; + + const char asciiLatinAlphabet[] = "ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz"; + const wchar16 wideLatinAlphabet[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0}; + const wchar16 wideCyrillicAlphabet[] = { + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x00}; + const char utf8CyrillicAlphabet[] = + "\xd0\x90\xd0\x91\xd0\x92\xd0\x93\xd0\x94\xd0\x95\xd0\x96\xd0\x97" + "\xd0\x98\xd0\x99\xd0\x9a\xd0\x9b\xd0\x9c\xd0\x9d\xd0\x9e\xd0\x9f" + "\xd0\xa0\xd0\xa1\xd0\xa2\xd0\xa3\xd0\xa4\xd0\xa5\xd0\xa6\xd0\xa7" + "\xd0\xa8\xd0\xa9\xd0\xaa\xd0\xab\xd0\xac\xd0\xad\xd0\xae\xd0\xaf" + "\xd0\xb0\xd0\xb1\xd0\xb2\xd0\xb3\xd0\xb4\xd0\xb5\xd0\xb6\xd0\xb7" + "\xd0\xb8\xd0\xb9\xd0\xba\xd0\xbb\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xbf" + "\xd1\x80\xd1\x81\xd1\x82\xd1\x83\xd1\x84\xd1\x85\xd1\x86\xd1\x87" + "\xd1\x88\xd1\x89\xd1\x8a\xd1\x8b\xd1\x8c\xd1\x8d\xd1\x8e\xd1\x8f"; + + const wchar32 LEAD_BITS_MASK_2_BYTES = 0x1F; + const wchar32 LEAD_BITS_MASK_3_BYTES = 0x0F; + const wchar32 LEAD_BITS_MASK_4_BYTES = 0x07; + + wchar16 ws[] = { + 0x0009, + 0x000A, 0x2028, 0x2029, + 0x000B, + 0x000C, + 0x000D, + 0x0020, 0x1680, + 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, + 0x202F, 0x205F, 0x3000, + 0x00A0}; + + const size_t CaseTestDataSize = 10; + wchar32 WideStringTestData[][CaseTestDataSize] = { + {0x01C4, 0x10428, 0x10429, 0x10447, 0x10441, 0x1C03, 0x00A0, 0x10400, 0x10415, 0x10437}, // original + {0x01C6, 0x10428, 0x10429, 0x10447, 0x10441, 0x1C03, 0x00A0, 0x10428, 0x1043D, 0x10437}, // lower + {0x01C4, 0x10400, 0x10401, 0x1041F, 0x10419, 0x1C03, 0x00A0, 0x10400, 0x10415, 0x1040F}, // upper + {0x01C5, 0x10428, 0x10429, 0x10447, 0x10441, 0x1C03, 0x00A0, 0x10428, 0x1043D, 0x10437}, // title + }; + + TUtf16String CreateUnicodeText() { + const int len = 256; + wchar16 text[len] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00 - 0x0F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x10 - 0x1F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x20 - 0x2F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x30 - 0x3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x40 - 0x4F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x50 - 0x5F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x60 - 0x6F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x70 - 0x7F + + 0x0301, 0x00C4, 0x00D6, 0x00DC, 0x0104, 0x0106, 0x0118, 0x0141, 0x00E0, 0x00E2, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x0490, 0x00AD, // 0x80 - 0x8F + 0x00DF, 0x00E4, 0x00F6, 0x00FC, 0x0105, 0x0107, 0x0119, 0x0142, 0x00EB, 0x00EE, 0x00EF, 0x00F4, 0x00F9, 0x00FB, 0x0491, 0x92CF, // 0x90 - 0x9F + 0x00A0, 0x0143, 0x00D3, 0x015A, 0x017B, 0x0179, 0x046C, 0x00A7, 0x0401, 0x0462, 0x0472, 0x0474, 0x040E, 0x0406, 0x0404, 0x0407, // 0xA0 - 0xAF + 0x00B0, 0x0144, 0x00F3, 0x015B, 0x017C, 0x017A, 0x046D, 0x2116, 0x0451, 0x0463, 0x0473, 0x0475, 0x045E, 0x0456, 0x0454, 0x0457 // 0xB0 - 0xBF + }; + for (int i = 0; i < len; ++i) { + if (i <= 0x7F) { // ASCII characters without 0x7 and 0x1B + text[i] = static_cast<wchar16>(i); + } else if (i >= 0xC0 && i <= 0xFF) { // russian characters (without YO and yo) + text[i] = static_cast<wchar16>(i + 0x0350); // 0x0410 - 0x044F + } + } + return TUtf16String(text, len); + } + + TString CreateUTF8Text() { + char text[] = { + '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f', + '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', + '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27', '\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f', + '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37', '\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f', + '\x40', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47', '\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f', + '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57', '\x58', '\x59', '\x5a', '\x5b', '\x5c', '\x5d', '\x5e', '\x5f', + '\x60', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67', '\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f', + '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77', '\x78', '\x79', '\x7a', '\x7b', '\x7c', '\x7d', '\x7e', '\x7f', + '\xcc', '\x81', '\xc3', '\x84', '\xc3', '\x96', '\xc3', '\x9c', '\xc4', '\x84', '\xc4', '\x86', '\xc4', '\x98', '\xc5', '\x81', + '\xc3', '\xa0', '\xc3', '\xa2', '\xc3', '\xa7', '\xc3', '\xa8', '\xc3', '\xa9', '\xc3', '\xaa', '\xd2', '\x90', '\xc2', '\xad', + '\xc3', '\x9f', '\xc3', '\xa4', '\xc3', '\xb6', '\xc3', '\xbc', '\xc4', '\x85', '\xc4', '\x87', '\xc4', '\x99', '\xc5', '\x82', + '\xc3', '\xab', '\xc3', '\xae', '\xc3', '\xaf', '\xc3', '\xb4', '\xc3', '\xb9', '\xc3', '\xbb', '\xd2', '\x91', '\xe9', '\x8b', + '\x8f', '\xc2', '\xa0', '\xc5', '\x83', '\xc3', '\x93', '\xc5', '\x9a', '\xc5', '\xbb', '\xc5', '\xb9', '\xd1', '\xac', '\xc2', + '\xa7', '\xd0', '\x81', '\xd1', '\xa2', '\xd1', '\xb2', '\xd1', '\xb4', '\xd0', '\x8e', '\xd0', '\x86', '\xd0', '\x84', '\xd0', + '\x87', '\xc2', '\xb0', '\xc5', '\x84', '\xc3', '\xb3', '\xc5', '\x9b', '\xc5', '\xbc', '\xc5', '\xba', '\xd1', '\xad', '\xe2', + '\x84', '\x96', '\xd1', '\x91', '\xd1', '\xa3', '\xd1', '\xb3', '\xd1', '\xb5', '\xd1', '\x9e', '\xd1', '\x96', '\xd1', '\x94', + '\xd1', '\x97', '\xd0', '\x90', '\xd0', '\x91', '\xd0', '\x92', '\xd0', '\x93', '\xd0', '\x94', '\xd0', '\x95', '\xd0', '\x96', + '\xd0', '\x97', '\xd0', '\x98', '\xd0', '\x99', '\xd0', '\x9a', '\xd0', '\x9b', '\xd0', '\x9c', '\xd0', '\x9d', '\xd0', '\x9e', + '\xd0', '\x9f', '\xd0', '\xa0', '\xd0', '\xa1', '\xd0', '\xa2', '\xd0', '\xa3', '\xd0', '\xa4', '\xd0', '\xa5', '\xd0', '\xa6', + '\xd0', '\xa7', '\xd0', '\xa8', '\xd0', '\xa9', '\xd0', '\xaa', '\xd0', '\xab', '\xd0', '\xac', '\xd0', '\xad', '\xd0', '\xae', + '\xd0', '\xaf', '\xd0', '\xb0', '\xd0', '\xb1', '\xd0', '\xb2', '\xd0', '\xb3', '\xd0', '\xb4', '\xd0', '\xb5', '\xd0', '\xb6', + '\xd0', '\xb7', '\xd0', '\xb8', '\xd0', '\xb9', '\xd0', '\xba', '\xd0', '\xbb', '\xd0', '\xbc', '\xd0', '\xbd', '\xd0', '\xbe', + '\xd0', '\xbf', '\xd1', '\x80', '\xd1', '\x81', '\xd1', '\x82', '\xd1', '\x83', '\xd1', '\x84', '\xd1', '\x85', '\xd1', '\x86', + '\xd1', '\x87', '\xd1', '\x88', '\xd1', '\x89', '\xd1', '\x8a', '\xd1', '\x8b', '\xd1', '\x8c', '\xd1', '\x8d', '\xd1', '\x8e', + '\xd1', '\x8f'}; + return TString(text, Y_ARRAY_SIZE(text)); + } + + //! use this function to dump UTF8 text into a file in case of any changes + // void DumpUTF8Text() { + // TString s = WideToUTF8(UnicodeText); + // std::ofstream f("utf8.txt"); + // f << std::hex; + // for (int i = 0; i < (int)s.size(); ++i) { + // f << "0x" << std::setw(2) << std::setfill('0') << (int)(ui8)s[i] << ", "; + // if ((i + 1) % 16 == 0) + // f << std::endl; + // } + // } + + void CheckRecodeOK(wchar32 expected, unsigned char* first, size_t n) { + wchar32 w = 0; + const unsigned char* p = first; + + RECODE_RESULT r = ReadUTF8CharAndAdvance(w, p, first + n); + UNIT_ASSERT(w == expected); + UNIT_ASSERT(size_t(p - first) == n); + UNIT_ASSERT(r == RECODE_OK); + } + + void CheckBrokenSymbol(unsigned char* first, unsigned char* last) { + wchar32 w = 0; + const unsigned char* p = first; + + RECODE_RESULT r = ReadUTF8CharAndAdvance(w, p, last); + UNIT_ASSERT(w == BROKEN_RUNE); + UNIT_ASSERT(p - first == 0); + UNIT_ASSERT(r == RECODE_BROKENSYMBOL); + } + + void CheckEndOfInput(unsigned char* first, size_t n) { + wchar32 w = 0; + const unsigned char* p = first; + + RECODE_RESULT r = ReadUTF8CharAndAdvance(w, p, first + n); + (void)w; + UNIT_ASSERT(p - first == 0); + UNIT_ASSERT(r == RECODE_EOINPUT); + } + + void CheckCharLen(unsigned char* first, unsigned char* last, size_t len, RECODE_RESULT result) { + size_t n = 0; + RECODE_RESULT r = GetUTF8CharLen(n, first, last); + UNIT_ASSERT(n == len); + UNIT_ASSERT(r == result); + } +} + +class TConversionTest: public TTestBase { +private: + //! @note every of the text can have zeros in the middle + const TUtf16String UnicodeText_; + const TString Utf8Text_; + +private: + UNIT_TEST_SUITE(TConversionTest); + UNIT_TEST(TestReadUTF8Char); + UNIT_TEST(TestGetUTF8CharLen); + UNIT_TEST(TestWriteUTF8Char); + UNIT_TEST(TestUTF8ToWide); + UNIT_TEST(TestWideToUTF8); + UNIT_TEST(TestGetNumOfUTF8Chars); + UNIT_TEST(TestSubstrUTF8); + UNIT_TEST(TestUnicodeCase); + UNIT_TEST(TestUnicodeDetails); + UNIT_TEST(TestHexConversion); + UNIT_TEST_SUITE_END(); + +public: + TConversionTest() + : UnicodeText_(CreateUnicodeText()) + , Utf8Text_(CreateUTF8Text()) + { + } + + void TestReadUTF8Char(); + void TestGetUTF8CharLen(); + void TestWriteUTF8Char(); + void TestUTF8ToWide(); + void TestWideToUTF8(); + void TestGetNumOfUTF8Chars(); + void TestSubstrUTF8(); + void TestUnicodeCase(); + void TestUnicodeDetails(); + void TestHexConversion(); +}; + +UNIT_TEST_SUITE_REGISTRATION(TConversionTest); + +void TConversionTest::TestHexConversion() { + for (char ch = '0'; ch <= '9'; ++ch) { + UNIT_ASSERT(isxdigit(ch)); + UNIT_ASSERT(IsHexdigit(ch)); + } + + for (char ch = 'a'; ch <= 'f'; ++ch) { + UNIT_ASSERT(isxdigit(ch)); + UNIT_ASSERT(IsHexdigit(ch)); + } + + for (char ch = 'A'; ch <= 'F'; ++ch) { + UNIT_ASSERT(isxdigit(ch)); + UNIT_ASSERT(IsHexdigit(ch)); + } + + for (wchar16 i = std::numeric_limits<wchar16>::min(); i < std::numeric_limits<wchar16>::max(); ++i) { + if (IsHexdigit(i)) { + UNIT_ASSERT(isxdigit(char(i))); + } + } +} + +void TConversionTest::TestReadUTF8Char() { + wchar32 e; // expected unicode char + wchar32 c; + unsigned long u; // single UTF8 encoded character + unsigned char* const first = reinterpret_cast<unsigned char*>(&u); + unsigned char* const last = first + sizeof(u); + + // all ASCII characters are converted with no change (zero converted successfully as well) + for (c = 0; c <= 0x7F; ++c) { + u = c; + CheckRecodeOK(c, first, 1); + } + + // broken symbols from the second half of ASCII table (1000 0000 - 1011 1111) + for (c = 0x80; c <= 0xBF; ++c) { + u = c; + CheckBrokenSymbol(first, last); + } + + // overlong encoding: leading byte of 2-byte symbol: 1100 0000 - 1100 0001 + for (c = 0xC0; c <= 0xC1; ++c) { + u = c; + CheckBrokenSymbol(first, last); + + u |= 0x8000; + CheckBrokenSymbol(first, first + 2); + + CheckEndOfInput(first, 1); + } + + // leading byte of 2-byte symbol: 1100 0000 - 1101 1111 + for (c = 0xC2; c <= 0xDF; ++c) { + u = c; + CheckBrokenSymbol(first, last); + + u |= 0x8000; + // w: 0000 0000 0000 0000 - 0000 0111 1100 0000 + e = c & LEAD_BITS_MASK_2_BYTES; + e <<= 6; + CheckRecodeOK(e, first, 2); + + CheckEndOfInput(first, 1); + } + + // possible overlong encoding with leading byte 1110 0000 + { + u = c = 0xE0; + CheckBrokenSymbol(first, last); + + u |= 0x808000; + CheckBrokenSymbol(first, first + 3); + + u = c | 0x80A000; + e = 0x800; + CheckRecodeOK(e, first, 3); + + CheckEndOfInput(first, 2); + CheckEndOfInput(first, 1); + } + + // leading byte of 3-byte symbol: 1110 0001 - 1110 1111 + for (c = 0xE1; c <= 0xEF; ++c) { + u = c; + CheckBrokenSymbol(first, last); + + u |= 0x808000; + // w: 0000 0000 0000 0000 - 0000 0111 1100 0000 + e = c & LEAD_BITS_MASK_3_BYTES; + e <<= 12; + CheckRecodeOK(e, first, 3); + + CheckEndOfInput(first, 2); + CheckEndOfInput(first, 1); + } + + // possible overlong encoding with leading byte 1111 0000 + { + u = c = 0xF0; + CheckBrokenSymbol(first, last); + + u |= 0x80808000; + CheckBrokenSymbol(first, first + 4); + + u = c | 0x80809000; + e = 0x10000; + CheckRecodeOK(e, first, 4); + + CheckEndOfInput(first, 3); + CheckEndOfInput(first, 2); + CheckEndOfInput(first, 1); + } + + // leading byte of 4-byte symbol: 1111 0001 - 1111 0111 + for (c = 0xF1; c <= 0xF3; ++c) { + u = c; + CheckBrokenSymbol(first, last); + + u |= 0x80808000; + // w: 0000 0000 0000 0000 - 0000 0111 1100 0000 + e = c & LEAD_BITS_MASK_4_BYTES; + e <<= 18; + CheckRecodeOK(e, first, 4); + + CheckEndOfInput(first, 3); + CheckEndOfInput(first, 2); + CheckEndOfInput(first, 1); + } + + // possible invalid code points with leading byte 1111 0100 + { + c = 0xF4; + + u = 0x80808000 | c; + e = c & LEAD_BITS_MASK_4_BYTES; + e <<= 18; + CheckRecodeOK(e, first, 4); + + // the largest possible Unicode code point + u = 0xBFBF8F00 | c; + e = 0x10FFFF; + CheckRecodeOK(e, first, 4); + + u = 0x80809000 | c; + CheckBrokenSymbol(first, last); + } + + // broken symbols: 1111 0101 - 1111 1111 + for (c = 0xF5; c <= 0xFF; ++c) { + u = c; + CheckBrokenSymbol(first, last); + } +} + +void TConversionTest::TestGetUTF8CharLen() { + wchar32 c; + unsigned long u; // single UTF8 encoded character + unsigned char* const first = reinterpret_cast<unsigned char*>(&u); + unsigned char* const last = first + sizeof(u); + + // all ASCII characters are converted with no change (zero converted successfully as well) + for (c = 0; c <= 0x7F; ++c) { + u = c; + CheckCharLen(first, last, 1, RECODE_OK); + } + + // broken symbols from the second half of ASCII table (1000 0000 - 1011 1111) + for (c = 0x80; c <= 0xBF; ++c) { + u = c; + CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL); + } + + // leading byte of 2-byte symbol: 1100 0000 - 1101 1111 + for (c = 0xC0; c <= 0xDF; ++c) { + u = c; + CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL); + + u |= 0x8000; + // w: 0000 0000 0000 0000 - 0000 0111 1100 0000 + CheckCharLen(first, last, 2, RECODE_OK); + + CheckCharLen(first, first + 1, 0, RECODE_EOINPUT); + } + + // leading byte of 3-byte symbol: 1110 0000 - 1110 1111 + for (c = 0xE0; c <= 0xEF; ++c) { + u = c; + CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL); + + u |= 0x808000; + // w: 0000 0000 0000 0000 - 0000 0111 1100 0000 + CheckCharLen(first, last, 3, RECODE_OK); + + CheckCharLen(first, first + 2, 0, RECODE_EOINPUT); + CheckCharLen(first, first + 1, 0, RECODE_EOINPUT); + } + + // leading byte of 4-byte symbol: 1111 0000 - 1111 0111 + for (c = 0xF0; c <= 0xF3; ++c) { + u = c; + CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL); + + u |= 0x80808000; + // w: 0000 0000 0000 0000 - 0000 0111 1100 0000 + CheckCharLen(first, last, 4, RECODE_OK); + + CheckCharLen(first, first + 3, 0, RECODE_EOINPUT); + CheckCharLen(first, first + 2, 0, RECODE_EOINPUT); + CheckCharLen(first, first + 1, 0, RECODE_EOINPUT); + } + + // broken symbols: 1111 1000 - 1111 1111 + for (c = 0xF8; c <= 0xFF; ++c) { + u = c; + CheckCharLen(first, last, 0, RECODE_BROKENSYMBOL); + } +} + +void TConversionTest::TestWriteUTF8Char() { + wchar32 w; + unsigned long u; // single UTF8 encoded character + size_t n; + + for (w = 0x00; w < 0x80; ++w) { + u = 0; + WriteUTF8Char(w, n, reinterpret_cast<unsigned char*>(&u)); + UNIT_ASSERT((u & 0xFFFFFF80) == 0x00000000); + UNIT_ASSERT(n == 1); + } + + for (w = 0x80; w < 0x800; ++w) { + u = 0; + WriteUTF8Char(w, n, reinterpret_cast<unsigned char*>(&u)); + UNIT_ASSERT((u & 0xFFFFC000) == 0x00008000); // see constants in ReadUTF8Char + UNIT_ASSERT(n == 2); + } + + for (w = 0x800; w < 0x10000; ++w) { + u = 0; + WriteUTF8Char(w, n, reinterpret_cast<unsigned char*>(&u)); + UNIT_ASSERT((u & 0xFFC0C000) == 0x00808000); // see constants in ReadUTF8Char + UNIT_ASSERT(n == 3); + } + + for (w = 0x10000; w < 0x80; ++w) { + WriteUTF8Char(w, n, reinterpret_cast<unsigned char*>(&u)); + UNIT_ASSERT((u & 0xC0C0C000) == 0x80808000); // see constants in ReadUTF8Char + UNIT_ASSERT(n == 4); + } +} + +static void TestSurrogates(const char* str, const wchar16* wide, size_t wideSize) { + TUtf16String w = UTF8ToWide(str); + + UNIT_ASSERT(w.size() == wideSize); + UNIT_ASSERT(!memcmp(w.c_str(), wide, wideSize)); + + TString s = WideToUTF8(w); + + UNIT_ASSERT(s == str); +} + +void TConversionTest::TestUTF8ToWide() { + TUtf16String w = UTF8ToWide(Utf8Text_); + + UNIT_ASSERT(w.size() == 256); + UNIT_ASSERT(w.size() == UnicodeText_.size()); + + for (int i = 0; i < 256; ++i) { + UNIT_ASSERT_VALUES_EQUAL(w[i], UnicodeText_[i]); + } + + wchar16 buffer[4] = {0}; + size_t written = 0; + // the function must extract 2 symbols only + bool result = UTF8ToWide(utext, 5, buffer, written); + UNIT_ASSERT(!result); + UNIT_ASSERT(buffer[0] == 0x0410); + UNIT_ASSERT(buffer[1] == 0x0411); + UNIT_ASSERT(buffer[2] == 0x0000); + UNIT_ASSERT(buffer[3] == 0x0000); + UNIT_ASSERT(written == 2); + + memset(buffer, 0, 4); + written = 0; + result = UTF8ToWide(utext, 1, buffer, written); + UNIT_ASSERT(!result); + UNIT_ASSERT(buffer[0] == 0x0000); + UNIT_ASSERT(buffer[1] == 0x0000); + UNIT_ASSERT(buffer[2] == 0x0000); + UNIT_ASSERT(buffer[3] == 0x0000); + UNIT_ASSERT(written == 0); + + w = UTF8ToWide(asciiLatinAlphabet, strlen(asciiLatinAlphabet)); + UNIT_ASSERT(w == wideLatinAlphabet); + w = UTF8ToWide(utf8CyrillicAlphabet, strlen(utf8CyrillicAlphabet)); + UNIT_ASSERT(w == wideCyrillicAlphabet); + + const char* utf8NonBMP = "\xf4\x80\x89\x84\xf4\x80\x89\x87\xf4\x80\x88\xba"; + wchar16 wNonBMPDummy[] = {0xDBC0, 0xDE44, 0xDBC0, 0xDE47, 0xDBC0, 0xDE3A}; + TestSurrogates(utf8NonBMP, wNonBMPDummy, Y_ARRAY_SIZE(wNonBMPDummy)); + + const char* utf8NonBMP2 = "ab\xf4\x80\x89\x87n"; + wchar16 wNonBMPDummy2[] = {'a', 'b', 0xDBC0, 0xDE47, 'n'}; + TestSurrogates(utf8NonBMP2, wNonBMPDummy2, Y_ARRAY_SIZE(wNonBMPDummy2)); + + UNIT_ASSERT_VALUES_EQUAL(WideToUTF8(UTF8ToWide(WideToUTF8(UTF8ToWide<true>( + "m\xFB\xB2\xA5\xAA\xAFyeuse.sexwebcamz.com")))), + TString( + "m\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBDyeuse.sexwebcamz.com")); +} + +void TConversionTest::TestWideToUTF8() { + TString s = WideToUTF8(UnicodeText_); + size_t len = 0; + for (TUtf16String::const_iterator i = UnicodeText_.begin(), ie = UnicodeText_.end(); i != ie; ++i) { + len += UTF8RuneLenByUCS(*i); + } + + UNIT_ASSERT(s.size() == Utf8Text_.size()); + UNIT_ASSERT(s.size() == len); + + for (int i = 0; i < static_cast<int>(s.size()); ++i) { + UNIT_ASSERT_VALUES_EQUAL(s[i], Utf8Text_[i]); + } +} + +void TConversionTest::TestGetNumOfUTF8Chars() { + size_t n = 0; + bool result = GetNumberOfUTF8Chars(Utf8Text_.c_str(), Utf8Text_.size(), n); + UNIT_ASSERT(result); + UNIT_ASSERT(n == 256); + + n = 0; + result = GetNumberOfUTF8Chars(utext, 5, n); + UNIT_ASSERT(!result); + UNIT_ASSERT(n == 2); + + n = 0; + result = GetNumberOfUTF8Chars(utext, 1, n); + UNIT_ASSERT(!result); + UNIT_ASSERT(n == 0); + + UNIT_ASSERT_EQUAL(GetNumberOfUTF8Chars("привет!"), 7); +} + +void TConversionTest::TestSubstrUTF8() { + TStringBuf utextBuf(utext, sizeof(utext)); + UNIT_ASSERT(SubstrUTF8(utextBuf, 0, 2) == utextBuf.substr(0, 4)); + UNIT_ASSERT(SubstrUTF8(utextBuf, 1, 1) == utextBuf.substr(2, 2)); + UNIT_ASSERT(SubstrUTF8(utextBuf, 1, 2) == utextBuf.substr(2, 4)); + UNIT_ASSERT(SubstrUTF8(utextBuf, 1, 3) == utextBuf.substr(2, 6)); +} + +inline bool MustBeSurrogate(wchar32 ch) { + return ch > 0xFFFF; +} + +void TConversionTest::TestUnicodeCase() { + // ToLower, ToUpper, ToTitle functions depend on equal size of both original and changed characters + for (wchar32 i = 0; i != NUnicode::UnicodeInstancesLimit(); ++i) { + UNIT_ASSERT(MustBeSurrogate(i) == MustBeSurrogate(ToLower(i))); + UNIT_ASSERT(MustBeSurrogate(i) == MustBeSurrogate(ToUpper(i))); + UNIT_ASSERT(MustBeSurrogate(i) == MustBeSurrogate(ToTitle(i))); + } +} + +void TConversionTest::TestUnicodeDetails() { + TUtf16String temp; + for (wchar32 i = 0; i != NUnicode::UnicodeInstancesLimit(); ++i) { + temp.clear(); + WriteSymbol(i, temp); + UNIT_ASSERT(temp.size() == W16SymbolSize(temp.c_str(), temp.c_str() + temp.size())); + } +} + +class TWideUtilTest: public TTestBase { + UNIT_TEST_SUITE(TWideUtilTest); + UNIT_TEST(TestCollapse); + UNIT_TEST(TestCollapseBuffer); + UNIT_TEST(TestStrip); + UNIT_TEST(TestIsSpace); + UNIT_TEST(TestEscapeHtmlChars); + UNIT_TEST(TestToLower); + UNIT_TEST(TestToUpper); + UNIT_TEST(TestWideString); + UNIT_TEST(TestCountWideChars); + UNIT_TEST(TestIsValidUTF16); + UNIT_TEST(TestIsStringASCII); + UNIT_TEST(TestIsLowerWordStr); + UNIT_TEST(TestIsUpperWordStr); + UNIT_TEST(TestIsTitleStr); + UNIT_TEST(TestIsLowerStr); + UNIT_TEST(TestIsUpperStr); + UNIT_TEST(TestToLowerStr); + UNIT_TEST(TestToUpperStr); + UNIT_TEST(TestToTitleStr); + UNIT_TEST_SUITE_END(); + +public: + void TestCollapse() { + TUtf16String s; + s.append(ws, Y_ARRAY_SIZE(ws)).append(3, 'a').append(ws, Y_ARRAY_SIZE(ws)).append(3, 'b').append(ws, Y_ARRAY_SIZE(ws)); + Collapse(s); + UNIT_ASSERT(s == ASCIIToWide(" aaa bbb ")); + { + const TUtf16String w(ASCIIToWide(" a b c ")); + s = w; + Collapse(s); + UNIT_ASSERT(s == w); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.c_str() == w.c_str()); // Collapse() does not change the string at all +#endif + } + s = ASCIIToWide(" 123 456 "); + Collapse(s); + UNIT_ASSERT(s == ASCIIToWide(" 123 456 ")); + + s = ASCIIToWide(" 1\n\n\n23\t 4\f\f56 "); + Collapse(s); + UNIT_ASSERT(s == ASCIIToWide(" 1 23 4 56 ")); + + s = ASCIIToWide(" 1\n\n\n\f\f56 "); + Collapse(s); + UNIT_ASSERT(s == ASCIIToWide(" 1 56 ")); + + s = ASCIIToWide(" 1\r\n,\n(\n23\t 4\f\f56 "); + Collapse(s); + UNIT_ASSERT(s == ASCIIToWide(" 1 , ( 23 4 56 ")); + + s = ASCIIToWide("1 23 "); + Collapse(s); + UNIT_ASSERT(s == ASCIIToWide("1 23 ")); + { + const TUtf16String w = ASCIIToWide(" "); + s = w; + Collapse(s); + UNIT_ASSERT(s == w); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.c_str() == w.c_str()); // Collapse() does not change the string at all +#endif + } + s = ASCIIToWide(" "); + Collapse(s); + UNIT_ASSERT(s == ASCIIToWide(" ")); + + s = ASCIIToWide(",\r\n\""); + Collapse(s); + UNIT_ASSERT(s == ASCIIToWide(", \"")); + + s = ASCIIToWide("-"); + Collapse(s); + UNIT_ASSERT(s == ASCIIToWide("-")); + + s.clear(); + Collapse(s); + UNIT_ASSERT(s == TUtf16String()); + } + + void TestCollapseBuffer() { + TUtf16String s; + s.append(ws, Y_ARRAY_SIZE(ws)).append(3, 'a').append(ws, Y_ARRAY_SIZE(ws)).append(3, 'b').append(ws, Y_ARRAY_SIZE(ws)); + size_t n = Collapse(s.begin(), s.size()); + s.resize(n); + UNIT_ASSERT(s == ASCIIToWide(" aaa bbb ")); + + s = ASCIIToWide(" a b c "); + n = Collapse(s.begin(), s.size()); + UNIT_ASSERT(n == s.size()); // length was not changed + UNIT_ASSERT(s == ASCIIToWide(" a b c ")); + + s = ASCIIToWide(" 123 456 "); + n = Collapse(s.begin(), s.size()); + s.resize(n); + UNIT_ASSERT(s == ASCIIToWide(" 123 456 ")); + + s = ASCIIToWide(" 1\n\n\n23\t 4\f\f56 "); + n = Collapse(s.begin(), s.size()); + s.resize(n); + UNIT_ASSERT(s == ASCIIToWide(" 1 23 4 56 ")); + + s = ASCIIToWide(" 1\n\n\n\f\f56 "); + n = Collapse(s.begin(), s.size()); + s.resize(n); + UNIT_ASSERT(s == ASCIIToWide(" 1 56 ")); + + s = ASCIIToWide(" 1\r\n,\n(\n23\t 4\f\f56 "); + n = Collapse(s.begin(), s.size()); + s.resize(n); + UNIT_ASSERT(s == ASCIIToWide(" 1 , ( 23 4 56 ")); + + s = ASCIIToWide("1 23 "); + n = Collapse(s.begin(), s.size()); + s.resize(n); + UNIT_ASSERT(s == ASCIIToWide("1 23 ")); + + s = ASCIIToWide(" "); + n = Collapse(s.begin(), s.size()); + UNIT_ASSERT(n == 1); + UNIT_ASSERT(s == ASCIIToWide(" ")); + + s = ASCIIToWide(" "); + n = Collapse(s.begin(), s.size()); + s.resize(n); + UNIT_ASSERT(s == ASCIIToWide(" ")); + + s = ASCIIToWide(",\r\n\""); + n = Collapse(s.begin(), s.size()); + s.resize(n); + UNIT_ASSERT(s == ASCIIToWide(", \"")); + + s = ASCIIToWide("-"); + n = Collapse(s.begin(), s.size()); + UNIT_ASSERT(n == 1); + UNIT_ASSERT(s == ASCIIToWide("-")); + + s = ASCIIToWide("\t"); + n = Collapse(s.begin(), s.size()); + UNIT_ASSERT(n == 1); + UNIT_ASSERT(s == ASCIIToWide(" ")); + + s.clear(); + n = Collapse(s.begin(), s.size()); + UNIT_ASSERT(n == 0); + UNIT_ASSERT(s == TUtf16String()); + } + + void TestStrip() { + TUtf16String s; + + Strip(s); + UNIT_ASSERT(s == TUtf16String()); + StripLeft(s); + UNIT_ASSERT(s == TUtf16String()); + StripRight(s); + UNIT_ASSERT(s == TUtf16String()); + + s = ASCIIToWide(" \t\r\n"); + Strip(s); + UNIT_ASSERT(s == TUtf16String()); + s = ASCIIToWide(" \t\r\n"); + StripLeft(s); + UNIT_ASSERT(s == TUtf16String()); + s = ASCIIToWide(" \t\r\n"); + StripRight(s); + UNIT_ASSERT(s == TUtf16String()); + + s = ASCIIToWide("\t\f\va \r\n"); + Strip(s); + UNIT_ASSERT(s == ASCIIToWide("a")); + s = ASCIIToWide("\t\f\va \r\n"); + StripLeft(s); + UNIT_ASSERT(s == ASCIIToWide("a \r\n")); + s = ASCIIToWide("\t\f\va \r\n"); + StripRight(s); + UNIT_ASSERT(s == ASCIIToWide("\t\f\va")); + + s = ASCIIToWide("\r\na\r\nb\t\tc\r\n"); + Strip(s); + UNIT_ASSERT(s == ASCIIToWide("a\r\nb\t\tc")); + s = ASCIIToWide("\r\na\r\nb\t\tc\r\n"); + StripLeft(s); + UNIT_ASSERT(s == ASCIIToWide("a\r\nb\t\tc\r\n")); + s = ASCIIToWide("\r\na\r\nb\t\tc\r\n"); + StripRight(s); + UNIT_ASSERT(s == ASCIIToWide("\r\na\r\nb\t\tc")); + + const TUtf16String w(ASCIIToWide("a b")); + s = w; + Strip(s); + UNIT_ASSERT(s == w); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.c_str() == w.c_str()); // Strip() does not change the string at all +#endif + s = w; + StripLeft(s); + UNIT_ASSERT(s == w); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.c_str() == w.c_str()); // Strip() does not change the string at all +#endif + s = w; + StripRight(s); + UNIT_ASSERT(s == w); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.c_str() == w.c_str()); // Strip() does not change the string at all +#endif + } + + void TestIsSpace() { + UNIT_ASSERT(!IsSpace(TUtf16String())); + + UNIT_ASSERT(IsSpace(ws, Y_ARRAY_SIZE(ws))); + + TUtf16String w; + w.assign(ws, Y_ARRAY_SIZE(ws)).append(TUtf16String(1, '!')); + UNIT_ASSERT(!IsSpace(w.c_str(), w.size())); + + w.assign(TUtf16String(1, '_')).append(ws, Y_ARRAY_SIZE(ws)); + UNIT_ASSERT(!IsSpace(w.c_str(), w.size())); + + w.assign(ws, Y_ARRAY_SIZE(ws)).append(TUtf16String(1, '$')).append(ws, Y_ARRAY_SIZE(ws)); + UNIT_ASSERT(!IsSpace(w.c_str(), w.size())); + } + + void TestEscapeHtmlChars() { + // characters from the first half of the ASCII table + for (wchar16 c = 1; c < 0x7F; ++c) { + TUtf16String w(1, c); + EscapeHtmlChars<false>(w); + + switch (c) { + case '<': + UNIT_ASSERT(w == ASCIIToWide("<")); + break; + case '>': + UNIT_ASSERT(w == ASCIIToWide(">")); + break; + case '&': + UNIT_ASSERT(w == ASCIIToWide("&")); + break; + case '"': + UNIT_ASSERT(w == ASCIIToWide(""")); + break; + default: + UNIT_ASSERT(w == TUtf16String(1, c)); + break; + } + } + + for (wchar16 c = 1; c < 0x7F; ++c) { + TUtf16String w(1, c); + EscapeHtmlChars<true>(w); + + switch (c) { + case '<': + UNIT_ASSERT(w == ASCIIToWide("<")); + break; + case '>': + UNIT_ASSERT(w == ASCIIToWide(">")); + break; + case '&': + UNIT_ASSERT(w == ASCIIToWide("&")); + break; + case '"': + UNIT_ASSERT(w == ASCIIToWide(""")); + break; + case '\r': + case '\n': + UNIT_ASSERT(w == ASCIIToWide("<BR>")); + break; + default: + UNIT_ASSERT(w == TUtf16String(1, c)); + break; + } + } + } + + void TestToLower() { + const size_t n = 32; + wchar16 upperCase[n]; + std::copy(wideCyrillicAlphabet, wideCyrillicAlphabet + n, upperCase); + ToLower(upperCase, n); + UNIT_ASSERT(TWtringBuf(upperCase, n) == TWtringBuf(wideCyrillicAlphabet + n, n)); + } + + void TestToUpper() { + const size_t n = 32; + wchar16 lowerCase[n]; + std::copy(wideCyrillicAlphabet + n, wideCyrillicAlphabet + n * 2, lowerCase); + ToUpper(lowerCase, n); + UNIT_ASSERT(TWtringBuf(lowerCase, n) == TWtringBuf(wideCyrillicAlphabet, n)); + } + + void TestWideString() { + const TUtf16String original = UTF32ToWide(WideStringTestData[0], CaseTestDataSize); + const TUtf16String lower = UTF32ToWide(WideStringTestData[1], CaseTestDataSize); + const TUtf16String upper = UTF32ToWide(WideStringTestData[2], CaseTestDataSize); + const TUtf16String title = UTF32ToWide(WideStringTestData[3], CaseTestDataSize); + TUtf16String temp; + + temp = original; + temp.to_lower(); + UNIT_ASSERT(temp == lower); + + temp = original; + ToLower(temp.begin(), temp.size()); + UNIT_ASSERT(temp == lower); + + temp = original; + temp.to_upper(); + UNIT_ASSERT(temp == upper); + + temp = original; + ToUpper(temp.begin(), temp.size()); + UNIT_ASSERT(temp == upper); + + temp = original; + temp.to_title(); + UNIT_ASSERT(temp == title); + + temp = original; + ToTitle(temp.begin(), temp.size()); + UNIT_ASSERT(temp == title); + + TVector<wchar32> buffer(WideStringTestData[0], WideStringTestData[0] + CaseTestDataSize); + std::reverse(buffer.begin(), buffer.end()); + const TUtf16String reversed = UTF32ToWide(buffer.data(), buffer.size()); + + temp = original; + ReverseInPlace(temp); + UNIT_ASSERT(temp == reversed); + } + + void TestCountWideChars() { + UNIT_ASSERT_EQUAL(CountWideChars(UTF8ToWide("привет!")), 7); + TUtf16String wideStr = UTF8ToWide("\xf0\x9f\x92\xb8привет!"); + UNIT_ASSERT_EQUAL(wideStr.size(), 9); + UNIT_ASSERT_EQUAL(CountWideChars(wideStr), 8); + } + + void TestIsValidUTF16() { + static wchar16 str1[] = {'h', 'e', 'l', 'l', 'o', '!', 0}; + static wchar16 str2[] = {'h', 'e', 'l', 'l', 'o', 0xD842, 0xDEAD, '!', 0}; + static wchar16 str3[] = {'h', 'e', 'l', 'l', 'o', 0xD842, '!', 0}; + static wchar16 str4[] = {'h', 'e', 'l', 'l', 'o', 0xDEAD, 0xD842, '!', 0}; + static wchar16 str5[] = {'h', 'e', 'l', 'l', 'o', 0xD842, 0xDEAD, 0xDEAD, '!', 0}; + UNIT_ASSERT(IsValidUTF16(TWtringBuf(str1))); + UNIT_ASSERT(IsValidUTF16(TWtringBuf(str2))); + UNIT_ASSERT(!IsValidUTF16(TWtringBuf(str3))); + UNIT_ASSERT(!IsValidUTF16(TWtringBuf(str4))); + UNIT_ASSERT(!IsValidUTF16(TWtringBuf(str5))); + } + + void TestIsStringASCII() { + static char charAscii[] = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"; + static wchar16 char16Ascii[] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'A', + 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', 'A', 'B', 'C', 'D', 'E', 'F', 0}; + + // Test a variety of the fragment start positions and lengths in order to make + // sure that bit masking in IsStringASCII works correctly. + // Also, test that a non-ASCII character will be detected regardless of its + // position inside the string. + { + const size_t stringLength = Y_ARRAY_SIZE(charAscii) - 1; + for (size_t offset = 0; offset < 8; ++offset) { + for (size_t len = 0, maxLen = stringLength - offset; len < maxLen; ++len) { + UNIT_ASSERT(IsStringASCII(charAscii + offset, charAscii + offset + len)); + for (size_t charPos = offset; charPos < len; ++charPos) { + charAscii[charPos] |= '\x80'; + UNIT_ASSERT(!IsStringASCII(charAscii + offset, charAscii + offset + len)); + charAscii[charPos] &= ~'\x80'; + } + } + } + } + + { + const size_t stringLength = Y_ARRAY_SIZE(char16Ascii) - 1; + for (size_t offset = 0; offset < 4; ++offset) { + for (size_t len = 0, maxLen = stringLength - offset; len < maxLen; ++len) { + UNIT_ASSERT(IsStringASCII(char16Ascii + offset, char16Ascii + offset + len)); + + for (size_t charPos = offset; charPos < len; ++charPos) { + char16Ascii[charPos] |= 0x80; + UNIT_ASSERT( + !IsStringASCII(char16Ascii + offset, char16Ascii + offset + len)); + + char16Ascii[charPos] &= ~0x80; + // Also test when the upper half is non-zero. + char16Ascii[charPos] |= 0x100; + UNIT_ASSERT( + !IsStringASCII(char16Ascii + offset, char16Ascii + offset + len)); + char16Ascii[charPos] &= ~0x100; + } + } + } + } + } + + void TestIsLowerWordStr() { + UNIT_ASSERT(IsLowerWord(TWtringBuf())); + UNIT_ASSERT(IsLowerWord(UTF8ToWide(""))); + UNIT_ASSERT(IsLowerWord(UTF8ToWide("test"))); + UNIT_ASSERT(IsLowerWord(UTF8ToWide("тест"))); // "тест" is "test" in russian (cyrrilic) + UNIT_ASSERT(!IsLowerWord(UTF8ToWide("тест тест"))); + UNIT_ASSERT(!IsLowerWord(UTF8ToWide("тест100500"))); + + UNIT_ASSERT(!IsLowerWord(UTF8ToWide("Test"))); + UNIT_ASSERT(!IsLowerWord(UTF8ToWide("tesT"))); + UNIT_ASSERT(!IsLowerWord(UTF8ToWide("tEst"))); + + UNIT_ASSERT(!IsLowerWord(UTF8ToWide("Тест"))); + UNIT_ASSERT(!IsLowerWord(UTF8ToWide("теСт"))); + UNIT_ASSERT(!IsLowerWord(UTF8ToWide("тесТ"))); + } + + void TestIsUpperWordStr() { + UNIT_ASSERT(IsUpperWord(TWtringBuf())); + UNIT_ASSERT(IsUpperWord(UTF8ToWide(""))); + UNIT_ASSERT(IsUpperWord(UTF8ToWide("TEST"))); + UNIT_ASSERT(IsUpperWord(UTF8ToWide("ТЕСТ"))); + UNIT_ASSERT(!IsUpperWord(UTF8ToWide("тест тест"))); + UNIT_ASSERT(!IsUpperWord(UTF8ToWide("тест100500"))); + + UNIT_ASSERT(!IsUpperWord(UTF8ToWide("Test"))); + UNIT_ASSERT(!IsUpperWord(UTF8ToWide("tesT"))); + UNIT_ASSERT(!IsUpperWord(UTF8ToWide("tEst"))); + + UNIT_ASSERT(!IsUpperWord(UTF8ToWide("Тест"))); + UNIT_ASSERT(!IsUpperWord(UTF8ToWide("теСт"))); + UNIT_ASSERT(!IsUpperWord(UTF8ToWide("тесТ"))); + } + + void TestIsTitleStr() { + UNIT_ASSERT(!IsTitleWord(TWtringBuf())); + UNIT_ASSERT(!IsTitleWord(UTF8ToWide(""))); + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("t"))); + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("й"))); + UNIT_ASSERT(IsTitleWord(UTF8ToWide("T"))); + UNIT_ASSERT(IsTitleWord(UTF8ToWide("Й"))); + UNIT_ASSERT(IsTitleWord(UTF8ToWide("Test"))); + UNIT_ASSERT(IsTitleWord(UTF8ToWide("Тест"))); + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("тест тест"))); + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("тест100500"))); + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("Тест тест"))); + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("Тест100500"))); + + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("tesT"))); + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("tEst"))); + + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("теСт"))); + UNIT_ASSERT(!IsTitleWord(UTF8ToWide("тесТ"))); + } + + void TestIsLowerStr() { + UNIT_ASSERT(IsLower(TWtringBuf())); + UNIT_ASSERT(IsLower(UTF8ToWide(""))); + UNIT_ASSERT(IsLower(UTF8ToWide("test"))); + UNIT_ASSERT(IsLower(UTF8ToWide("тест"))); // "тест" is "test" in russian (cyrrilic) + UNIT_ASSERT(IsLower(UTF8ToWide("тест тест"))); + UNIT_ASSERT(IsLower(UTF8ToWide("тест100500"))); + + UNIT_ASSERT(!IsLower(UTF8ToWide("Test"))); + UNIT_ASSERT(!IsLower(UTF8ToWide("tesT"))); + UNIT_ASSERT(!IsLower(UTF8ToWide("tEst"))); + + UNIT_ASSERT(!IsLower(UTF8ToWide("Тест"))); + UNIT_ASSERT(!IsLower(UTF8ToWide("теСт"))); + UNIT_ASSERT(!IsLower(UTF8ToWide("тесТ"))); + } + + void TestIsUpperStr() { + UNIT_ASSERT(IsUpper(TWtringBuf())); + UNIT_ASSERT(IsUpper(UTF8ToWide(""))); + UNIT_ASSERT(IsUpper(UTF8ToWide("TEST"))); + UNIT_ASSERT(IsUpper(UTF8ToWide("ТЕСТ"))); + UNIT_ASSERT(IsUpper(UTF8ToWide("ТЕСТ ТЕСТ"))); + UNIT_ASSERT(IsUpper(UTF8ToWide("ТЕСТ100500"))); + + UNIT_ASSERT(!IsUpper(UTF8ToWide("Test"))); + UNIT_ASSERT(!IsUpper(UTF8ToWide("tesT"))); + UNIT_ASSERT(!IsUpper(UTF8ToWide("tEst"))); + + UNIT_ASSERT(!IsUpper(UTF8ToWide("Тест"))); + UNIT_ASSERT(!IsUpper(UTF8ToWide("теСт"))); + UNIT_ASSERT(!IsUpper(UTF8ToWide("тесТ"))); + } + + void TestToLowerStr() { + // In these test and test for `ToUpper` and `ToTitle` we are checking that string keep + // pointing to the same piece of memory we are doing it the following way: + // + // TUtf16String s = ... + // const auto copy = s; + // ... + // UNIT_ASSERT(s.data() == copy.data()) + // + // It saves us a couple lines (we are reusing `copy` later) and if one day `TString` will + // become non-refcounted we'll need to rewrite it to something like: + // + // TUtf16String s = ... + // const auto* const data = s.data(); + // const auto length = s.length(); + // ... + // UNIT_ASSERT(s.data() == data); + // UNIT_ASSERT(s.length() == length); + { + TUtf16String s; + auto writableCopy = s; + const auto copy = s; + const TUtf16String lower; + + UNIT_ASSERT(!ToLower(s)); + UNIT_ASSERT(s == lower); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToLower(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(!ToLower(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(ToLowerRet(copy) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower); + } + { + TUtf16String s = UTF8ToWide(""); + auto writableCopy = s; + const auto copy = s; + const TUtf16String lower; + + UNIT_ASSERT(!ToLower(s)); + UNIT_ASSERT(s == lower); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToLower(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(!ToLower(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(ToLowerRet(copy) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower); + } + { + TUtf16String s; + const auto copy = s; + const TUtf16String lower; + + UNIT_ASSERT(!ToLower(s, 100500)); + UNIT_ASSERT(s == lower); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(ToLowerRet(copy, 100500) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 100500) == lower); + } + { + TUtf16String s; + const auto copy = s; + const TUtf16String lower; + + UNIT_ASSERT(!ToLower(s, 100500, 1111)); + UNIT_ASSERT(s == lower); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(ToLowerRet(copy, 100500, 1111) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 100500, 1111) == lower); + } + { + auto s = UTF8ToWide("Й"); + auto writableCopy = s; + const auto copy = s; + const auto lower = UTF8ToWide("й"); + + UNIT_ASSERT(ToLower(s)); + UNIT_ASSERT(s == lower); + + UNIT_ASSERT(ToLower(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(ToLower(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(ToLowerRet(copy) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower); + } + { + auto s = UTF8ToWide("й"); + auto writableCopy = s; + const auto copy = s; + const auto lower = UTF8ToWide("й"); + + UNIT_ASSERT(!ToLower(s)); + UNIT_ASSERT(s == lower); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToLower(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(!ToLower(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(ToLowerRet(copy) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower); + } + { + auto s = UTF8ToWide("тест"); + auto writableCopy = s; + const auto copy = s; + const auto lower = UTF8ToWide("тест"); + + UNIT_ASSERT(!ToLower(s)); + UNIT_ASSERT(s == lower); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToLower(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(!ToLower(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(ToLowerRet(copy) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower); + } + { + auto s = UTF8ToWide("Тест"); + auto writableCopy = s; + const auto copy = s; + const auto lower = UTF8ToWide("тест"); + + UNIT_ASSERT(ToLower(s)); + UNIT_ASSERT(s == lower); + + UNIT_ASSERT(ToLower(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(ToLower(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == lower); + + UNIT_ASSERT(ToLowerRet(copy) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower); + } + { + TUtf16String s = UTF8ToWide("тЕст"); + const auto copy = s; + const auto lower = UTF8ToWide("тест"); + + UNIT_ASSERT(ToLower(s)); + UNIT_ASSERT(s == UTF8ToWide("тест")); + + UNIT_ASSERT(ToLowerRet(copy) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy)) == lower); + } + { + auto s = UTF8ToWide("тЕст"); + const auto copy = s; + const auto lower = UTF8ToWide("тЕст"); + + UNIT_ASSERT(!ToLower(s, 2)); + UNIT_ASSERT(s == lower); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(ToLowerRet(copy, 2) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 2) == lower); + } + { + auto s = UTF8ToWide("теСт"); + const auto copy = s; + const auto lower = UTF8ToWide("тест"); + + UNIT_ASSERT(ToLower(s, 2)); + UNIT_ASSERT(s == lower); + + UNIT_ASSERT(ToLowerRet(copy, 2) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 2) == lower); + } + { + auto s = UTF8ToWide("теСт"); + const auto copy = s; + const auto lower = UTF8ToWide("теСт"); + + UNIT_ASSERT(!ToLower(s, 3, 1)); + UNIT_ASSERT(s == copy); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(ToLowerRet(copy, 3, 1) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 3, 1) == lower); + } + { + auto s = UTF8ToWide("теСт"); + const auto copy = s; + const auto lower = UTF8ToWide("теСт"); + + UNIT_ASSERT(!ToLower(s, 3, 100500)); + UNIT_ASSERT(s == copy); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(ToLowerRet(copy, 3, 100500) == lower); + UNIT_ASSERT(ToLowerRet(TWtringBuf(copy), 3, 100500) == lower); + } + } + + void TestToUpperStr() { + { + TUtf16String s; + auto writableCopy = s; + const auto copy = s; + const TUtf16String upper; + + UNIT_ASSERT(!ToUpper(s)); + UNIT_ASSERT(s == upper); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToUpper(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(!ToUpper(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpperRet(copy) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper); + } + { + auto s = UTF8ToWide(""); + auto writableCopy = s; + const auto copy = s; + const TUtf16String upper; + + UNIT_ASSERT(!ToUpper(s)); + UNIT_ASSERT(s == upper); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToUpper(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(!ToUpper(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpperRet(copy) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper); + } + { + TUtf16String s; + auto writableCopy = s; + const auto copy = s; + const TUtf16String upper; + + UNIT_ASSERT(!ToUpper(s, 100500)); + UNIT_ASSERT(s == upper); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToUpper(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(!ToUpper(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpperRet(copy, 100500) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 100500) == upper); + } + { + TUtf16String s; + const auto copy = s; + const TUtf16String upper; + + UNIT_ASSERT(!ToUpper(s, 100500, 1111)); + UNIT_ASSERT(s == upper); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(ToUpperRet(copy, 100500, 1111) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 100500, 1111) == upper); + } + { + auto s = UTF8ToWide("й"); + auto writableCopy = s; + const auto copy = s; + const auto upper = UTF8ToWide("Й"); + + UNIT_ASSERT(ToUpper(s)); + UNIT_ASSERT(s == upper); + + UNIT_ASSERT(ToUpper(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpper(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpperRet(copy) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper); + } + { + auto s = UTF8ToWide("Й"); + auto writableCopy = s; + const auto copy = s; + const auto upper = UTF8ToWide("Й"); + + UNIT_ASSERT(!ToUpper(s)); + UNIT_ASSERT(s == copy); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToUpper(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(!ToUpper(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpperRet(copy) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper); + } + { + auto s = UTF8ToWide("тест"); + auto writableCopy = s; + const auto copy = s; + const auto upper = UTF8ToWide("ТЕСТ"); + + UNIT_ASSERT(ToUpper(s)); + UNIT_ASSERT(s == upper); + + UNIT_ASSERT(ToUpper(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpper(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpperRet(copy) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper); + } + { + auto s = UTF8ToWide("Тест"); + auto writableCopy = s; + const auto copy = s; + const auto upper = UTF8ToWide("ТЕСТ"); + + UNIT_ASSERT(ToUpper(s)); + UNIT_ASSERT(s == upper); + + UNIT_ASSERT(ToUpper(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpper(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpperRet(copy) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper); + } + { + auto s = UTF8ToWide("тЕст"); + auto writableCopy = s; + const auto copy = s; + const auto upper = UTF8ToWide("ТЕСТ"); + + UNIT_ASSERT(ToUpper(s)); + UNIT_ASSERT(s == upper); + + UNIT_ASSERT(ToUpper(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpper(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == upper); + + UNIT_ASSERT(ToUpperRet(copy) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy)) == upper); + } + { + auto s = UTF8ToWide("тЕст"); + const auto copy = s; + const auto upper = UTF8ToWide("тЕСТ"); + + UNIT_ASSERT(ToUpper(s, 2)); + UNIT_ASSERT(s == upper); + + UNIT_ASSERT(ToUpperRet(copy, 2) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 2) == upper); + } + { + auto s = UTF8ToWide("теСт"); + const auto copy = s; + const auto upper = UTF8ToWide("теСТ"); + + UNIT_ASSERT(ToUpper(s, 2)); + UNIT_ASSERT(s == upper); + + UNIT_ASSERT(ToUpperRet(copy, 2) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 2) == upper); + } + { + auto s = UTF8ToWide("теСт"); + const auto copy = s; + const auto upper = UTF8ToWide("теСТ"); + + UNIT_ASSERT(ToUpper(s, 3, 1)); + UNIT_ASSERT(s == upper); + + UNIT_ASSERT(ToUpperRet(copy, 3, 1) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 3, 1) == upper); + } + { + auto s = UTF8ToWide("теСт"); + const auto copy = s; + const auto upper = UTF8ToWide("теСТ"); + + UNIT_ASSERT(ToUpper(s, 3, 100500)); + UNIT_ASSERT(s == upper); + + UNIT_ASSERT(ToUpperRet(copy, 3, 100500) == upper); + UNIT_ASSERT(ToUpperRet(TWtringBuf(copy), 3, 100500) == upper); + } + } + + void TestToTitleStr() { + { + TUtf16String s; + auto writableCopy = s; + const auto copy = s; + const TUtf16String title; + + UNIT_ASSERT(!ToTitle(s)); + UNIT_ASSERT(s == title); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToTitle(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(!ToTitle(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitleRet(copy) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title); + } + { + auto s = UTF8ToWide(""); + auto writableCopy = s; + const auto copy = s; + const TUtf16String title; + + UNIT_ASSERT(!ToTitle(s)); + UNIT_ASSERT(s == title); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToTitle(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(!ToTitle(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitleRet(copy) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title); + } + { + TUtf16String s; + const auto copy = s; + const TUtf16String title; + + UNIT_ASSERT(!ToTitle(s, 100500)); + UNIT_ASSERT(s == title); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(ToTitleRet(copy) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title); + } + { + TUtf16String s; + const auto copy = s; + const TUtf16String title; + + UNIT_ASSERT(!ToTitle(s, 100500, 1111)); + UNIT_ASSERT(s == title); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(ToTitleRet(copy) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title); + } + { + auto s = UTF8ToWide("й"); + auto writableCopy = s; + const auto copy = s; + const auto title = UTF8ToWide("Й"); + + UNIT_ASSERT(ToTitle(s)); + UNIT_ASSERT(s == title); + + UNIT_ASSERT(ToTitle(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitle(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitleRet(copy) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title); + } + { + auto s = UTF8ToWide("Й"); + auto writableCopy = s; + const auto copy = s; + const auto title = UTF8ToWide("Й"); + + UNIT_ASSERT(!ToTitle(s)); + UNIT_ASSERT(s == title); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToTitle(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(!ToTitle(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitleRet(copy) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title); + } + { + auto s = UTF8ToWide("тест"); + auto writableCopy = s; + const auto copy = s; + const auto title = UTF8ToWide("Тест"); + + UNIT_ASSERT(ToTitle(s)); + UNIT_ASSERT(s == title); + + UNIT_ASSERT(ToTitle(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitle(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitleRet(copy) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title); + } + { + auto s = UTF8ToWide("Тест"); + auto writableCopy = s; + const auto copy = s; + const auto title = UTF8ToWide("Тест"); + + UNIT_ASSERT(!ToTitle(s)); + UNIT_ASSERT(s == title); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(!ToTitle(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(!ToTitle(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitleRet(copy) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title); + } + { + auto s = UTF8ToWide("тЕст"); + auto writableCopy = s; + const auto copy = s; + const auto title = UTF8ToWide("Тест"); + + UNIT_ASSERT(ToTitle(s)); + UNIT_ASSERT(s == title); + + UNIT_ASSERT(ToTitle(writableCopy.Detach(), writableCopy.size())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitle(copy.data(), copy.size(), writableCopy.Detach())); + UNIT_ASSERT(writableCopy == title); + + UNIT_ASSERT(ToTitleRet(copy) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy)) == title); + } + { + auto s = UTF8ToWide("тЕст"); + const auto copy = s; + const auto title = UTF8ToWide("тЕСт"); + + UNIT_ASSERT(ToTitle(s, 2)); + UNIT_ASSERT(s == title); + + UNIT_ASSERT(ToTitleRet(copy, 2) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy), 2) == title); + } + { + auto s = UTF8ToWide("теСт"); + const auto copy = s; + const auto title = UTF8ToWide("теСт"); + + UNIT_ASSERT(!ToTitle(s, 2)); + UNIT_ASSERT(s == title); +#ifndef TSTRING_IS_STD_STRING + UNIT_ASSERT(s.data() == copy.data()); +#endif + + UNIT_ASSERT(ToTitleRet(copy, 2) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy), 2) == title); + } + { + auto s = UTF8ToWide("теСт"); + const auto copy = s; + const auto title = UTF8ToWide("теСТ"); + + UNIT_ASSERT(ToTitle(s, 3, 1)); + UNIT_ASSERT(s == title); + + UNIT_ASSERT(ToTitleRet(copy, 3, 1) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy), 3, 1) == title); + } + { + auto s = UTF8ToWide("теСт"); + const auto copy = s; + const auto title = UTF8ToWide("теСТ"); + + UNIT_ASSERT(ToTitle(s, 3, 100500)); + UNIT_ASSERT(s == title); + + UNIT_ASSERT(ToTitleRet(copy, 3, 100500) == title); + UNIT_ASSERT(ToTitleRet(TWtringBuf(copy), 3, 100500) == title); + } + } +}; + +UNIT_TEST_SUITE_REGISTRATION(TWideUtilTest); diff --git a/util/charset/ya.make b/util/charset/ya.make new file mode 100644 index 0000000000..26d38cb10b --- /dev/null +++ b/util/charset/ya.make @@ -0,0 +1,35 @@ +LIBRARY() + +OWNER(g:util) +SUBSCRIBER(g:util-subscribers) + +NO_UTIL() + +IF (TSTRING_IS_STD_STRING) + CFLAGS(GLOBAL -DTSTRING_IS_STD_STRING) +ENDIF() + +JOIN_SRCS( + all_charset.cpp + generated/unidata.cpp + recode_result.cpp + unicode_table.cpp + unidata.cpp + utf8.cpp + wide.cpp +) + +IF (ARCH_X86_64 AND NOT DISABLE_INSTRUCTION_SETS) + SRC_CPP_SSE41(wide_sse41.cpp) +ELSE() + SRC( + wide_sse41.cpp + -DSSE41_STUB + ) +ENDIF() + +END() + +RECURSE_FOR_TESTS( + ut +) |