1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Unicode: Perform major refactor

This commit encapsulates the following:
* Removal of public Unicode classes.
* Move to new 'blob' generated data format.
* Fix issue where numerical characters would be assigned incorrect bidirectional levels, resulting in them rendering in the wrong order.
* Adds a unit test for the number ordering issue.
* Refactor of Bidirectional and Line breaking algorithms.
This commit is contained in:
Oliver James 2024-05-22 14:57:48 +01:00
parent 75e8c52d20
commit 0b60559905
14 changed files with 2715 additions and 5667 deletions

View file

@ -148,14 +148,12 @@
#include "fonts/juce_FunctionPointerDestructor.h"
#include "native/juce_EventTracing.h"
#include "unicode/juce_UnicodeScript.h"
#include "unicode/juce_Unicode.h"
#include "unicode/juce_UnicodeGenerated.cpp"
#include "unicode/juce_UnicodeUtils.cpp"
#include "unicode/juce_UnicodeLine.cpp"
#include "unicode/juce_UnicodeScript.cpp"
#include "unicode/juce_UnicodeBrackets.cpp"
#include "unicode/juce_UnicodeBidi.cpp"
#include "unicode/juce_UnicodeGrapheme.cpp"
#include "unicode/juce_Unicode.cpp"
#include "colour/juce_Colour.cpp"
#include "colour/juce_ColourGradient.cpp"

File diff suppressed because it is too large Load diff

View file

@ -35,47 +35,153 @@
namespace juce
{
Array<Unicode::Codepoint> Unicode::performAnalysis (const String& string)
//==============================================================================
/*
A collection of methods and types for breaking down text into a unicode representation.
*/
class Unicode
{
if (string.isEmpty())
return {};
thread_local std::unordered_map<String, Array<Unicode::Codepoint>> cache;
auto& result = cache[string];
if (! result.isEmpty())
return result;
auto analysisBuffer = [&str = std::as_const (string)]
struct Key
{
std::vector<UnicodeAnalysisPoint> points;
String text;
std::optional<TextDirection> directionOverride;
const auto data = str.toUTF32();
const auto length = data.length();
auto tie() const { return std::tie (text, directionOverride); }
bool operator< (const Key& other) const { return tie() < other.tie(); }
};
points.reserve (length);
public:
Unicode() = delete;
std::transform (data.getAddress(), data.getAddress() + length, std::back_inserter (points), [] (uint32_t cp)
//==============================================================================
/* A unicode Codepoint, from this you can infer various Unicode properties such
as direction, logical string index and breaking type, etc.
*/
struct Codepoint
{
uint32_t codepoint;
size_t logicalIndex; // Index of the character in the source string
size_t visualIndex;
TextBreakType breaking; // Breaking characteristics of this codepoint
TextDirection direction; // Direction of this codepoint
TextScript script; // Script class for this codepoint
};
template <typename Value>
static auto prefix (Span<Value> v, size_t num)
{
return Span { v.data(), std::min (v.size(), num) };
}
template <typename Value>
static auto removePrefix (Span<Value> v, size_t num)
{
const auto increment = std::min (v.size(), num);
return Span { v.data() + increment, v.size() - increment };
}
//==============================================================================
/* Performs unicode analysis on a piece of text and returns an array of Codepoints
in logical order.
*/
static Array<Codepoint> performAnalysis (const String& string, std::optional<TextDirection> textDirection = {})
{
if (string.isEmpty())
return {};
thread_local LruCache<Key, Array<Unicode::Codepoint>> cache;
return cache.get ({ string, textDirection }, analysisCallback);
}
//==============================================================================
template <typename Traits>
struct Iterator
{
using ValueType = typename Traits::ValueType;
Iterator() = default;
explicit Iterator (Span<ValueType> s) : data (s) {}
std::optional<Span<ValueType>> next()
{
UnicodeAnalysisPoint p;
if (data.empty())
return {};
p.character = cp;
p.data = getUnicodeDataForCodepoint (cp);
p.bidi.level = 0;
const auto breakpoint = std::find_if (data.begin(), data.end(), [&] (const auto& i)
{
return ! Traits::compare (i, data.front());
});
const auto lengthToBreak = (size_t) std::distance (data.begin(), breakpoint) + (Traits::includeBreakingIndex() ? 1 : 0);
const ScopeGuard scope { [&] { data = removePrefix (data, lengthToBreak); } };
return prefix (data, lengthToBreak);
}
//#define JUCE_TR9_UPPERCASE_IS_RTL
#if defined (JUCE_TR9_UPPERCASE_IS_RTL)
if (cp >= 65 && cp <= 90)
p.data.bidi = BidiType::al;
#undef JUCE_TR9_UPPERCASE_IS_RTL
#endif
private:
Span<ValueType> data;
};
return p;
});
struct BidiTraits
{
using ValueType = const Codepoint;
return points;
}();
static bool compare (const Codepoint& t1, const Codepoint& t2)
{
return t1.direction == t2.direction;
}
static bool includeBreakingIndex() { return false; }
};
using BidiRunIterator = Iterator<BidiTraits>;
struct LineTraits
{
using ValueType = const Codepoint;
static bool compare (const Codepoint& t1, const Codepoint&)
{
return t1.breaking != TextBreakType::hard;
}
static bool includeBreakingIndex() { return true; }
};
using LineBreakIterator = Iterator<LineTraits>;
struct WordTraits
{
using ValueType = const Codepoint;
static bool compare (const Codepoint& t1, const Codepoint&)
{
return t1.breaking != TextBreakType::soft;
}
static bool includeBreakingIndex() { return false; }
};
using WordBreakIterator = Iterator<WordTraits>;
struct ScriptTraits
{
using ValueType = const Codepoint;
static bool compare (const Codepoint& t1, const Codepoint& t2)
{
return t1.script == t2.script;
}
static bool includeBreakingIndex() { return false; }
};
using ScriptRunIterator = Iterator<ScriptTraits>;
private:
struct ParagraphIterator
{
explicit ParagraphIterator (Span<UnicodeAnalysisPoint> Span) : data (Span) {}
@ -85,244 +191,131 @@ Array<Unicode::Codepoint> Unicode::performAnalysis (const String& string)
const auto start = head;
auto end = start;
if ((size_t) start < data.size())
if ((size_t) start >= data.size())
return std::nullopt;
while ((size_t) end < data.size())
{
while ((size_t) end < data.size())
{
if (data[(size_t) end].character == 0x2029)
break;
constexpr auto paragraphSeparator = 0x2029;
end++;
}
if (data[(size_t) end].character == paragraphSeparator)
break;
head = end + 1;
return std::make_optional (Range<int> { start, end });
end++;
}
return nullopt;
head = end + 1;
return std::make_optional (Range<int> { start, end });
}
Span<UnicodeAnalysisPoint> data;
int head = 0;
};
result.resize ((int) analysisBuffer.size());
for (size_t i = 0; i < analysisBuffer.size(); i++)
result.getReference ((int) i).codepoint = analysisBuffer[i].character;
tr24::analyseScripts (analysisBuffer, [&result] (int index, TextScript script)
static Array<Unicode::Codepoint> analysisCallback (const Key& key)
{
result.getReference (index).script = script;
});
tr14::analyseLineBreaks (analysisBuffer, [&result] (int index, TextBreakType type)
{
result.getReference ((int) index).breaking = type;
});
ParagraphIterator iter { analysisBuffer };
while (auto range = iter.next())
{
const auto run = Span { analysisBuffer.data() + (size_t) range->getStart(), (size_t) range->getLength() };
const auto bidi = tr9::analyseBidiRun (run);
for (size_t i = 0; i < (size_t) range->getLength(); i++)
auto analysisBuffer = [&key]
{
auto& point = result.getReference ((int) i + range->getStart());
std::vector<UnicodeAnalysisPoint> points;
point.direction = bidi.resolvedLevels[i] % 2 == 0 ? TextDirection::ltr : TextDirection::rtl;
point.logicalIndex = (size_t) range->getStart() + i;
point.visualIndex = (size_t) bidi.visualOrder[i];
}
}
const auto data = key.text.toUTF32();
const auto length = data.length();
return result;
}
points.reserve (length);
// https://unicode-org.github.io/icu/userguide/transforms/bidi.html#logical-order-versus-visual-order
Array<Unicode::Codepoint> Unicode::convertLogicalToVisual (Span<const Unicode::Codepoint> codepoints)
{
Array<Unicode::Codepoint> visual;
std::transform (data.getAddress(), data.getAddress() + length, std::back_inserter (points), [] (uint32_t cp)
{
UnicodeAnalysisPoint p { cp, UnicodeDataTable::getDataForCodepoint (cp) };
visual.resize ((int) codepoints.size());
// Define this to enable TR9 debugging. All upper case
// characters will be interpreted as right-to-left.
#if defined (JUCE_TR9_UPPERCASE_IS_RTL)
if (65 <= cp && cp <= 90)
p.data.bidi = BidiType::al;
#endif
for (const auto& codepoint : codepoints)
visual.set ((int) codepoint.visualIndex, codepoint);
return p;
});
return visual;
}
bool UnicodeFunctions::isRenderableCharacter (juce_wchar character)
{
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wswitch-enum")
switch (getUnicodeDataForCodepoint ((uint32_t) character).bt)
{
case LineBreakType::cr:
case LineBreakType::lf:
case LineBreakType::bk:
case LineBreakType::nl:
case LineBreakType::sp:
case LineBreakType::zw:
case LineBreakType::zwj:
case LineBreakType::cm:
case LineBreakType::cb:
return false;
default: break;
}
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
return true;
}
bool UnicodeFunctions::isBreakableWhitespace (juce_wchar character)
{
switch (character)
{
case 0x0020: case 0x1680: case 0x180E: case 0x2000:
case 0x2001: case 0x2002: case 0x2003: case 0x2004:
case 0x2005: case 0x2006: case 0x2007: case 0x2008:
case 0x2009: case 0x200A: case 0x200B: case 0x202F:
case 0x205F: case 0x3000:
return true;
default: break;
}
return false;
}
bool UnicodeFunctions::isEmoji (juce_wchar character)
{
return getEmojiType ((uint32_t) character) != EmojiType::no;
}
bool UnicodeFunctions::shouldVerticalGlyphRotate (juce_wchar character)
{
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wswitch-enum")
switch (getUnicodeDataForCodepoint ((uint32_t) character).vertical)
{
case VerticalTransformType::R:
case VerticalTransformType::Tr:
case VerticalTransformType::Tu: return true;
default: break;
}
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
return false;
}
//#define JUCE_UNICODE_UNIT_TESTS
#if defined(JUCE_UNIT_TESTS) && defined(JUCE_UNICODE_UNIT_TESTS)
struct LineBreakTests : UnitTest
{
LineBreakTests() : UnitTest ("UnicodeLineBreakTests", UnitTestCategories::unicode)
{
}
void runTest()
{
static const auto data = []
{
using namespace generated;
MemoryInputStream mStream {tr14TestData, sizeof (tr14TestData), false};
GZIPDecompressorInputStream zStream {&mStream, false};
MemoryBlock data {tr14TestDataUncompressedSize, false};
zStream.read (data.getData(), data.getSize());
return std::move (data);
return points;
}();
MemoryInputStream stream {data, false};
Array<Unicode::Codepoint> result;
result.resize ((int) analysisBuffer.size());
int testCounter = 0;
for (size_t i = 0; i < analysisBuffer.size(); i++)
result.getReference ((int) i).codepoint = analysisBuffer[i].character;
while (! stream.isExhausted())
TR24::analyseScripts (analysisBuffer, [&result] (int index, TextScript script)
{
uint32_t input[256]{};
bool output[256]{};
const auto inputStringLength = (size_t) stream.readShort();
jassert (inputStringLength < std::size (input));
for (size_t i = 0; i < inputStringLength; i++)
input[i] = (uint32_t) stream.readInt();
for (size_t i = 0; i < inputStringLength + 1; i++)
output[i] = (bool) stream.readBool();
beginTest ("Test " + String (++testCounter));
expect (runTest (Span<const uint32_t> { input, inputStringLength },
Span<const bool> { output, inputStringLength + 1 }));
}
}
static bool runTest (Span<const uint32_t> input, Span<const bool> output)
{
UnicodeAnalysisPoint points[256]{};
bool result[256]{};
std::transform (input.begin(), input.end(), points, [] (uint32_t cp)
{
auto data = getUnicodePointForCodepoint (cp);
return UnicodeAnalysisPoint {cp, data};
result.getReference (index).script = script;
});
const auto resultCount = tr14::analyseLineBreaks ({ points, input.size() }, [&result, output] (int index, TextBreakType type)
TR14::analyseLineBreaks (analysisBuffer, [&result] (int index, TextBreakType type)
{
jassert (index <= output.size());
result[index] = type != TextBreakType::noBreak;
result.getReference (index).breaking = type;
});
const auto s = std::equal (output.begin(), output.end(), std::begin (result)) &&
resultCount == output.size();
ParagraphIterator iter { analysisBuffer };
#if JUCE_DEBUG
if (! s)
TR9::BidiOutput bidiOutput;
while (auto range = iter.next())
{
String expected, actual;
const auto run = Span { analysisBuffer.data() + (size_t) range->getStart(), (size_t) range->getLength() };
DBG ("Test Failed:");
TR9::analyseBidiRun (bidiOutput, run, key.directionOverride);
if (resultCount != output.size())
for (size_t i = 0; i < (size_t) range->getLength(); i++)
{
DBG ("\tIncorrect output size. Expected " << output.size() << " got " << resultCount);
jassertfalse;
auto& point = result.getReference ((int) i + range->getStart());
point.direction = bidiOutput.resolvedLevels[i] % 2 == 0 ? TextDirection::ltr : TextDirection::rtl;
point.logicalIndex = (size_t) range->getStart() + i;
point.visualIndex = (size_t) bidiOutput.visualOrder[i];
}
for (size_t i = 0; i < output.size(); i++)
{
expected << (output[i] ? "True" : "False") << " ";
actual << (result[i] ? "True" : "False") << " ";
}
String inputString;
for (auto value : input)
inputString << String::formatted ("%04X ", value);
DBG ("\tInput: { " << inputString << "}");
DBG ("\tOutput: { " << actual << "}");
DBG ("\tExpected: { " << expected << "}");
DBG (tr14::debugString);
jassertfalse;
}
#endif
return s;
return result;
}
};
static LineBreakTests lineBreakTests;
#if JUCE_UNIT_TESTS
class NumericalVisualOrderTest : UnitTest
{
public:
NumericalVisualOrderTest() : UnitTest ("NumericalVisualOrderTest", UnitTestCategories::text)
{
}
void runTest() override
{
auto doTest = [this] (const String& text)
{
String visual;
String logical;
for (auto cp : Unicode::performAnalysis (text))
{
visual << text[(int) cp.visualIndex];
logical << text[(int) cp.logicalIndex];
}
beginTest (text);
expectEquals (visual, logical);
};
doTest ("12345");
doTest ("12345_00001");
doTest ("1_3(1)");
doTest ("-12323");
}
};
static NumericalVisualOrderTest visualOrderTest;
#endif
}
} // namespace juce

View file

@ -1,169 +0,0 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
namespace juce
{
enum class TextBreakType { none, soft, hard };
enum class TextDirection { ltr, rtl };
struct Unicode
{
struct Codepoint
{
auto getLogicalIndex() const { return logicalIndex; }
auto getVisualIndex() const { return visualIndex; }
uint32_t codepoint;
// Index of the character in the source string
size_t logicalIndex;
size_t visualIndex;
// Breaking characteristics of this codepoint
TextBreakType breaking;
// Direction of this codepoint
TextDirection direction;
// Script class for this codepoint
TextScript script;
};
template <typename Value>
static auto prefix (Span<Value> v, size_t num)
{
return Span { v.data(), std::min (v.size(), num) };
}
template <typename Value>
static auto removePrefix (Span<Value> v, size_t num)
{
const auto increment = std::min (v.size(), num);
return Span { v.data() + increment, v.size() - increment };
}
static Array<Codepoint> performAnalysis (const String&);
static Array<Codepoint> convertLogicalToVisual (Span<const Codepoint>);
template <typename Traits>
struct Iterator
{
using ValueType = typename Traits::ValueType;
Iterator() = default;
explicit Iterator (Span<ValueType> s) : data (s) {}
std::optional<Span<ValueType>> next()
{
if (data.empty())
return {};
const auto breakpoint = std::find_if (data.begin(), data.end(), [&] (const auto& i)
{
return ! Traits::compare (i, data.front());
});
const auto lengthToBreak = (size_t) std::distance (data.begin(), breakpoint) + (Traits::includeBreakingIndex() ? 1 : 0);
const ScopeGuard scope { [&] { data = removePrefix (data, lengthToBreak); } };
return prefix (data, lengthToBreak);
}
private:
Span<ValueType> data;
};
struct BidiTraits
{
using ValueType = const Codepoint;
static bool compare (const Codepoint& t1, const Codepoint& t2)
{
return t1.direction == t2.direction;
}
static bool includeBreakingIndex() { return false; }
};
using BidiRunIterator = Iterator<BidiTraits>;
struct LineTraits
{
using ValueType = const Codepoint;
static bool compare (const Codepoint& t1, const Codepoint&)
{
return t1.breaking != TextBreakType::hard;
}
static bool includeBreakingIndex() { return true; }
};
using LineBreakIterator = Iterator<LineTraits>;
struct WordTraits
{
using ValueType = const Codepoint;
static bool compare (const Codepoint& t1, const Codepoint&)
{
return t1.breaking != TextBreakType::soft;
}
static bool includeBreakingIndex() { return false; }
};
using WordBreakIterator = Iterator<WordTraits>;
struct ScriptTraits
{
using ValueType = const Codepoint;
static bool compare (const Codepoint& t1, const Codepoint& t2)
{
return t1.script == t2.script;
}
static bool includeBreakingIndex() { return false; }
};
using ScriptRunIterator = Iterator<ScriptTraits>;
};
struct UnicodeFunctions
{
static bool isRenderableCharacter (juce_wchar character);
static bool isBreakableWhitespace (juce_wchar character);
static bool isEmoji (juce_wchar character);
static bool shouldVerticalGlyphRotate (juce_wchar character);
};
} // namespace juce

File diff suppressed because it is too large Load diff

View file

@ -35,417 +35,108 @@
namespace juce
{
enum class BracketType
class Brackets
{
none,
open,
close
};
public:
Brackets() = delete;
static inline BracketType getBracketType (uint32_t cp)
{
#define OPEN(code) case code: return BracketType::open
#define CLOSE(code) case code: return BracketType::close
switch (cp)
enum class Kind
{
OPEN(0x0028);
CLOSE(0x0029);
OPEN(0x005B);
CLOSE(0x005D);
OPEN(0x007B);
CLOSE(0x007D);
OPEN(0x0F3A);
CLOSE(0x0F3B);
OPEN(0x0F3C);
CLOSE(0x0F3D);
OPEN(0x169B);
CLOSE(0x169C);
OPEN(0x2045);
CLOSE(0x2046);
OPEN(0x207D);
CLOSE(0x207E);
OPEN(0x208D);
CLOSE(0x208E);
OPEN(0x2308);
CLOSE(0x2309);
OPEN(0x230A);
CLOSE(0x230B);
OPEN(0x2329);
CLOSE(0x232A);
OPEN(0x2768);
CLOSE(0x2769);
OPEN(0x276A);
CLOSE(0x276B);
OPEN(0x276C);
CLOSE(0x276D);
OPEN(0x276E);
CLOSE(0x276F);
OPEN(0x2770);
CLOSE(0x2771);
OPEN(0x2772);
CLOSE(0x2773);
OPEN(0x2774);
CLOSE(0x2775);
OPEN(0x27C5);
CLOSE(0x27C6);
OPEN(0x27E6);
CLOSE(0x27E7);
OPEN(0x27E8);
CLOSE(0x27E9);
OPEN(0x27EA);
CLOSE(0x27EB);
OPEN(0x27EC);
CLOSE(0x27ED);
OPEN(0x27EE);
CLOSE(0x27EF);
OPEN(0x2983);
CLOSE(0x2984);
OPEN(0x2985);
CLOSE(0x2986);
OPEN(0x2987);
CLOSE(0x2988);
OPEN(0x2989);
CLOSE(0x298A);
OPEN(0x298B);
CLOSE(0x298C);
OPEN(0x298D);
CLOSE(0x298E);
OPEN(0x298F);
CLOSE(0x2990);
OPEN(0x2991);
CLOSE(0x2992);
OPEN(0x2993);
CLOSE(0x2994);
OPEN(0x2995);
CLOSE(0x2996);
OPEN(0x2997);
CLOSE(0x2998);
OPEN(0x29D8);
CLOSE(0x29D9);
OPEN(0x29DA);
CLOSE(0x29DB);
OPEN(0x29FC);
CLOSE(0x29FD);
OPEN(0x2E22);
CLOSE(0x2E23);
OPEN(0x2E24);
CLOSE(0x2E25);
OPEN(0x2E26);
CLOSE(0x2E27);
OPEN(0x2E28);
CLOSE(0x2E29);
OPEN(0x2E55);
CLOSE(0x2E56);
OPEN(0x2E57);
CLOSE(0x2E58);
OPEN(0x2E59);
CLOSE(0x2E5A);
OPEN(0x2E5B);
CLOSE(0x2E5C);
OPEN(0x3008);
CLOSE(0x3009);
OPEN(0x300A);
CLOSE(0x300B);
OPEN(0x300C);
CLOSE(0x300D);
OPEN(0x300E);
CLOSE(0x300F);
OPEN(0x3010);
CLOSE(0x3011);
OPEN(0x3014);
CLOSE(0x3015);
OPEN(0x3016);
CLOSE(0x3017);
OPEN(0x3018);
CLOSE(0x3019);
OPEN(0x301A);
CLOSE(0x301B);
OPEN(0xFE59);
CLOSE(0xFE5A);
OPEN(0xFE5B);
CLOSE(0xFE5C);
OPEN(0xFE5D);
CLOSE(0xFE5E);
OPEN(0xFF08);
CLOSE(0xFF09);
OPEN(0xFF3B);
CLOSE(0xFF3D);
OPEN(0xFF5B);
CLOSE(0xFF5D);
OPEN(0xFF5F);
CLOSE(0xFF60);
OPEN(0xFF62);
CLOSE(0xFF63);
none,
open,
close
};
static Kind getKind (uint32_t cp)
{
for (const auto& pair : pairs)
{
if (cp == pair.first)
return Kind::open;
if (cp == pair.second)
return Kind::close;
}
return Kind::none;
}
#undef OPEN
#undef CLOSE
static bool isMatchingPair (uint32_t b1, uint32_t b2)
{
return std::any_of (std::begin (pairs), std::end (pairs), [=] (const auto& pair)
{
return pair == std::pair { b1, b2 } || pair == std::pair { b2, b1 };
});
}
return BracketType::none;
}
static inline auto isMatchingBracketPair (uint32_t b1, uint32_t b2)
{
// TODO: remove duplicates
if (b1 == 0x0028 && b2 == 0x0029) return true;
if (b1 == 0x0029 && b2 == 0x0028) return true;
if (b1 == 0x0029 && b2 == 0x0028) return true;
if (b1 == 0x0028 && b2 == 0x0029) return true;
if (b1 == 0x005B && b2 == 0x005D) return true;
if (b1 == 0x005D && b2 == 0x005B) return true;
if (b1 == 0x005D && b2 == 0x005B) return true;
if (b1 == 0x005B && b2 == 0x005D) return true;
if (b1 == 0x007B && b2 == 0x007D) return true;
if (b1 == 0x007D && b2 == 0x007B) return true;
if (b1 == 0x007D && b2 == 0x007B) return true;
if (b1 == 0x007B && b2 == 0x007D) return true;
if (b1 == 0x0F3A && b2 == 0x0F3B) return true;
if (b1 == 0x0F3B && b2 == 0x0F3A) return true;
if (b1 == 0x0F3B && b2 == 0x0F3A) return true;
if (b1 == 0x0F3A && b2 == 0x0F3B) return true;
if (b1 == 0x0F3C && b2 == 0x0F3D) return true;
if (b1 == 0x0F3D && b2 == 0x0F3C) return true;
if (b1 == 0x0F3D && b2 == 0x0F3C) return true;
if (b1 == 0x0F3C && b2 == 0x0F3D) return true;
if (b1 == 0x169B && b2 == 0x169C) return true;
if (b1 == 0x169C && b2 == 0x169B) return true;
if (b1 == 0x169C && b2 == 0x169B) return true;
if (b1 == 0x169B && b2 == 0x169C) return true;
if (b1 == 0x2045 && b2 == 0x2046) return true;
if (b1 == 0x2046 && b2 == 0x2045) return true;
if (b1 == 0x2046 && b2 == 0x2045) return true;
if (b1 == 0x2045 && b2 == 0x2046) return true;
if (b1 == 0x207D && b2 == 0x207E) return true;
if (b1 == 0x207E && b2 == 0x207D) return true;
if (b1 == 0x207E && b2 == 0x207D) return true;
if (b1 == 0x207D && b2 == 0x207E) return true;
if (b1 == 0x208D && b2 == 0x208E) return true;
if (b1 == 0x208E && b2 == 0x208D) return true;
if (b1 == 0x208E && b2 == 0x208D) return true;
if (b1 == 0x208D && b2 == 0x208E) return true;
if (b1 == 0x2308 && b2 == 0x2309) return true;
if (b1 == 0x2309 && b2 == 0x2308) return true;
if (b1 == 0x2309 && b2 == 0x2308) return true;
if (b1 == 0x2308 && b2 == 0x2309) return true;
if (b1 == 0x230A && b2 == 0x230B) return true;
if (b1 == 0x230B && b2 == 0x230A) return true;
if (b1 == 0x230B && b2 == 0x230A) return true;
if (b1 == 0x230A && b2 == 0x230B) return true;
if (b1 == 0x2329 && b2 == 0x232A) return true;
if (b1 == 0x232A && b2 == 0x2329) return true;
if (b1 == 0x232A && b2 == 0x2329) return true;
if (b1 == 0x2329 && b2 == 0x232A) return true;
if (b1 == 0x2768 && b2 == 0x2769) return true;
if (b1 == 0x2769 && b2 == 0x2768) return true;
if (b1 == 0x2769 && b2 == 0x2768) return true;
if (b1 == 0x2768 && b2 == 0x2769) return true;
if (b1 == 0x276A && b2 == 0x276B) return true;
if (b1 == 0x276B && b2 == 0x276A) return true;
if (b1 == 0x276B && b2 == 0x276A) return true;
if (b1 == 0x276A && b2 == 0x276B) return true;
if (b1 == 0x276C && b2 == 0x276D) return true;
if (b1 == 0x276D && b2 == 0x276C) return true;
if (b1 == 0x276D && b2 == 0x276C) return true;
if (b1 == 0x276C && b2 == 0x276D) return true;
if (b1 == 0x276E && b2 == 0x276F) return true;
if (b1 == 0x276F && b2 == 0x276E) return true;
if (b1 == 0x276F && b2 == 0x276E) return true;
if (b1 == 0x276E && b2 == 0x276F) return true;
if (b1 == 0x2770 && b2 == 0x2771) return true;
if (b1 == 0x2771 && b2 == 0x2770) return true;
if (b1 == 0x2771 && b2 == 0x2770) return true;
if (b1 == 0x2770 && b2 == 0x2771) return true;
if (b1 == 0x2772 && b2 == 0x2773) return true;
if (b1 == 0x2773 && b2 == 0x2772) return true;
if (b1 == 0x2773 && b2 == 0x2772) return true;
if (b1 == 0x2772 && b2 == 0x2773) return true;
if (b1 == 0x2774 && b2 == 0x2775) return true;
if (b1 == 0x2775 && b2 == 0x2774) return true;
if (b1 == 0x2775 && b2 == 0x2774) return true;
if (b1 == 0x2774 && b2 == 0x2775) return true;
if (b1 == 0x27C5 && b2 == 0x27C6) return true;
if (b1 == 0x27C6 && b2 == 0x27C5) return true;
if (b1 == 0x27C6 && b2 == 0x27C5) return true;
if (b1 == 0x27C5 && b2 == 0x27C6) return true;
if (b1 == 0x27E6 && b2 == 0x27E7) return true;
if (b1 == 0x27E7 && b2 == 0x27E6) return true;
if (b1 == 0x27E7 && b2 == 0x27E6) return true;
if (b1 == 0x27E6 && b2 == 0x27E7) return true;
if (b1 == 0x27E8 && b2 == 0x27E9) return true;
if (b1 == 0x27E9 && b2 == 0x27E8) return true;
if (b1 == 0x27E9 && b2 == 0x27E8) return true;
if (b1 == 0x27E8 && b2 == 0x27E9) return true;
if (b1 == 0x27EA && b2 == 0x27EB) return true;
if (b1 == 0x27EB && b2 == 0x27EA) return true;
if (b1 == 0x27EB && b2 == 0x27EA) return true;
if (b1 == 0x27EA && b2 == 0x27EB) return true;
if (b1 == 0x27EC && b2 == 0x27ED) return true;
if (b1 == 0x27ED && b2 == 0x27EC) return true;
if (b1 == 0x27ED && b2 == 0x27EC) return true;
if (b1 == 0x27EC && b2 == 0x27ED) return true;
if (b1 == 0x27EE && b2 == 0x27EF) return true;
if (b1 == 0x27EF && b2 == 0x27EE) return true;
if (b1 == 0x27EF && b2 == 0x27EE) return true;
if (b1 == 0x27EE && b2 == 0x27EF) return true;
if (b1 == 0x2983 && b2 == 0x2984) return true;
if (b1 == 0x2984 && b2 == 0x2983) return true;
if (b1 == 0x2984 && b2 == 0x2983) return true;
if (b1 == 0x2983 && b2 == 0x2984) return true;
if (b1 == 0x2985 && b2 == 0x2986) return true;
if (b1 == 0x2986 && b2 == 0x2985) return true;
if (b1 == 0x2986 && b2 == 0x2985) return true;
if (b1 == 0x2985 && b2 == 0x2986) return true;
if (b1 == 0x2987 && b2 == 0x2988) return true;
if (b1 == 0x2988 && b2 == 0x2987) return true;
if (b1 == 0x2988 && b2 == 0x2987) return true;
if (b1 == 0x2987 && b2 == 0x2988) return true;
if (b1 == 0x2989 && b2 == 0x298A) return true;
if (b1 == 0x298A && b2 == 0x2989) return true;
if (b1 == 0x298A && b2 == 0x2989) return true;
if (b1 == 0x2989 && b2 == 0x298A) return true;
if (b1 == 0x298B && b2 == 0x298C) return true;
if (b1 == 0x298C && b2 == 0x298B) return true;
if (b1 == 0x298C && b2 == 0x298B) return true;
if (b1 == 0x298B && b2 == 0x298C) return true;
if (b1 == 0x298D && b2 == 0x2990) return true;
if (b1 == 0x2990 && b2 == 0x298D) return true;
if (b1 == 0x298E && b2 == 0x298F) return true;
if (b1 == 0x298F && b2 == 0x298E) return true;
if (b1 == 0x298F && b2 == 0x298E) return true;
if (b1 == 0x298E && b2 == 0x298F) return true;
if (b1 == 0x2990 && b2 == 0x298D) return true;
if (b1 == 0x298D && b2 == 0x2990) return true;
if (b1 == 0x2991 && b2 == 0x2992) return true;
if (b1 == 0x2992 && b2 == 0x2991) return true;
if (b1 == 0x2992 && b2 == 0x2991) return true;
if (b1 == 0x2991 && b2 == 0x2992) return true;
if (b1 == 0x2993 && b2 == 0x2994) return true;
if (b1 == 0x2994 && b2 == 0x2993) return true;
if (b1 == 0x2994 && b2 == 0x2993) return true;
if (b1 == 0x2993 && b2 == 0x2994) return true;
if (b1 == 0x2995 && b2 == 0x2996) return true;
if (b1 == 0x2996 && b2 == 0x2995) return true;
if (b1 == 0x2996 && b2 == 0x2995) return true;
if (b1 == 0x2995 && b2 == 0x2996) return true;
if (b1 == 0x2997 && b2 == 0x2998) return true;
if (b1 == 0x2998 && b2 == 0x2997) return true;
if (b1 == 0x2998 && b2 == 0x2997) return true;
if (b1 == 0x2997 && b2 == 0x2998) return true;
if (b1 == 0x29D8 && b2 == 0x29D9) return true;
if (b1 == 0x29D9 && b2 == 0x29D8) return true;
if (b1 == 0x29D9 && b2 == 0x29D8) return true;
if (b1 == 0x29D8 && b2 == 0x29D9) return true;
if (b1 == 0x29DA && b2 == 0x29DB) return true;
if (b1 == 0x29DB && b2 == 0x29DA) return true;
if (b1 == 0x29DB && b2 == 0x29DA) return true;
if (b1 == 0x29DA && b2 == 0x29DB) return true;
if (b1 == 0x29FC && b2 == 0x29FD) return true;
if (b1 == 0x29FD && b2 == 0x29FC) return true;
if (b1 == 0x29FD && b2 == 0x29FC) return true;
if (b1 == 0x29FC && b2 == 0x29FD) return true;
if (b1 == 0x2E22 && b2 == 0x2E23) return true;
if (b1 == 0x2E23 && b2 == 0x2E22) return true;
if (b1 == 0x2E23 && b2 == 0x2E22) return true;
if (b1 == 0x2E22 && b2 == 0x2E23) return true;
if (b1 == 0x2E24 && b2 == 0x2E25) return true;
if (b1 == 0x2E25 && b2 == 0x2E24) return true;
if (b1 == 0x2E25 && b2 == 0x2E24) return true;
if (b1 == 0x2E24 && b2 == 0x2E25) return true;
if (b1 == 0x2E26 && b2 == 0x2E27) return true;
if (b1 == 0x2E27 && b2 == 0x2E26) return true;
if (b1 == 0x2E27 && b2 == 0x2E26) return true;
if (b1 == 0x2E26 && b2 == 0x2E27) return true;
if (b1 == 0x2E28 && b2 == 0x2E29) return true;
if (b1 == 0x2E29 && b2 == 0x2E28) return true;
if (b1 == 0x2E29 && b2 == 0x2E28) return true;
if (b1 == 0x2E28 && b2 == 0x2E29) return true;
if (b1 == 0x2E55 && b2 == 0x2E56) return true;
if (b1 == 0x2E56 && b2 == 0x2E55) return true;
if (b1 == 0x2E56 && b2 == 0x2E55) return true;
if (b1 == 0x2E55 && b2 == 0x2E56) return true;
if (b1 == 0x2E57 && b2 == 0x2E58) return true;
if (b1 == 0x2E58 && b2 == 0x2E57) return true;
if (b1 == 0x2E58 && b2 == 0x2E57) return true;
if (b1 == 0x2E57 && b2 == 0x2E58) return true;
if (b1 == 0x2E59 && b2 == 0x2E5A) return true;
if (b1 == 0x2E5A && b2 == 0x2E59) return true;
if (b1 == 0x2E5A && b2 == 0x2E59) return true;
if (b1 == 0x2E59 && b2 == 0x2E5A) return true;
if (b1 == 0x2E5B && b2 == 0x2E5C) return true;
if (b1 == 0x2E5C && b2 == 0x2E5B) return true;
if (b1 == 0x2E5C && b2 == 0x2E5B) return true;
if (b1 == 0x2E5B && b2 == 0x2E5C) return true;
if (b1 == 0x3008 && b2 == 0x3009) return true;
if (b1 == 0x3009 && b2 == 0x3008) return true;
if (b1 == 0x3009 && b2 == 0x3008) return true;
if (b1 == 0x3008 && b2 == 0x3009) return true;
if (b1 == 0x300A && b2 == 0x300B) return true;
if (b1 == 0x300B && b2 == 0x300A) return true;
if (b1 == 0x300B && b2 == 0x300A) return true;
if (b1 == 0x300A && b2 == 0x300B) return true;
if (b1 == 0x300C && b2 == 0x300D) return true;
if (b1 == 0x300D && b2 == 0x300C) return true;
if (b1 == 0x300D && b2 == 0x300C) return true;
if (b1 == 0x300C && b2 == 0x300D) return true;
if (b1 == 0x300E && b2 == 0x300F) return true;
if (b1 == 0x300F && b2 == 0x300E) return true;
if (b1 == 0x300F && b2 == 0x300E) return true;
if (b1 == 0x300E && b2 == 0x300F) return true;
if (b1 == 0x3010 && b2 == 0x3011) return true;
if (b1 == 0x3011 && b2 == 0x3010) return true;
if (b1 == 0x3011 && b2 == 0x3010) return true;
if (b1 == 0x3010 && b2 == 0x3011) return true;
if (b1 == 0x3014 && b2 == 0x3015) return true;
if (b1 == 0x3015 && b2 == 0x3014) return true;
if (b1 == 0x3015 && b2 == 0x3014) return true;
if (b1 == 0x3014 && b2 == 0x3015) return true;
if (b1 == 0x3016 && b2 == 0x3017) return true;
if (b1 == 0x3017 && b2 == 0x3016) return true;
if (b1 == 0x3017 && b2 == 0x3016) return true;
if (b1 == 0x3016 && b2 == 0x3017) return true;
if (b1 == 0x3018 && b2 == 0x3019) return true;
if (b1 == 0x3019 && b2 == 0x3018) return true;
if (b1 == 0x3019 && b2 == 0x3018) return true;
if (b1 == 0x3018 && b2 == 0x3019) return true;
if (b1 == 0x301A && b2 == 0x301B) return true;
if (b1 == 0x301B && b2 == 0x301A) return true;
if (b1 == 0x301B && b2 == 0x301A) return true;
if (b1 == 0x301A && b2 == 0x301B) return true;
if (b1 == 0xFE59 && b2 == 0xFE5A) return true;
if (b1 == 0xFE5A && b2 == 0xFE59) return true;
if (b1 == 0xFE5A && b2 == 0xFE59) return true;
if (b1 == 0xFE59 && b2 == 0xFE5A) return true;
if (b1 == 0xFE5B && b2 == 0xFE5C) return true;
if (b1 == 0xFE5C && b2 == 0xFE5B) return true;
if (b1 == 0xFE5C && b2 == 0xFE5B) return true;
if (b1 == 0xFE5B && b2 == 0xFE5C) return true;
if (b1 == 0xFE5D && b2 == 0xFE5E) return true;
if (b1 == 0xFE5E && b2 == 0xFE5D) return true;
if (b1 == 0xFE5E && b2 == 0xFE5D) return true;
if (b1 == 0xFE5D && b2 == 0xFE5E) return true;
if (b1 == 0xFF08 && b2 == 0xFF09) return true;
if (b1 == 0xFF09 && b2 == 0xFF08) return true;
if (b1 == 0xFF09 && b2 == 0xFF08) return true;
if (b1 == 0xFF08 && b2 == 0xFF09) return true;
if (b1 == 0xFF3B && b2 == 0xFF3D) return true;
if (b1 == 0xFF3D && b2 == 0xFF3B) return true;
if (b1 == 0xFF3D && b2 == 0xFF3B) return true;
if (b1 == 0xFF3B && b2 == 0xFF3D) return true;
if (b1 == 0xFF5B && b2 == 0xFF5D) return true;
if (b1 == 0xFF5D && b2 == 0xFF5B) return true;
if (b1 == 0xFF5D && b2 == 0xFF5B) return true;
if (b1 == 0xFF5B && b2 == 0xFF5D) return true;
if (b1 == 0xFF5F && b2 == 0xFF60) return true;
if (b1 == 0xFF60 && b2 == 0xFF5F) return true;
if (b1 == 0xFF60 && b2 == 0xFF5F) return true;
if (b1 == 0xFF5F && b2 == 0xFF60) return true;
if (b1 == 0xFF62 && b2 == 0xFF63) return true;
if (b1 == 0xFF63 && b2 == 0xFF62) return true;
if (b1 == 0xFF63 && b2 == 0xFF62) return true;
if (b1 == 0xFF62 && b2 == 0xFF63) return true;
return false;
}
private:
// https://www.unicode.org/Public/14.0.0/ucd/BidiBrackets.txt
static constexpr std::pair<uint32_t, uint32_t> pairs[] {
{ 0x0028, 0x0029 },
{ 0x005B, 0x005D },
{ 0x007B, 0x007D },
{ 0x0F3A, 0x0F3B },
{ 0x0F3C, 0x0F3D },
{ 0x169B, 0x169C },
{ 0x2045, 0x2046 },
{ 0x207D, 0x207E },
{ 0x208D, 0x208E },
{ 0x2308, 0x2309 },
{ 0x230A, 0x230B },
{ 0x2329, 0x232A },
{ 0x2768, 0x2769 },
{ 0x276A, 0x276B },
{ 0x276C, 0x276D },
{ 0x276E, 0x276F },
{ 0x2770, 0x2771 },
{ 0x2772, 0x2773 },
{ 0x2774, 0x2775 },
{ 0x27C5, 0x27C6 },
{ 0x27E6, 0x27E7 },
{ 0x27E8, 0x27E9 },
{ 0x27EA, 0x27EB },
{ 0x27EC, 0x27ED },
{ 0x27EE, 0x27EF },
{ 0x2983, 0x2984 },
{ 0x2985, 0x2986 },
{ 0x2987, 0x2988 },
{ 0x2989, 0x298A },
{ 0x298B, 0x298C },
{ 0x298D, 0x298E },
{ 0x298F, 0x2990 },
{ 0x2991, 0x2992 },
{ 0x2993, 0x2994 },
{ 0x2995, 0x2996 },
{ 0x2997, 0x2998 },
{ 0x29D8, 0x29D9 },
{ 0x29DA, 0x29DB },
{ 0x29FC, 0x29FD },
{ 0x2E22, 0x2E23 },
{ 0x2E24, 0x2E25 },
{ 0x2E26, 0x2E27 },
{ 0x2E28, 0x2E29 },
{ 0x2E55, 0x2E56 },
{ 0x2E57, 0x2E58 },
{ 0x2E59, 0x2E5A },
{ 0x2E5B, 0x2E5C },
{ 0x3008, 0x3009 },
{ 0x300A, 0x300B },
{ 0x300C, 0x300D },
{ 0x300E, 0x300F },
{ 0x3010, 0x3011 },
{ 0x3014, 0x3015 },
{ 0x3016, 0x3017 },
{ 0x3018, 0x3019 },
{ 0x301A, 0x301B },
{ 0xFE59, 0xFE5A },
{ 0xFE5B, 0xFE5C },
{ 0xFE5D, 0xFE5E },
{ 0xFF08, 0xFF09 },
{ 0xFF3B, 0xFF3D },
{ 0xFF5B, 0xFF5D },
{ 0xFF5F, 0xFF60 },
{ 0xFF62, 0xFF63 }
};
};
} // namespace juce

View file

@ -1,782 +0,0 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
struct UnicodeEntry
{
LineBreakType bt;
EastAsianWidthType asian;
BidiType bidi;
UnicodeTextScript script;
VerticalTransformType vertical;
EmojiType emoji;
};
static_assert (alignof (UnicodeEntry) == 1);
static_assert (sizeof (UnicodeEntry) == 6);
static const int uncompressedUnicodeDataSize = 6684666;
static const uint8_t compressedUnicodeData[] =
{
0x78,0x9c,0xec,0xdd,0x09,0x9b,0x23,0xdb,0x79,0x10,0xe0,0x23,0x75,0xab,0xaf,0xc6,0x33,0xd5,0xf6,0xf8,0x66,0x12,0xc7,0xd7,
0x63,0x4f,0xcf,0xcc,0x8d,0x93,0x21,0x09,0x4b,0x02,0x0e,0xc1,0x06,0x12,0xc2,0xbe,0xef,0xe0,0x6b,0x13,0x42,0x20,0x10,0x12,
0x1c,0x02,0x18,0x12,0xc2,0x12,0x42,0x48,0xec,0x10,0xb6,0xb0,0xef,0xfc,0x54,0x4a,0x55,0x2d,0xf5,0x51,0x95,0xaa,0x54,0x9b,
0xa4,0x23,0xf5,0xfb,0x3c,0x57,0xef,0xad,0xe7,0xd4,0xa9,0xaf,0xbe,0xfa,0xce,0xa9,0x52,0x95,0xd4,0xdd,0x33,0x0f,0x4f,0x42,
0xb8,0x99,0xf7,0x34,0x0b,0x4f,0x73,0x17,0xe1,0x63,0xb9,0xb3,0x62,0x79,0x16,0x9e,0xe5,0x5e,0x15,0x2d,0x7d,0xa3,0x75,0xf3,
0x63,0x35,0x57,0xfb,0x7d,0x6f,0xb6,0xda,0xef,0x8b,0x59,0x96,0xfb,0x61,0x61,0x98,0xdd,0x84,0x70,0xfd,0x76,0xe5,0xcd,0x9b,
0xc2,0x10,0xad,0x7d,0x5d,0xf8,0xc9,0xfb,0x9e,0x59,0xd1,0x73,0x91,0x2f,0x7f,0x30,0x7b,0x2f,0xf7,0xdb,0xa3,0xe5,0xef,0x2a,
0xbc,0x9b,0x5d,0xe5,0x7d,0x86,0x59,0xc6,0xf9,0xe0,0x61,0x5f,0x5b,0xbe,0xd8,0x6a,0xc9,0xcb,0x97,0xa8,0x65,0xc5,0xde,0x56,
0xeb,0x56,0xf1,0xf4,0x79,0xb6,0xe7,0x9f,0x15,0x3e,0x8f,0x72,0xee,0x32,0xeb,0x6e,0x0e,0x38,0x9f,0xa7,0xf1,0x3a,0xac,0xe6,
0xd8,0xeb,0x79,0xb6,0x99,0xed,0xe5,0xcc,0x7f,0x3b,0x7f,0x58,0x2e,0x8f,0xf7,0x69,0xde,0x67,0x56,0x98,0xb7,0x84,0x7c,0x79,
0xf1,0x74,0xbe,0xaa,0xcf,0x87,0xe1,0xa1,0x26,0xd9,0x7c,0x15,0x33,0xac,0x7a,0x2e,0xca,0x96,0x37,0xf3,0x75,0xb4,0xd5,0xb6,
0x57,0x45,0x9c,0x95,0xb7,0xf7,0x71,0xc2,0x7d,0xe4,0xaa,0x65,0xcf,0x87,0xf8,0x0f,0x7b,0x5f,0xfb,0x7a,0x1d,0xe1,0xd9,0x5e,
0xe7,0x1d,0xfa,0x8c,0xde,0xb6,0xcc,0xaa,0x53,0xff,0x79,0x83,0x5d,0x72,0x68,0xda,0xaa,0x29,0x4e,0x97,0x3e,0xf5,0xfc,0x9b,
0xe2,0x37,0xd5,0x64,0x4c,0x85,0xfb,0x8e,0x42,0xdf,0x7d,0x8d,0xcf,0xad,0x7d,0x8c,0x86,0x8d,0xf8,0xf8,0x6c,0xdb,0x67,0x51,
0x7b,0xb6,0x7d,0xb7,0xea,0x52,0x87,0x43,0x8f,0xfe,0x98,0xfa,0x93,0x7d,0xe7,0xdb,0xe1,0x96,0xc9,0xf3,0xf2,0x98,0xef,0xef,
0x64,0x58,0x3f,0x65,0x14,0x2d,0x9d,0x8d,0xb6,0x9a,0x67,0x95,0x96,0xf2,0xc9,0xe2,0x36,0xd4,0x9f,0x35,0xaa,0xed,0xdb,0x5b,
0x35,0xc4,0x6f,0x70,0xd7,0xb3,0x4c,0x75,0x6d,0xb9,0x7c,0xdb,0xe9,0xf9,0x65,0xcf,0x1e,0x7f,0x7a,0xf6,0x60,0xad,0x62,0xfb,
0xb3,0x1d,0xef,0x7c,0xbe,0x9c,0xf1,0x12,0xbd,0x3e,0x40,0xb4,0x2e,0x4e,0x7b,0x14,0xf9,0x99,0x70,0xbb,0xdb,0xfb,0x39,0x5c,
0x69,0x7f,0x57,0x9c,0x3b,0xef,0xd6,0x57,0x95,0x9d,0xdb,0x7e,0xb0,0x3e,0xcb,0x2a,0xfd,0xb7,0xb7,0xcd,0xa2,0xbd,0x84,0xda,
0x72,0x75,0x8f,0xf5,0xe5,0x2d,0xe7,0xc7,0xf0,0x7e,0xef,0xdd,0xb7,0x6a,0xac,0xed,0x69,0xf2,0xef,0xbd,0xaf,0xee,0xf9,0x1f,
0xcb,0x9f,0x39,0x80,0x1d,0xf6,0x5b,0x3d,0x0b,0x7a,0xf9,0x51,0x51,0xcf,0x8f,0x36,0xcb,0xd3,0x3a,0xe7,0x49,0x3d,0xf4,0xf8,
0x5e,0x9c,0xf3,0xb0,0x8c,0x9d,0x45,0x56,0xd6,0xa6,0x90,0x2d,0xc9,0xc3,0xb9,0xb9,0xa3,0xfb,0xea,0xa5,0x5b,0xb9,0x73,0x3e,
0x79,0x3e,0x29,0xfb,0x41,0x61,0x16,0xb2,0x5a,0xdd,0xb2,0xaf,0xae,0x7d,0x1b,0x6e,0x8a,0xb5,0xb3,0xe2,0xbb,0xda,0xe5,0x57,
0xb8,0x36,0x0b,0xb3,0xcd,0x72,0x88,0x96,0x9b,0x5a,0x5e,0x44,0x2d,0x65,0x3d,0xbb,0xfb,0xa9,0x62,0xdb,0x94,0xed,0x9b,0x79,
0x88,0xec,0x5b,0x8d,0xba,0x21,0x5c,0x5f,0xb5,0x5a,0xce,0xea,0xab,0x07,0xe7,0xb9,0x6f,0x56,0x3f,0xea,0xb3,0x71,0xd5,0xf2,
0x41,0xf1,0x73,0x08,0x1f,0x14,0xcb,0x71,0xff,0x7c,0xd4,0x46,0xfa,0x22,0xbf,0x79,0x5d,0x2d,0xcf,0xcb,0xe5,0xd8,0xb0,0xce,
0xe7,0xac,0x1d,0x79,0x14,0x95,0x7b,0xd4,0x61,0x0e,0x1e,0x9d,0xbb,0x62,0x9e,0x0c,0xb3,0x9c,0x3f,0x71,0x4b,0xd3,0xd1,0x9d,
0x7c,0x8c,0x78,0x61,0xbe,0xd8,0x9e,0x63,0x1d,0x8d,0xaf,0x87,0xdd,0xfa,0xef,0xde,0x4b,0x7b,0x84,0x78,0xab,0xbb,0x70,0x35,
0xd8,0x8e,0xd5,0xf8,0xd7,0x53,0xfb,0x6e,0x7d,0x4d,0xdb,0xb4,0xe4,0xc7,0x35,0xf9,0x5e,0x8e,0x63,0x99,0x79,0xca,0x96,0xd5,
0xae,0xd7,0x7c,0xe3,0xc9,0xcf,0xb5,0xc4,0xfd,0x77,0x97,0x6e,0x3e,0x4f,0x46,0x5a,0xc6,0x89,0x67,0xda,0x54,0xde,0x85,0xd9,
0xbf,0x1d,0x6a,0xb8,0x08,0xf3,0x0a,0x0f,0x70,0x3b,0x4e,0xb6,0xf1,0x83,0xc2,0x17,0xf7,0x2d,0xab,0xb5,0xf1,0xdd,0x7e,0xb9,
0xed,0xdb,0xa2,0xfd,0xed,0x3a,0xc2,0xbf,0x39,0xb5,0x79,0x56,0x3b,0x6d,0x5f,0xdb,0x6e,0xd3,0xb6,0x5d,0x62,0x6e,0x3f,0x1f,
0x1d,0xea,0xa8,0x37,0xf1,0x7f,0x3d,0x3d,0xf3,0x3a,0x54,0xac,0xd4,0xe4,0xd7,0x1f,0x96,0xa7,0xb9,0x5b,0x68,0xf2,0xe4,0xef,
0x0e,0x83,0x5d,0xe7,0xff,0xf0,0x34,0xdd,0xe5,0x7a,0xd8,0xf7,0xf9,0x2b,0x85,0x23,0x3d,0x95,0x63,0x9e,0x5b,0x0f,0x61,0xf9,
0x74,0x90,0x42,0x26,0xbd,0xfc,0x89,0xaa,0xe1,0x27,0x56,0xc7,0xc2,0xb1,0xc6,0xf5,0x2c,0x97,0xd7,0xed,0x75,0xeb,0xa3,0xd0,
0x6e,0x7b,0x9c,0x87,0x96,0x4d,0x26,0x4d,0x9f,0xfc,0x54,0x22,0x4f,0x71,0xbc,0x2b,0xb3,0xe2,0xf3,0xf0,0xd2,0xbb,0x62,0xed,
0x30,0x8f,0x30,0x52,0xbf,0x56,0xe4,0x5c,0x18,0x36,0x6e,0xbe,0x07,0xf9,0xb5,0x3e,0x56,0xbe,0x43,0xd9,0xdb,0x7e,0x2a,0xfb,
0x66,0x12,0xf7,0xdf,0xf5,0xb3,0x52,0xfb,0xab,0x51,0x56,0x78,0x5d,0xed,0xba,0xcb,0x9d,0x6e,0x47,0xa8,0x8e,0x4e,0xbd,0x3d,
0xde,0x4b,0xd3,0x4f,0x76,0x35,0x59,0x8f,0xdc,0x3e,0x9a,0xf5,0xe3,0x6d,0xca,0xfc,0xae,0x58,0x3b,0xcc,0x38,0xfe,0x9b,0x70,
0xb3,0xb1,0x7d,0xbc,0xde,0x44,0xcb,0x6f,0x6b,0xfd,0x77,0xd5,0x76,0xf9,0xcd,0x07,0xc3,0x37,0xa3,0x63,0xfc,0xe6,0x3e,0x5b,
0x2a,0xb6,0xb3,0x4f,0x97,0x98,0x87,0xb6,0x6f,0x26,0x4d,0x47,0xd4,0xa5,0x25,0xae,0xf0,0x66,0xa6,0x7d,0xb3,0xea,0x43,0xfd,
0x9b,0xe7,0xe7,0xee,0x3e,0xdb,0x63,0xb7,0x3b,0x42,0x7b,0xe4,0xf6,0xb1,0x6b,0x3a,0xc6,0xee,0xd1,0xee,0x8a,0xfe,0xc3,0x8c,
0x8f,0xab,0x9e,0x4f,0xdc,0xde,0xf7,0x7c,0xaf,0xd4,0xe7,0x1b,0x0f,0x86,0x6f,0x44,0x47,0xfa,0x8d,0xfe,0x36,0x6d,0x3b,0x26,
0xe6,0xb4,0xf6,0xcd,0xa4,0xde,0xbf,0x4b,0x84,0x7a,0x85,0xcb,0xf6,0xf9,0x0e,0x97,0x2d,0xb6,0x8f,0x51,0x3d,0x4e,0x65,0x26,
0x7f,0x63,0xdc,0xdc,0xd8,0x7b,0xa6,0x44,0xc7,0x55,0xcd,0x79,0x33,0xff,0xbf,0x31,0xd4,0x32,0x72,0x7e,0x0d,0xef,0x75,0x14,
0xf5,0x7c,0xf6,0xd6,0xf6,0x57,0x8b,0x1a,0x6e,0xdc,0xc4,0xf9,0xd5,0x3e,0x56,0x72,0xd8,0xdb,0x7e,0x2a,0xfb,0x66,0xd2,0x74,
0x44,0xdd,0xab,0x51,0x56,0x38,0x44,0x15,0xde,0xae,0xf9,0x72,0xa7,0x95,0xfb,0x93,0xca,0xe8,0xd4,0xdb,0xeb,0x5b,0xed,0xbd,
0xee,0x55,0x32,0x69,0x99,0x51,0x7b,0x8f,0xbd,0x29,0xf3,0xbb,0x62,0xed,0x30,0xc7,0xcc,0xc0,0x01,0xef,0x02,0x2f,0x8b,0x38,
0x2f,0xa3,0x63,0x7c,0xb9,0xcf,0x9d,0xb5,0xda,0xd9,0x67,0x58,0x84,0xb8,0xa5,0x69,0x6d,0xfb,0xb6,0x5d,0x72,0x6b,0xef,0x33,
0xcc,0xe6,0x3a,0xaf,0xd6,0xae,0x5d,0xbe,0xdc,0x6e,0xd9,0xd7,0xff,0xa1,0x4f,0xbd,0xbd,0x8c,0x56,0x3f,0x96,0x6e,0xa3,0xdf,
0xb5,0x67,0x5f,0xef,0x8a,0xc8,0xc3,0xdc,0x55,0xdb,0x6c,0xaf,0xf9,0xfb,0xc5,0x66,0x79,0xef,0x9c,0xff,0x95,0xe2,0xd8,0x6b,
0xae,0xda,0x43,0xb1,0xdc,0xdd,0x4d,0xcd,0x3b,0xb6,0x9f,0xca,0xe3,0xe4,0x53,0xaf,0x73,0x88,0x6a,0xbb,0x6d,0xbd,0xfe,0x0f,
0x11,0xea,0xfd,0x9b,0xda,0xe3,0xb5,0x1d,0xaf,0x78,0x95,0xad,0xda,0x8f,0xa2,0xa9,0xa5,0x7e,0x5c,0x95,0xf9,0xff,0x2b,0x43,
0xed,0x7e,0x2c,0xb7,0xf7,0x99,0x64,0x9d,0xbd,0xcf,0xfc,0x5f,0x15,0x39,0x17,0x86,0x8d,0xb7,0x85,0xa1,0xa7,0x9b,0x9a,0x74,
0x6c,0x3f,0x95,0xe3,0xf3,0xe9,0x12,0xa1,0x32,0xd3,0x36,0xed,0xf3,0xce,0x6e,0xae,0xcc,0x1d,0xda,0x97,0x1b,0xfb,0xcc,0xff,
0x6a,0xcc,0x76,0xdb,0x2b,0xd0,0x94,0xc3,0x5d,0xb1,0x76,0x98,0x4d,0xfb,0x9d,0xca,0x3c,0xdb,0x5f,0x7e,0x30,0x6c,0x0c,0x83,
0xdc,0x64,0xdb,0xb1,0xfd,0x31,0x18,0x57,0x78,0xdd,0x52,0x77,0xb9,0xd3,0xcd,0x2c,0xad,0xf4,0x6f,0x6a,0x8f,0xf7,0x12,0x57,
0x7e,0xe7,0x4c,0xae,0xe5,0x39,0xe5,0x91,0x56,0xe6,0xff,0x2f,0x0f,0x75,0x58,0x26,0x6f,0x7a,0xce,0xd8,0x3c,0xe7,0x2f,0x14,
0x15,0xd8,0xb8,0xa9,0xd2,0x17,0x8e,0xe5,0xce,0x31,0x3a,0xda,0xde,0xbb,0x67,0x38,0x7e,0xdb,0x61,0xc7,0xb8,0xf3,0xda,0xb5,
0xb3,0x7d,0x73,0x76,0x7c,0xa1,0xea,0xb2,0x62,0x3d,0xce,0xae,0xad,0xda,0xec,0x78,0xff,0xff,0x85,0xa1,0x36,0x1d,0x51,0x53,
0x4d,0x86,0xf9,0xf9,0x10,0xfe,0x25,0xdb,0x5c,0x36,0xb4,0xec,0xb7,0xa9,0xe6,0x6f,0x57,0x83,0x38,0x20,0x87,0xae,0x86,0x62,
0xab,0xbb,0x11,0x66,0x91,0xd3,0xde,0x75,0xa4,0x66,0x5e,0xe1,0x5f,0x5a,0x1b,0xb7,0xd4,0xd7,0xd6,0xed,0xd2,0xe7,0xf8,0xf6,
0x3d,0x8a,0x7d,0x2e,0x1b,0x5a,0xfa,0xfa,0x90,0x4f,0xdf,0xda,0xae,0x97,0xf7,0xef,0xa5,0x72,0xed,0xfd,0xa5,0xa1,0x76,0xc9,
0x33,0x85,0xd9,0x3b,0xc6,0xfc,0xf5,0x2f,0x8a,0xa7,0xdd,0x9d,0xd6,0xd7,0x5e,0xd7,0x5a,0xb2,0xa8,0xfd,0x45,0xab,0xd7,0x51,
0xcc,0x17,0xd1,0x72,0x6c,0xfe,0x5e,0xbc,0xb1,0xbe,0xb6,0xee,0xdd,0x08,0xbb,0xc4,0x6f,0x32,0x8b,0xb2,0x0d,0x0d,0xcb,0xaf,
0x43,0x96,0xfb,0xbc,0x30,0x5e,0x9e,0xdf,0xf7,0x19,0xb2,0xdf,0x78,0xd4,0x2e,0xcf,0xe6,0x7b,0xb9,0x87,0x59,0x31,0x95,0xf1,
0x08,0x76,0xef,0xd3,0x9e,0xff,0xf8,0xac,0x0e,0x77,0xbc,0x29,0x58,0x1e,0x5d,0x16,0x9d,0x41,0x5d,0x66,0x45,0xf7,0xab,0x41,
0xfd,0xec,0xa8,0x5f,0xa9,0x6e,0xb7,0xb7,0x0a,0xbb,0xbc,0x8e,0xae,0x57,0x29,0x5c,0xa5,0x0f,0x7a,0xe7,0xf3,0x63,0x7c,0x70,
0xd9,0x60,0xfb,0xda,0xf6,0x9e,0x4d,0xf1,0x57,0x2d,0x77,0x23,0xcc,0x22,0x43,0x83,0xe3,0x2a,0xd0,0xbd,0x4a,0xa7,0x1d,0x97,
0x69,0xf7,0xd2,0xb7,0x1a,0x6d,0x11,0xc6,0x8c,0x6f,0x97,0xf8,0xf9,0x28,0x7f,0xed,0xd2,0xdd,0x5c,0xd5,0xbf,0xb6,0xef,0x6a,
0x56,0xef,0x93,0x42,0xfe,0x27,0xb7,0xa5,0x0e,0x9f,0x59,0x84,0x2f,0xcf,0xc8,0x81,0x7e,0x2e,0xf0,0x9c,0xfc,0x2c,0x19,0x99,
0xbf,0x0b,0xbc,0x17,0x78,0x66,0x6e,0xee,0x6d,0x5a,0xd6,0xb6,0xf7,0x69,0x8f,0x79,0x88,0xf8,0x97,0xe4,0x63,0xab,0xcf,0x63,
0x98,0x6f,0x97,0x34,0x5e,0xa9,0x99,0xc2,0xf8,0x72,0xcc,0xd8,0x6d,0x3e,0x97,0x7e,0x6f,0xdb,0xb2,0x4f,0x96,0x40,0x9e,0x7d,
0x8f,0xe5,0x58,0xf3,0x2d,0x1b,0x6c,0xc7,0xef,0xef,0x7e,0x94,0x8f,0xdb,0xbe,0xf3,0x21,0xee,0x9f,0x85,0xec,0xc3,0xa2,0xfd,
0xc3,0x19,0x49,0x92,0x24,0x49,0x92,0x17,0x6b,0x16,0x9e,0xfd,0x62,0xf1,0xfc,0x9b,0xac,0xaf,0x43,0xf6,0x8b,0xc5,0x4f,0x0e,
0xff,0x62,0xc3,0xe7,0x3f,0xff,0x9c,0xe7,0x6c,0xfc,0x97,0x12,0xb3,0x89,0xc6,0xb4,0xd7,0xcf,0xff,0xff,0xb3,0x63,0x39,0x0f,
0xcb,0x9a,0xab,0xf6,0xc1,0xbf,0xb9,0x50,0x46,0xfe,0xa7,0xc7,0x32,0xcf,0x39,0x72,0xd5,0x12,0x8f,0xda,0xe0,0xa3,0xf8,0x27,
0xc7,0x32,0xcf,0x7c,0xe3,0x54,0x3f,0x3f,0x9c,0xbf,0x7e,0x61,0x3a,0x9b,0x62,0x6e,0xbe,0x7d,0xf8,0x85,0xb5,0x13,0xfe,0xfc,
0xf3,0xcf,0x71,0x88,0xcb,0xc8,0x7a,0x4b,0xbb,0xc3,0xf6,0xd5,0xb4,0xf7,0x21,0x66,0x45,0x9c,0xd2,0x57,0x51,0xe4,0xb2,0x25,
0x44,0xcb,0x6f,0xc3,0x4d,0x65,0xbf,0xf1,0xfc,0xb9,0x2b,0xda,0x87,0xd9,0xed,0xfc,0xca,0x7e,0x6e,0xa8,0x1d,0xe3,0x7f,0xef,
0xda,0x17,0xc5,0xbf,0x70,0x5d,0x9a,0x15,0x2d,0x59,0xf9,0x2f,0xdd,0x6f,0xf7,0xd9,0x58,0xb6,0xe4,0xe7,0x63,0xc5,0xeb,0xf0,
0x64,0xb3,0x9c,0x1f,0xe9,0x60,0x3b,0x5e,0x7f,0xbe,0x97,0xdc,0xb6,0xd7,0xfb,0x57,0x4b,0x9c,0x78,0x56,0xa7,0x70,0x5c,0x53,
0x19,0x1f,0xd1,0xde,0xfa,0x9c,0xfc,0x19,0x8d,0xed,0xae,0x46,0x6a,0xa8,0x39,0x3f,0x1f,0xce,0xd2,0xcd,0x3d,0xe1,0xcf,0x57,
0x0d,0x0d,0xb6,0xf5,0x69,0x9a,0xff,0xbb,0x22,0x34,0xc5,0x6f,0xda,0xd7,0xb2,0x25,0x7e,0xfe,0x1e,0xba,0x73,0xed,0x8b,0xa2,
0xbd,0xf4,0xae,0x88,0x39,0xcc,0xfc,0xbe,0xe5,0x1f,0x9f,0x9b,0x95,0xfb,0xf3,0x8e,0x3d,0x07,0xdf,0xff,0xff,0x06,0xcf,0xb3,
0x3e,0x5d,0xc6,0xf7,0xae,0xe8,0x39,0xcc,0xa6,0xbd,0x7c,0x3e,0x64,0xbf,0xb1,0x76,0xcc,0xfd,0x79,0x1a,0x86,0x7f,0x94,0x86,
0xf9,0x75,0x32,0x32,0x44,0xae,0x5a,0x2a,0xf7,0x24,0x9b,0xad,0xf2,0x31,0xfa,0x87,0x1c,0xeb,0xb2,0xb6,0xbc,0xdf,0xf5,0xb9,
0x50,0xdf,0xb6,0x1e,0xb9,0xbb,0xdd,0xb3,0x1d,0xe2,0xf6,0x3b,0xfb,0xaa,0xe5,0xae,0x88,0x39,0xcc,0x8e,0xd7,0x9f,0x83,0xc6,
0x3f,0xc4,0x7c,0xa8,0x54,0x69,0x76,0x9e,0x4e,0xf5,0x09,0xe1,0x65,0x9b,0xd7,0xea,0xeb,0xbb,0x0d,0x5f,0x2f,0xae,0xb1,0xdc,
0x69,0x5c,0xa5,0xe6,0x1a,0xd6,0xfb,0x84,0x56,0xab,0x7d,0xfa,0x66,0xb5,0xf3,0xfa,0xf3,0xf5,0xa1,0x66,0x91,0xa1,0xd6,0x52,
0x5f,0x3b,0xae,0x92,0xfd,0x1c,0xb6,0xaf,0x38,0xe7,0xcd,0xfc,0xff,0xd9,0x07,0xc3,0xcf,0x16,0x3d,0xcf,0xce,0xf9,0xbd,0xcb,
0x06,0x9b,0xfa,0xec,0xde,0x2a,0x8e,0x7c,0x37,0xc2,0x8e,0xf9,0xff,0x83,0x4b,0x37,0xaf,0x6a,0x61,0xbc,0x1c,0xb7,0x84,0xda,
0xda,0x7a,0xcf,0x6a,0xff,0xbe,0xd7,0xf9,0x96,0x0c,0xff,0xfe,0x25,0x3a,0xef,0xed,0xb2,0xa7,0xbb,0xb7,0xad,0x57,0x3e,0x2b,
0xfa,0x34,0x79,0x37,0xc2,0x9d,0xa3,0x5c,0xa9,0x43,0xde,0xf3,0xef,0x0d,0x35,0x5c,0xa8,0x59,0x64,0xde,0xf2,0x51,0x7f,0x7b,
0x9d,0x77,0x5f,0x7b,0xdc,0xee,0xad,0x46,0xaf,0x77,0xba,0x01,0xf7,0xb7,0x95,0xe7,0x82,0xd0,0xd0,0x3e,0xce,0x7e,0x31,0xc3,
0xba,0x1a,0x15,0xdb,0xd7,0xb6,0xf7,0xac,0xe7,0x10,0x3a,0xd4,0x27,0x7f,0x3d,0x7b,0x04,0xde,0xb6,0xfa,0x51,0x02,0x19,0x9e,
0x8b,0xed,0x95,0x9c,0x76,0xab,0x61,0x1a,0xcd,0x73,0xf1,0xf6,0xb8,0x9f,0x08,0x71,0xe7,0x3b,0x51,0x0a,0x33,0x81,0x24,0x79,
0x7c,0xdb,0xef,0xcd,0x8e,0x60,0xe5,0x79,0x64,0xf2,0xfe,0xe7,0xee,0x31,0xeb,0x13,0x6f,0xd5,0x65,0xf9,0x1c,0x7d,0x6c,0xf3,
0xe7,0xd0,0x95,0xec,0xb3,0x55,0x56,0x5b,0xce,0x6a,0xed,0xe3,0xe3,0xb7,0xc5,0x1c,0x36,0x07,0xd6,0x3d,0xbb,0xc6,0x1f,0x6a,
0x35,0x7e,0x7b,0x9e,0x7d,0xeb,0x73,0x5b,0x8b,0x9c,0xe5,0x6f,0x02,0xdd,0xbc,0x6e,0x68,0x7f,0x12,0x9e,0x14,0x9f,0x3b,0x3d,
0xc9,0x9f,0x26,0x3e,0xb6,0xf2,0x7a,0xfd,0x49,0xd4,0x6c,0xd5,0x67,0x9e,0x15,0xdb,0xde,0xff,0x4e,0xc1,0xa6,0xe5,0x59,0xe1,
0xd3,0x8d,0xab,0x9f,0x44,0x5d,0x2d,0x7f,0x38,0x7f,0xf0,0x75,0xd9,0xd2,0xda,0x5e,0x6e,0x7b,0x1f,0xa1,0x58,0x5b,0xc6,0xf9,
0xf4,0xbc,0x6a,0xb9,0xdf,0x59,0x91,0xf3,0x2c,0x7c,0xac,0xc8,0xf0,0xb6,0xf0,0x13,0x85,0x9f,0x2c,0xfc,0x78,0xe1,0xf3,0x22,
0xe7,0xf7,0x72,0xdf,0xcc,0x6f,0xf2,0xc8,0x6f,0x42,0x61,0xbe,0x1c,0xd6,0x86,0x72,0x39,0x2b,0x96,0x1f,0x0c,0x71,0xce,0x51,
0x86,0xaf,0xf2,0xe5,0xd9,0xe2,0x55,0xd9,0x27,0xca,0xb3,0xea,0xba,0x0e,0x1f,0x14,0x7b,0x2f,0x8f,0xf4,0x79,0x61,0x11,0x21,
0x76,0xb1,0x3b,0xc2,0xbe,0xc8,0x75,0xb3,0xda,0x72,0xdd,0x5d,0x6b,0x57,0x95,0x5c,0x16,0xa3,0x1f,0x1a,0x7c,0x97,0x3b,0xcb,
0xeb,0xf9,0x7e,0x51,0xd5,0x6f,0x29,0x7c,0x51,0xf8,0xad,0xe5,0x9c,0xd9,0x6b,0x08,0x57,0x9b,0x4f,0x29,0xe3,0x73,0xe1,0xe9,
0xfc,0x2a,0x5a,0xdb,0xe4,0x22,0xf2,0x61,0xe6,0x3c,0xbf,0x1f,0x97,0xf2,0xfe,0xe7,0x6a,0x13,0xad,0xee,0x98,0xf8,0x87,0xf8,
0x7c,0xb5,0xfe,0xf9,0x6d,0xf9,0xaf,0xc8,0x75,0xf1,0x4d,0xdc,0x72,0x5d,0xeb,0x33,0xef,0x1a,0x67,0x4f,0xe4,0x0e,0x6b,0xdf,
0x74,0xde,0x76,0xbc,0xd3,0x7f,0x66,0x32,0x6b,0x70,0x6b,0xed,0x75,0xb5,0x7d,0x9c,0x87,0xfb,0xf9,0x9f,0x87,0x2b,0x43,0xf1,
0xbb,0x00,0xa1,0xbc,0xa6,0xad,0x5b,0x9e,0xce,0xb7,0xd7,0xae,0x97,0xd7,0x7d,0xee,0x67,0x78,0xa3,0xbb,0xfa,0xe4,0xe7,0x5d,
0x65,0x8f,0x6f,0xb7,0xf6,0x92,0xed,0x89,0x59,0xcd,0xf9,0x21,0xcf,0xc2,0x45,0x1c,0xf9,0x7e,0x79,0x7e,0xff,0xde,0x5a,0x6d,
0x2f,0xce,0xa9,0xf5,0x75,0x20,0x8e,0x7f,0xd3,0x74,0x74,0xb5,0x9e,0x21,0xaa,0x4c,0xc5,0x45,0xb5,0xb6,0xbb,0x6d,0xbf,0x6e,
0xb7,0xc4,0xbf,0xa9,0x5e,0xd5,0xa3,0x7d,0x3d,0x0b,0xb5,0x3e,0x1b,0xa3,0x77,0xcc,0xa7,0xf5,0xb5,0x0d,0xb5,0x0d,0xf3,0xea,
0xb6,0xeb,0xb5,0xe1,0xd9,0x14,0xae,0x72,0xde,0xe5,0x21,0x62,0x8e,0x37,0xbe,0x63,0x09,0x9b,0xab,0xfd,0xae,0xdf,0xaf,0x79,
0x5a,0xb9,0xcf,0xd9,0x72,0xd1,0x6e,0xbf,0xf7,0xf7,0xde,0x2e,0x22,0xa7,0x8b,0x3c,0xdf,0x77,0x87,0x73,0x3a,0x9f,0xce,0x77,
0x2f,0x1f,0xc9,0x33,0xa9,0x49,0x53,0x65,0x9a,0xd6,0xb6,0xf7,0x8f,0x97,0xdf,0x16,0x77,0x4a,0xe5,0xfb,0x72,0x97,0x51,0x68,
0xda,0xd7,0xc3,0xd5,0x7e,0x5f,0x3e,0x4d,0x47,0xd7,0x64,0xf7,0xb9,0x11,0x3f,0x77,0xb4,0xd7,0xad,0x4b,0x6d,0x87,0x8d,0x57,
0x97,0xf6,0xbe,0x7d,0x86,0xe5,0xd3,0x36,0x52,0xdd,0xfa,0x1c,0xa2,0x56,0x87,0x38,0x96,0xc3,0x9d,0x7d,0x87,0x18,0xa9,0x13,
0x5c,0xe5,0x2e,0x22,0xb7,0x14,0xfc,0xf4,0xd1,0xf6,0xb5,0xef,0x0e,0x30,0x36,0x7e,0xc2,0x8d,0x97,0xbb,0x6c,0xbb,0xfd,0x34,
0xb1,0xdf,0x97,0x8b,0xd5,0xfd,0x7c,0x69,0x5b,0xcf,0xde,0xc7,0xb5,0x78,0x9d,0xc7,0x9c,0xdf,0x3c,0x2f,0xdc,0x1f,0x67,0xbf,
0xfb,0x9e,0x83,0x78,0x4a,0x87,0xcf,0xf6,0xa6,0xf9,0x33,0x51,0x9c,0x22,0xc3,0x2e,0x3d,0x4f,0x7d,0x2d,0x3a,0xed,0x35,0x67,
0x88,0x21,0x1a,0xa9,0xa9,0xf6,0x38,0xe1,0x71,0x95,0xd7,0xb4,0xba,0xa1,0xea,0xfd,0x35,0x30,0x44,0xee,0xbd,0x1e,0xee,0x88,
0x73,0x94,0x9a,0xa7,0xe3,0xae,0xb1,0x68,0x7a,0x42,0x3f,0xad,0xe3,0x8f,0xf7,0xb4,0xf9,0x57,0x9f,0x83,0x2e,0xdf,0xab,0x13,
0x19,0x1e,0x87,0x8b,0x04,0x72,0x38,0x96,0xe1,0x94,0x33,0xf9,0xe1,0xb3,0xdc,0x6e,0x9f,0x8d,0x30,0x65,0x9b,0xee,0x49,0x52,
0xc8,0xed,0x20,0x4e,0x74,0x2f,0x7a,0xcc,0x71,0xe9,0x3b,0x76,0x5d,0xf3,0xdf,0x9c,0xd1,0x3d,0xaf,0x27,0x7d,0xef,0x12,0xeb,
0xfb,0x8a,0xda,0x17,0xf5,0xf6,0x43,0x6c,0xdb,0x10,0x61,0x4f,0xff,0xf6,0xf8,0x53,0x39,0xed,0x7e,0x27,0xcd,0x79,0x3d,0xca,
0xd5,0x67,0x8d,0x9b,0xad,0x27,0x8b,0xc8,0xb2,0x7f,0x6d,0x74,0xb6,0xda,0x6b,0xf3,0xa7,0xbe,0x55,0x53,0x9f,0xad,0xcf,0x76,
0x9e,0x86,0x07,0xe3,0xbd,0xaf,0x96,0xc3,0xda,0xd5,0x99,0xb2,0x78,0x3f,0x5a,0x2e,0xdb,0x9b,0x72,0x38,0xad,0x4d,0xf5,0x6c,
0xaa,0x55,0x97,0xaa,0xee,0x18,0xc1,0x31,0x4e,0x74,0xa4,0xf5,0xb1,0x8e,0x5b,0xea,0xed,0x2f,0x5b,0xd7,0xf6,0xae,0xc6,0x98,
0x31,0xea,0x57,0x87,0x29,0xce,0xbe,0x78,0x04,0x27,0xad,0xf9,0xc0,0x98,0x5b,0xf3,0x21,0x1c,0xe3,0xbc,0x88,0xce,0xfa,0x72,
0x26,0x34,0x5d,0x7f,0x76,0xf4,0x6c,0x98,0x3f,0xb1,0xe5,0xda,0xd0,0xba,0xd5,0x7d,0xcb,0xa2,0x2d,0x42,0x7d,0x2f,0x4d,0x2d,
0xb1,0x5d,0xe6,0xed,0x56,0x84,0x86,0x1c,0x1a,0xb3,0xaa,0xd7,0x64,0xb1,0x3b,0x9f,0xf7,0x1b,0xe2,0xef,0xa8,0x67,0x53,0xfd,
0xab,0xf3,0xea,0x7e,0x3e,0xc7,0x6b,0xdf,0x5f,0x44,0x86,0x07,0x3b,0x9f,0x4d,0x4d,0xcb,0x5d,0xce,0xa6,0xee,0xed,0xdb,0xee,
0xff,0xf4,0xac,0xef,0x19,0xdd,0x67,0xdb,0x7e,0xef,0xe9,0xf5,0xf8,0xcd,0x7b,0x8c,0x8f,0xab,0xfd,0x18,0x77,0xbf,0x17,0xdc,
0x3c,0x6d,0xd8,0xea,0xc3,0x0e,0x96,0x3d,0x5f,0x3c,0xd8,0xf8,0xae,0xd7,0xf4,0xfd,0xd1,0x98,0xe5,0xee,0x77,0xbc,0x3b,0x0c,
0xa7,0x31,0x14,0x99,0xaf,0xea,0x1f,0x16,0x5b,0x86,0xc1,0xcf,0x02,0x63,0xb6,0x6d,0x76,0x6c,0x56,0xa3,0x22,0x57,0xbf,0x61,
0x3c,0x4f,0x5f,0xcf,0x8a,0xa3,0x98,0x75,0x5e,0x3e,0xea,0x51,0x87,0xbf,0x4b,0x92,0x7c,0x8c,0x9e,0xfe,0xfd,0xf1,0x6c,0x5d,
0x44,0xa6,0x90,0x0f,0x27,0x70,0xeb,0x29,0xa3,0xe1,0xae,0xec,0xd0,0xcb,0x29,0xd4,0xe1,0x71,0x7a,0xa9,0x23,0x72,0x49,0xc7,
0x42,0x92,0x3c,0x8a,0x8b,0x9a,0x23,0xa2,0x0d,0xf8,0xbc,0xbd,0xf6,0x49,0xf5,0xb1,0x4d,0x62,0x14,0x86,0xda,0x5a,0xb7,0xa7,
0x0f,0xdf,0x10,0x35,0xfc,0xdc,0xc2,0xc9,0xf3,0x6f,0xb0,0xfa,0x3b,0xec,0xe7,0x6c,0xf5,0x37,0xf1,0x4f,0x9d,0xcf,0x58,0x8f,
0x7f,0x86,0xf6,0x3d,0x97,0x53,0xc8,0xa4,0xfb,0x75,0xe6,0xb0,0xfb,0x0d,0x4f,0x03,0x39,0xdc,0x14,0xfe,0x86,0xe1,0x18,0x7f,
0x86,0x3c,0x94,0x59,0x07,0x77,0x6f,0x3b,0x0f,0xcb,0x8a,0xf1,0xda,0xf6,0xbf,0xea,0xf3,0xa2,0x88,0x9c,0xd5,0x2c,0xf7,0xf8,
0x62,0xab,0xe5,0xf4,0xff,0x42,0xc4,0xa1,0x8d,0xff,0xed,0x89,0x2e,0xff,0x5a,0x47,0xa5,0xe5,0xef,0x70,0x3a,0xfb,0xfc,0x65,
0xaa,0x55,0xff,0xac,0xe7,0x56,0xdd,0xcd,0xcf,0xa9,0x32,0xab,0xf7,0xd2,0x70,0xe8,0xdf,0xef,0xea,0x17,0x5f,0xff,0x69,0xfb,
0xe7,0xb3,0xe8,0xa3,0x73,0x36,0xfe,0x4b,0x95,0x53,0xd9,0xf4,0x37,0x24,0xbb,0xfc,0x6d,0xc9,0xd7,0xb5,0xf6,0x50,0x8b,0xdf,
0xd4,0xde,0xf7,0x5b,0xb6,0xa6,0x7c,0x5e,0xd4,0xb2,0x6a,0xfa,0x1b,0x98,0xed,0xcf,0xc2,0xcf,0x22,0xbb,0xfc,0x45,0xcd,0xd7,
0xad,0x59,0x75,0xa9,0xde,0xee,0x0c,0xb7,0x9f,0x31,0x5f,0x44,0x0e,0xab,0xd8,0xe1,0xfe,0x1a,0xe1,0xf1,0x7d,0xb9,0xc8,0xe6,
0xb3,0x44,0x2d,0x7f,0xc3,0x3a,0x85,0x4c,0x98,0x9a,0x53,0xfd,0xfe,0x7e,0x0a,0xc7,0x42,0x92,0xa7,0xf2,0xb4,0x7f,0x41,0x65,
0xef,0xf5,0x79,0x12,0x9b,0xe2,0x67,0x57,0xcf,0x72,0x57,0x7f,0x09,0xed,0xea,0xde,0x78,0xab,0x57,0x8b,0x50,0x54,0xa9,0xcc,
0x64,0xb5,0x1c,0xff,0xe5,0xb4,0xbe,0xcb,0x71,0xe4,0xbe,0xdb,0xbe,0xaa,0xb5,0x6c,0xc7,0xbc,0xcf,0xb3,0x97,0xf3,0x45,0xf1,
0x37,0xba,0x77,0x18,0xbe,0xbc,0x76,0x15,0x7f,0xbe,0xd8,0x54,0xa0,0xe2,0x7c,0x51,0x1f,0xa3,0xea,0x5e,0x5e,0xad,0x5d,0xf7,
0x59,0xdc,0xf7,0x0c,0x0f,0xe3,0xf2,0x89,0x45,0xb8,0x5e,0x55,0x3e,0x5c,0xf7,0x5f,0x4e,0xcd,0x94,0x73,0xeb,0x9b,0xff,0xb0,
0x9a,0xf7,0xed,0x59,0x1a,0x9f,0x95,0xf1,0x6c,0x7c,0x55,0x9c,0x95,0x6b,0x57,0x5b,0xbd,0x8a,0x22,0x94,0xe7,0x45,0x1e,0xe1,
0x79,0xb1,0xc7,0xe7,0xb3,0xde,0xcb,0xa9,0x99,0x72,0x6e,0x7d,0xf3,0x1f,0x56,0xf3,0xbe,0x3d,0xdb,0xfb,0xbf,0x2a,0xae,0x36,
0x79,0x9f,0xe2,0x2a,0x5a,0xb6,0x3c,0xac,0xdd,0xf7,0xee,0x13,0x7e,0xfa,0x92,0xbc,0xea,0xbd,0xd5,0xa6,0x0e,0x5f,0x26,0xfb,
0xb8,0x99,0x39,0x87,0x36,0x89,0x33,0x6b,0xb8,0xd3,0xdc,0xdf,0xa6,0xe6,0x54,0xf7,0xff,0xf1,0x15,0xfe,0x10,0xa6,0x70,0xa6,
0xf4,0x31,0xdb,0x78,0xb4,0xf3,0x2b,0x29,0xfb,0xfe,0x8d,0xc1,0xc3,0xcf,0xf6,0x14,0x66,0x45,0xbf,0x99,0xb3,0xf6,0xf4,0xa3,
0x59,0x73,0xd1,0xb0,0x7c,0x72,0x0f,0x38,0x7f,0x0e,0x9c,0xe1,0xe9,0x9f,0x08,0x92,0x35,0x94,0x4f,0x0d,0x64,0x64,0x02,0x57,
0x9b,0x89,0xaf,0x00,0xe5,0x3c,0x6f,0xf4,0xf4,0x99,0xf3,0xbc,0x3c,0xc4,0xfb,0xd7,0xa9,0x8e,0x62,0xc8,0x27,0xe7,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x6c,0x32,0x84,0x2c,0xf0,0x74,0xa6,0x30,0x07,0x48,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0xe4,0xd9,0xf9,0x53,0xa7,0xf3,0xd5,0x49,0xf7,0x4e,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0xb6,0xfb,0x2e,0x84,0xb0,0xed,0xcb,0x45,0xf6,0x53,0x9c,0xc2,0x7a,0x6d,0xbb,0x98,0xf3,0xd9,0xc0,0x2d,0xb3,0xc8,0xbc,
0xe5,0x6f,0x93,0x24,0x39,0xce,0x2c,0x64,0xb9,0x2f,0x0a,0xcb,0xe5,0x43,0xef,0xf1,0x6e,0x84,0x71,0x9c,0xd5,0xdd,0xc2,0x29,
0xcc,0x5f,0x1f,0x71,0x97,0xf3,0xb0,0xdc,0x69,0x08,0x59,0xcb,0xda,0x2e,0x96,0x11,0xd6,0x9e,0xfe,0x48,0xc7,0x54,0x26,0x6f,
0xf9,0x34,0x2f,0xd7,0x7c,0x94,0x37,0x96,0x2d,0x59,0xab,0xfd,0xaf,0x3f,0xd9,0x05,0x19,0x9e,0x91,0x87,0xf5,0x7e,0xa6,0xc5,
0x26,0x90,0xd5,0xe3,0x75,0xef,0xfd,0x55,0xa5,0x67,0x7d,0x79,0x58,0xe4,0x93,0xdc,0x2b,0x1e,0xa2,0x86,0x3f,0xb9,0x36,0x7f,
0x97,0xf9,0xc9,0xed,0x96,0xf6,0xf6,0x2e,0x6b,0x8f,0xef,0x7c,0xcb,0x65,0x64,0xd9,0x27,0xdb,0x69,0xd9,0x67,0x67,0xcd,0x7b,
0xf9,0x66,0xb5,0x70,0xff,0x5f,0xc7,0x31,0xfd,0x5b,0xec,0xef,0x6d,0xc8,0x36,0xbe,0x88,0xec,0x7b,0x4e,0xe5,0xb3,0xe2,0x6f,
0xae,0x0d,0xec,0xec,0xfc,0xe0,0x2e,0x37,0xf6,0x1d,0xd3,0xac,0x88,0x50,0x7a,0x37,0xc2,0x6e,0xf3,0x67,0xf9,0x13,0xc7,0x32,
0xdf,0xdf,0x60,0x6f,0x6b,0x2d,0x65,0xcc,0xfc,0x48,0xff,0xc6,0x50,0xc3,0x99,0x98,0x1f,0x69,0x2f,0xb3,0xf5,0x2c,0x2a,0x23,
0xfc,0xf5,0x34,0xcc,0x73,0x1b,0x6d,0xd8,0x38,0xc9,0xdd,0x48,0x1e,0xe7,0x33,0x8b,0xf0,0xe5,0xd9,0xd9,0x58,0xff,0x7e,0x30,
0xaf,0xcc,0x8f,0x87,0x8a,0xe1,0xc7,0x8b,0xa3,0xe3,0x4e,0xe3,0x2a,0xcd,0xb7,0x5a,0x76,0x57,0x72,0x57,0x9f,0x50,0xb1,0xcb,
0x7e,0xb3,0x9a,0x4d,0x3d,0xe3,0x3b,0xb7,0xbb,0xa2,0x65,0x98,0x2d,0x33,0x7f,0xb3,0xaf,0xcf,0x87,0xf0,0x63,0x6d,0x2e,0x5b,
0xd7,0xee,0xf7,0x6e,0x84,0xed,0x91,0x37,0xc7,0xf2,0xd7,0x1e,0x9f,0xf9,0x3c,0xec,0x60,0x88,0xdc,0xdf,0x3e,0xf8,0x2a,0xba,
0x33,0xb7,0xa1,0x47,0x14,0x2a,0x99,0xdc,0x15,0x2d,0xc3,0xac,0xe7,0x99,0xd5,0x1c,0x33,0xb7,0x8f,0x6b,0xe3,0x99,0xf8,0x57,
0xd9,0xe6,0xb2,0xb6,0xbc,0xac,0xb5,0xd7,0xd7,0x76,0x89,0x59,0x8f,0xbc,0x5a,0x4e,0xe1,0x93,0x96,0xd8,0xf6,0x63,0xc9,0x7b,
0xfc,0x95,0x71,0xce,0xef,0x5d,0x46,0x3e,0xb4,0x67,0x91,0xed,0xdb,0x8e,0xbc,0x97,0x7b,0x6f,0x9f,0xc7,0xec,0x3f,0x6d,0xe6,
0x71,0xfc,0x01,0xfd,0x4f,0xfe,0x09,0xe7,0xc9,0x1d,0x53,0x87,0xdb,0xb6,0xb5,0x0f,0xdf,0xdd,0xb4,0x8c,0xef,0x8f,0xf2,0xa2,
0x1d,0x79,0xfd,0x4c,0xcd,0xf9,0x96,0xd5,0xeb,0x79,0xd3,0x15,0xbe,0xe9,0x4a,0x7e,0x57,0xb4,0x0f,0xb3,0xcb,0xf5,0xf3,0x5b,
0x8b,0xe7,0xe2,0x6f,0x4b,0x5e,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,
0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,
0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,
0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,
0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,
0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,
0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,
0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,
0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,
0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,
0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,
0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,
0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,
0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,
0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,
0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,
0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,
0x53,0x56,0x9e,0xf2,0x4c,0x59,0x79,0xca,0x33,0x65,0xe5,0x29,0xcf,0x94,0x95,0xa7,0x3c,0x53,0x56,0x9e,0xd3,0xfa,0x2e,0x84,
0x30,0x85,0x9f,0x0b,0xab,0x68,0x29,0xd8,0x94,0xe1,0x67,0x8b,0xb5,0x6c,0xb7,0xa9,0x7a,0xdf,0x99,0x1b,0x48,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x64,0xd2,0xbe,0x9b,0x17,0xbf,0x0b,0x40,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x17,0xe7,0xcb,0x45,0x98,0x93,0x24,0x49,0x26,0x60,0x88,0x4c,0x21,0x1f,0x3e,0x4e,0xc3,0xa5,0x1b,0x42,
0x78,0x16,0x3a,0xf9,0x2e,0xff,0xdf,0x14,0xe6,0xaf,0xaf,0x36,0xdb,0xbe,0xed,0xa7,0xc2,0xec,0x2b,0xe1,0x66,0x1e,0x96,0x5f,
0x59,0x2f,0x0f,0x33,0x84,0xc5,0xc8,0x08,0x75,0xdf,0x85,0x59,0xe8,0xd3,0xa7,0xde,0xbf,0x4b,0x4b,0xff,0x23,0x9d,0x5f,0x91,
0xe7,0xe3,0xbb,0x30,0x0f,0x87,0x34,0x85,0x63,0x24,0x49,0x92,0x8f,0xcd,0xe7,0x21,0xcb,0xef,0x43,0x5e,0x17,0x86,0x90,0x5d,
0x1d,0xd6,0xd3,0x1f,0xef,0x63,0xd6,0x9d,0xe7,0xe1,0xea,0xb9,0xef,0x3e,0x3f,0x2b,0xfa,0x3f,0x09,0xe7,0xec,0x54,0x75,0x7b,
0x73,0xbf,0x5c,0xbd,0x3e,0xcc,0xe7,0xcb,0xd9,0x01,0xbd,0xfe,0x60,0x91,0x85,0xd9,0xcd,0xf3,0xc8,0x0f,0x22,0x5f,0x44,0xbe,
0x8e,0xfa,0x7c,0xba,0x70,0xf5,0x99,0xcf,0x3e,0xe7,0xa1,0xd8,0xd7,0xd4,0x7e,0xb4,0xf6,0x65,0x91,0x49,0x93,0x71,0xce,0x87,
0x58,0x6e,0xda,0xd7,0xaa,0x25,0x74,0xf2,0xf9,0xe2,0xbd,0x70,0x55,0x2c,0x5f,0xdd,0x2f,0x97,0x75,0x7b,0x55,0xc4,0x79,0x95,
0xb7,0x6c,0x8f,0x42,0xb9,0xd5,0x6a,0x5f,0xf3,0x62,0x5f,0xf3,0xc6,0xe5,0x97,0x8b,0x9b,0x5a,0x4d,0x16,0xf7,0xee,0xca,0xa4,
0xdc,0x6f,0xd9,0xf3,0x6d,0xb1,0xed,0x9b,0x28,0x42,0xd3,0xf8,0x76,0xb9,0x1a,0xa4,0x70,0x5d,0x22,0xd3,0x37,0x7e,0x7f,0x5c,
0xde,0xbf,0xcb,0xac,0x3e,0x57,0x7f,0x71,0xb5,0xba,0x3e,0xbc,0xbc,0x2a,0xce,0xe2,0xab,0xd5,0x59,0xf9,0xb6,0xf0,0x4d,0xe1,
0xba,0xbd,0xb8,0x0a,0x5d,0x15,0x57,0x80,0xc2,0x75,0xfb,0xea,0xac,0x7f,0x7e,0x55,0x5c,0x67,0xae,0x56,0xe7,0xfe,0x7a,0xf9,
0xbd,0x62,0xed,0xd5,0x60,0x5f,0xe5,0x11,0xe6,0xb9,0xeb,0x7d,0x85,0x2d,0xb7,0x73,0x0e,0xcf,0x52,0xf5,0x75,0x54,0xab,0xed,
0xba,0xc5,0xcb,0xa7,0xcf,0x73,0x7f,0xfe,0xf1,0xb8,0xcf,0xb7,0x66,0xc2,0xf3,0xeb,0xe2,0x5d,0xa3,0xf0,0x79,0xe4,0xab,0xc2,
0x97,0xd7,0xe1,0x79,0xb8,0xf9,0xc4,0x50,0x37,0x11,0x58,0xfa,0xaa,0xa8,0xc9,0xab,0x75,0x65,0xbe,0x7c,0x9e,0xd6,0xbf,0xdd,
0xeb,0xbb,0xd5,0xf1,0xfb,0xd7,0x73,0x7e,0x13,0x5d,0x2d,0xeb,0xe7,0xf5,0xdb,0x68,0xed,0xfd,0xfd,0x4c,0x71,0x46,0x74,0x71,
0xbd,0x97,0x27,0xc5,0xb6,0xfd,0x9c,0x17,0x9f,0x2d,0xc4,0x7e,0x3c,0xac,0xf2,0x79,0x3a,0xcf,0xee,0xfb,0x3c,0x3c,0x5f,0x84,
0xff,0x30,0x85,0x9b,0xef,0x76,0x27,0x89,0x76,0x08,0x4f,0x95,0x61,0x7d,0xbf,0x87,0xce,0xa4,0xf2,0x6d,0xfb,0x41,0xe3,0x9f,
0xbb,0xc7,0x9f,0x0f,0xe4,0x31,0x6d,0x9f,0xff,0xd9,0xbd,0xd9,0x66,0xb9,0xe5,0x4c,0xe1,0xc6,0xe9,0xea,0x93,0xdd,0xf2,0x72,
0x0c,0x1b,0xd7,0xb3,0x22,0x9b,0xd0,0x5d,0xb3,0x2e,0xbb,0x3d,0xfc,0xbb,0xe4,0xf9,0xda,0xff,0x7c,0xbc,0x64,0xcb,0xcf,0xb7,
0x53,0x18,0x17,0x32,0x05,0xf3,0xd7,0x5f,0x3e,0x1f,0x77,0xe6,0xff,0x97,0xb8,0xcf,0xc3,0xcd,0x9f,0xf2,0x8a,0x1a,0xc2,0x55,
0x48,0xdb,0x96,0xf9,0xff,0x3f,0x2f,0xd1,0xc1,0x57,0x83,0x7a,0xb4,0xbf,0x98,0xb6,0x7b,0x8f,0xe8,0x7f,0x5c,0xba,0xf9,0x39,
0xd8,0xe2,0xde,0xfa,0xfc,0x85,0x73,0xb3,0xcc,0x3c,0x5b,0xb7,0xfc,0xf7,0x4b,0xb4,0x65,0xbc,0x7a,0xc5,0xc9,0x46,0xec,0xeb,
0x31,0x98,0xbf,0xfe,0x3c,0x2f,0xda,0x3f,0xc7,0x56,0xff,0xec,0xb9,0x19,0x9f,0xbf,0x77,0x45,0xcb,0x30,0x3b,0x5e,0x1f,0xfe,
0xcc,0x25,0xea,0x78,0x37,0xc7,0xfb,0xa7,0x1f,0x93,0x03,0xde,0x1f,0xff,0x14,0xfb,0x3b,0xc9,0x9d,0x49,0x19,0xed,0x4f,0x8e,
0x73,0x13,0x6d,0x64,0x9c,0xa9,0xe2,0xd7,0xfb,0x4f,0x95,0xe1,0xb9,0x1c,0x29,0xd3,0x31,0x7f,0xfd,0x7b,0x92,0x24,0x39,0xd4,
0xf3,0x7d,0xff,0x3d,0xe6,0xfd,0x43,0x0a,0xf7,0x3c,0x95,0xfc,0x3b,0xfe,0xe5,0xab,0x2e,0x3d,0x2f,0xd5,0x31,0x15,0x48,0x61,
0x94,0xd9,0x3c,0xff,0x67,0x7f,0x62,0x9f,0xe5,0x5f,0x21,0x2b,0x8d,0x5b,0xba,0x6c,0xfb,0x18,0xac,0x57,0x23,0xae,0x58,0xbd,
0x6e,0x95,0xfe,0x7f,0xfc,0xd4,0x96,0xf9,0x64,0x43,0x23,0xfc,0xb1,0x33,0xf7,0x8f,0x9e,0xa7,0xf5,0x39,0xd6,0xee,0x71,0xf6,
0xf2,0xd8,0xcc,0xab,0xf4,0x47,0x8e,0x6b,0x7d,0xbf,0x23,0x33,0xfc,0xc3,0xe7,0x60,0xfd,0xb8,0xb2,0x90,0x95,0x6b,0xff,0x50,
0xaa,0xee,0x1d,0x97,0xbd,0x7d,0x78,0x84,0xf3,0xf7,0xff,0xcd,0xce,0xdb,0x3f,0x18,0x12,0xb2,0xa5,0xce,0x27,0xcf,0x27,0x85,
0xfa,0x24,0xe8,0x1f,0x28,0x7e,0x52,0xae,0x62,0x59,0xb1,0x7a,0x4b,0x93,0xf5,0x08,0xa5,0x65,0xfc,0xba,0x9b,0x11,0xe9,0xd8,
0x9e,0xb2,0xed,0x75,0x68,0xaf,0xd8,0xf8,0x3d,0xb6,0x9b,0x15,0xfd,0xbb,0xdb,0x37,0x7e,0xde,0xff,0xbf,0x9e,0xb9,0xff,0xed,
0x9c,0x4d,0xe1,0x3d,0x74,0xe4,0xfb,0xef,0xef,0xbf,0x5c,0xf3,0x73,0x7c,0xe3,0xb0,0x0a,0x64,0x1d,0xfc,0x74,0xe1,0xe0,0xfa,
0xff,0x08,0xc7,0xb9,0xeb,0xaa,0x9b,0xfd,0x48,0x37,0xf3,0x08,0xff,0xfb,0xd4,0x56,0xe6,0x43,0xdf,0x08,0xff,0xeb,0xb8,0xee,
0x9d,0xcf,0x7d,0x63,0xfe,0xbe,0x63,0xd9,0xeb,0xac,0x1c,0x19,0x61,0x58,0xfc,0xc3,0xed,0x91,0x69,0x9a,0x8f,0xf2,0x7f,0xe2,
0xb9,0x99,0xc2,0xcc,0xb9,0x0c,0xf3,0x7a,0xfe,0x47,0xf6,0x51,0xfd,0xcf,0xa5,0xfe,0xdd,0x62,0xce,0x7f,0xf8,0x12,0xcd,0x9f,
0xb9,0x76,0xda,0xf7,0x5f,0x0b,0xba,0x0b,0xd7,0x3f,0x3c,0xd4,0x6e,0x7b,0x39,0xfd,0x35,0x90,0x24,0xc9,0xbe,0x86,0x70,0x7d,
0x75,0x9e,0xae,0xf3,0x9f,0xfd,0xd0,0x63,0xb5,0xac,0x40,0x7e,0x5f,0xf4,0x43,0x6b,0xb3,0xa8,0xbd,0x5e,0x9f,0x14,0xe6,0x1b,
0xa7,0x3e,0x7f,0x67,0xff,0xe5,0x31,0xd9,0xbf,0x3e,0xf3,0xdf,0x7b,0x6a,0xf3,0x73,0x73,0xa4,0xc3,0xf6,0x7b,0xe8,0x7f,0x89,
0xb5,0xdb,0xbf,0xe2,0x34,0xfb,0xcf,0xc7,0x32,0xaf,0xd5,0x4e,0x9b,0xfa,0xa7,0x70,0xfe,0x1e,0xe1,0xfa,0xf0,0x7b,0xce,0xc1,
0x13,0xd6,0xe7,0x77,0xa7,0xe1,0xb0,0xfc,0xf3,0x73,0xec,0x4b,0xc5,0x3c,0xff,0xd2,0x7a,0x39,0x70,0x84,0xeb,0x4a,0x4e,0x6f,
0x56,0xc4,0xcf,0x3a,0xe4,0xd0,0xfc,0xbb,0x1e,0xd9,0x97,0x4e,0xe1,0x5d,0x91,0xd5,0x30,0xcb,0x63,0x6f,0xaa,0x70,0xfb,0xf1,
0xb6,0xbb,0x89,0xf3,0xc5,0x07,0xc3,0x17,0x8b,0x98,0xdc,0x38,0xdf,0xe1,0xb2,0xc1,0xdd,0x7d,0xea,0x31,0xb3,0x06,0xcb,0xfe,
0x23,0x7f,0x9b,0xef,0x8b,0xb5,0x96,0xdf,0x95,0x9e,0xdd,0x8f,0xe8,0xae,0xe8,0x3f,0xcc,0x8e,0x67,0xc1,0x0f,0x6e,0x9b,0xb7,
0x5e,0xa4,0xf5,0x23,0xdd,0xb6,0x4b,0x9f,0xaa,0x9b,0x31,0xfa,0xc1,0xa1,0x66,0x0d,0xae,0x73,0x7e,0xb0,0x6c,0x19,0x70,0x46,
0xfc,0xce,0xcb,0x32,0xaf,0xfc,0x66,0xf9,0x36,0x6a,0x1f,0xfc,0x2e,0xf0,0x03,0x0f,0x86,0x1f,0x28,0xa2,0xb1,0xc5,0xf9,0x0e,
0x97,0x83,0x7c,0x88,0xd0,0xb4,0xaf,0x2c,0x32,0x6e,0x69,0x8a,0x19,0x6a,0x59,0xdd,0x15,0xcb,0xc3,0x2c,0xa3,0xdd,0x36,0xe4,
0x53,0xba,0x39,0xcb,0xbe,0x70,0x0a,0xa7,0xf8,0xfd,0xdf,0xf0,0x3b,0x8e,0xe5,0xf1,0xf7,0xd8,0xdd,0xf9,0x0e,0x97,0x35,0xeb,
0x6b,0xab,0x3d,0xb3,0xa2,0x25,0x8b,0x22,0xd7,0x5b,0xca,0x9e,0x29,0xfc,0xf6,0x37,0xf3,0xd7,0x6f,0xef,0x66,0xdc,0xbf,0x7d,
0xdb,0xbe,0x91,0xfb,0x3a,0x3e,0x7e,0x16,0xc5,0xd9,0x5b,0x9f,0xef,0xe7,0x2e,0xf3,0xb3,0xb8,0x30,0xd4,0x5c,0xf6,0x72,0xef,
0xfd,0xff,0xf7,0x0f,0xb5,0xe3,0xfd,0xcf,0xf7,0x3d,0x18,0x36,0x6e,0x46,0xff,0xfb,0xfa,0x58,0x99,0x39,0x7b,0xdb,0x4f,0x65,
0xdf,0x4c,0x9a,0x8e,0xa8,0xcb,0x56,0x9b,0x7f,0x53,0x7e,0xd3,0x3e,0xdf,0xb2,0x5a,0xf9,0xfa,0x28,0xac,0xe3,0xec,0x6f,0xaf,
0xaf,0xad,0xd7,0xbf,0x79,0x26,0xec,0xef,0xd9,0x7e,0xbc,0xcd,0x19,0xc6,0x73,0xac,0xcd,0x7d,0xf3,0x73,0x7f,0x7f,0x92,0xdd,
0xcd,0x5f,0xbf,0x8d,0x43,0x9d,0xef,0x70,0xd9,0xd3,0xf6,0x6d,0x1f,0xda,0x9b,0x72,0xc8,0x1a,0x2c,0xd7,0xde,0x8d,0x30,0x8e,
0x16,0xcf,0x96,0xa6,0x7c,0x52,0x98,0xcf,0x03,0xe6,0xff,0x6f,0x65,0xb3,0xf3,0x1d,0x2e,0x3b,0x18,0x6a,0xcb,0xed,0x71,0xaa,
0x2d,0x4d,0xf9,0xf4,0x1d,0xdf,0xbb,0x62,0xab,0x61,0xa6,0x30,0x3f,0x49,0x1e,0xce,0xfc,0xf5,0x5b,0x66,0xdc,0xe1,0x7c,0x87,
0xcb,0x9d,0xae,0x2a,0xb9,0x76,0xd7,0x56,0xf5,0x6d,0xab,0x2d,0xb7,0x45,0x4b,0x16,0xf9,0x22,0xb2,0x9e,0x5b,0x76,0x30,0x9b,
0xab,0xb1,0xfb,0x78,0xcf,0xdd,0x9c,0xdf,0x1c,0xd8,0xe8,0x7c,0x87,0xcb,0x9e,0xd6,0xb7,0xad,0xc6,0xc9,0x8a,0x96,0xac,0xb6,
0xf7,0xf1,0xd7,0xb7,0xbb,0x22,0xce,0x30,0xbb,0xc4,0xbf,0x0d,0xd9,0xf7,0x4e,0xe7,0x49,0xae,0xff,0xdf,0xf3,0xb8,0xcd,0x67,
0x60,0x61,0x7d,0x39,0x6e,0x69,0xf7,0xa1,0x67,0x1c,0xb9,0xe3,0xfc,0xfc,0x9e,0xa1,0xa6,0x70,0xff,0x70,0xee,0x7e,0x3e,0x84,
0xef,0x4e,0xdb,0xed,0x6c,0x97,0xdf,0x5d,0x35,0xee,0x5f,0x5f,0xbb,0xec,0xb0,0x76,0xf9,0xdd,0xcd,0xf5,0xb9,0x2b,0xb6,0x1d,
0x66,0x9c,0x5b,0x56,0x73,0x4c,0x1d,0x48,0x72,0xbc,0xf9,0xeb,0x37,0xb1,0xb8,0x87,0xa9,0xb9,0x1c,0x64,0x75,0xdb,0x32,0x7e,
0x0a,0x63,0xcd,0xcb,0x33,0x7f,0xbd,0xe3,0xe9,0xbc,0x1b,0xe1,0xb0,0x3d,0x4e,0x3e,0x73,0xbe,0xab,0x9b,0x95,0x6d,0x77,0xb6,
0xf4,0x8d,0xd6,0xde,0x92,0x82,0xf3,0x0e,0x96,0x99,0xd7,0x5b,0xd6,0xed,0xcb,0xef,0x7a,0x30,0x6c,0x96,0xe3,0xf8,0xdb,0xfb,
0x5a,0xad,0xcd,0x8a,0xe5,0xd8,0x61,0xa3,0x7c,0x57,0x6c,0x3b,0xcc,0x14,0xae,0x6f,0xdc,0x7b,0x16,0x7f,0x67,0x1f,0xc7,0x6c,
0x7b,0xbe,0xce,0x77,0xb8,0xdc,0x69,0xe5,0xcc,0x8d,0xd6,0xb6,0xc5,0x29,0xf7,0x72,0x5b,0xdb,0x63,0x0a,0x33,0x64,0xef,0xfc,
0xf9,0x7c,0xf1,0xbd,0x46,0x07,0x43,0xe4,0x43,0x7b,0x19,0xe1,0xf1,0xd8,0xbd,0x56,0xed,0xfd,0x6f,0xa3,0x3e,0x59,0x83,0xb7,
0xb5,0x38,0xab,0x51,0xeb,0xf9,0xfd,0xce,0x77,0x14,0xdb,0x76,0x30,0x44,0x56,0xd7,0x96,0x71,0x18,0xdb,0xad,0xaa,0xdd,0xad,
0xc6,0xcc,0x8a,0x96,0xd8,0x72,0xbf,0xb7,0x35,0xe3,0x3e,0x7d,0x67,0xc8,0xde,0xf9,0xf3,0xe1,0x81,0x7d,0x1b,0x38,0xb1,0x29,
0xbc,0xb3,0x90,0x24,0x53,0x36,0x7f,0xbd,0xe9,0xef,0x98,0x6d,0xcf,0xc5,0xf9,0xbd,0xcb,0x8e,0x96,0x35,0xe9,0xd6,0xff,0x21,
0x7e,0xb9,0xaf,0xac,0xd5,0x31,0xe3,0x7b,0x57,0x44,0x18,0xe6,0xf1,0x6b,0x5e,0xcf,0x3f,0xbf,0xbf,0x7d,0x1d,0x56,0x3f,0x07,
0xf8,0xba,0xe8,0x73,0x76,0xc6,0xc7,0x92,0x8f,0xfe,0xeb,0x53,0xbb,0xce,0x24,0xf4,0xdc,0xb6,0xde,0xbf,0xda,0x92,0xc2,0xd5,
0x8c,0x03,0xae,0xff,0x77,0xdd,0xac,0xf7,0xef,0x1b,0xe1,0x7c,0xcd,0x67,0xf8,0x5e,0xeb,0xb5,0x8d,0xdb,0xeb,0x3d,0xbb,0xc4,
0x2c,0x8d,0x73,0x18,0x70,0xfd,0xbf,0x1b,0x6a,0xc7,0xf9,0xf3,0x6a,0x9f,0xf5,0x9e,0xdd,0xb7,0x4d,0xd9,0x79,0xab,0x9b,0x51,
0x7e,0xb5,0x76,0x73,0xed,0x8d,0x7a,0x2e,0x2b,0xcb,0x71,0x7d,0x3a,0x8e,0xef,0xab,0xa1,0xa6,0x70,0xfd,0x21,0x49,0xf2,0x1c,
0xcd,0x5f,0x9f,0x3b,0xae,0xf9,0x7d,0x42,0x64,0xd8,0x18,0xf7,0x49,0xa1,0x32,0x24,0xcf,0xdd,0xfc,0xf5,0xd9,0x03,0xc7,0x7f,
0x79,0x4a,0xb3,0x5e,0xbe,0x09,0x37,0x3b,0xed,0x1b,0x67,0x98,0xd3,0x56,0x3e,0x5b,0xd7,0xe1,0x33,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0xc9,0xe3,0x9a,0xc2,0xe7,0xff,0xbc,0x6c,0x43,0x02,0xf3,0x9c,0xac,0xbb,0xf9,0x96,0xea,0x33,0xcd,0x9a,0xff,0x24,
0x2f,0xcf,0x14,0xee,0x0d,0x48,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0xf2,0x92,0xcc,0x5f,0x1f,0x90,0xd3,0x39,0xf9,0xfc,0xfc,0xbf,0x33,0x92,0x24,0x49,0x92,0xe4,0xa3,0xf3,0x75,
0xcd,0xe7,0x35,0x53,0xc8,0xf3,0x10,0x36,0x1d,0x5d,0x5c,0x87,0xd7,0xad,0x3d,0x49,0x92,0xa7,0xb5,0xfe,0xce,0x95,0x42,0x56,
0x24,0xcf,0xc5,0xd5,0xf7,0x23,0xb3,0x9b,0xeb,0x62,0xb9,0x8b,0xf1,0x35,0xa7,0xdc,0xb6,0xab,0xa7,0xfe,0x8e,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x39,0xde,0xfc,0xf5,0x7f,0x66,0x24,0x49,0x92,0xe4,0x19,0xfb,0xba,0xf0,0x79,0x02,
0x99,0x90,0x53,0xb9,0x7a,0x5e,0xe3,0x21,0x3c,0xf5,0x33,0x38,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x8f,0xcd,0xfc,0xf5,0x69,0x92,0x24,0x49,0x92,0xe4,
0x50,0x7b,0x3d,0x7f,0x7d,0xfb,0x79,0x5a,0xe6,0x7f,0x57,0x2c,0x0f,0xb3,0xa9,0x26,0x59,0xb1,0x36,0x5b,0xef,0xeb,0x53,0xbc,
0x44,0x37,0xf3,0xe7,0x53,0x43,0xed,0x78,0x7e,0x7d,0xdb,0xb9,0x19,0xe7,0x3f,0x0f,0xcb,0x6f,0x6b,0x36,0xab,0xf5,0x1f,0xf0,
0xf9,0xcf,0xb7,0xb2,0xd9,0xbc,0xce,0x1d,0xcd,0x8a,0xfe,0xb1,0x63,0xf6,0x1b,0x47,0x18,0x33,0xbe,0x77,0x45,0x84,0x61,0xf6,
0x9d,0x21,0x29,0xcc,0xa8,0xd4,0x66,0x7b,0x0a,0x9f,0xf1,0x92,0x24,0x49,0x92,0x24,0xc9,0xd3,0x9a,0xbf,0x5e,0x90,0xc5,0x27,
0x7e,0x1b,0xe3,0xf6,0x14,0x66,0x29,0x2f,0xd5,0xfc,0xf5,0x2d,0x3c,0x67,0x9b,0x46,0x76,0x1e,0x96,0x9b,0x3e,0x73,0x4e,0x64,
0xf7,0x33,0xab,0xac,0x7f,0xdd,0xe3,0x8c,0x3e,0x8f,0xe3,0xab,0x45,0xf8,0xe4,0x6c,0xe5,0x27,0x56,0x66,0xf3,0x62,0x39,0xf7,
0x7a,0xb1,0x7c,0x7f,0x56,0xf4,0x19,0xe7,0xbc,0x88,0x56,0x3a,0x3e,0x5a,0xdd,0x97,0x45,0xfe,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x9e,
0x97,0xef,0x42,0x08,0x7d,0x4c,0x21,0x67,0x92,0x24,0x49,0x92,0x24,0x49,0x1e,0xce,0xb0,0x08,0xef,0x93,0x24,0x49,0x92,0x8f,
0xc9,0xbe,0xdf,0x99,0x5e,0x92,0xc3,0x9e,0x1a,0x52,0xc8,0x9c,0x9c,0xc6,0x40,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0xbc,0x09,0x8b,0xf0,0x7c,
0xb6,0xc3,0xd5,0xda,0x5d,0xed,0xdd,0xfb,0x97,0x2d,0x2f,0x8b,0xe5,0xdc,0x6b,0x92,0x24,0xcf,0xca,0xe7,0xdb,0x96,0xef,0x6b,
0x2c,0xfd,0x44,0x51,0xa5,0xd8,0xa3,0xed,0xf7,0xf9,0x2e,0xfb,0xc6,0xc9,0xc7,0xf4,0x13,0x24,0x49,0x92,0xec,0x6f,0xdb,0x5d,
0xd6,0xa9,0x3f,0xe3,0x22,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0xd6,0xcd,0x5f,0x1f,0x27,0x4f,0xe7,0x31,0xe7,0xe7,0x54,0xf1,0x8f,0x73,0x7e,0xd5,0xe3,0xcc,0xc3,0x72,0x63,0x76,0xdf,0xf2,
0x24,0xec,0x32,0x85,0x6b,0x0b,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x5e,0x92,
0xf3,0xb0,0x9c,0xcd,0xb8,0xe5,0xaa,0x32,0x6b,0x53,0xc8,0xa7,0x9e,0x55,0x77,0x03,0x79,0x86,0x0e,0x9b,0xed,0xbb,0x3d,0xf5,
0x35,0x36,0x65,0xc7,0x8c,0x11,0x49,0xf2,0xb4,0x8e,0x79,0x7f,0x4c,0x21,0xff,0xe3,0x57,0x29,0x85,0x7c,0x1e,0x83,0xf3,0x2d,
0xab,0x4f,0x34,0xfb,0xfa,0x37,0xf9,0xa4,0xa7,0xfd,0x9e,0xb3,0xb6,0xf3,0x19,0xb2,0xd5,0xb9,0x78,0x49,0xc7,0x72,0x6e,0x66,
0x1b,0xa7,0x7c,0xd2,0x19,0x72,0xfd,0xcf,0x6e,0x03,0x93,0x30,0x3f,0xfb,0x2a,0x96,0xed,0x29,0x3c,0x27,0x92,0xac,0xbb,0xe2,
0x14,0xef,0x20,0xef,0x26,0x32,0x7e,0x27,0xe2,0x63,0x76,0xe8,0xfc,0x49,0xd1,0x7e,0x47,0x71,0xea,0x6b,0x08,0x79,0x2a,0x03,
0x1f,0xb1,0xe6,0xc0,0x79,0x59,0x1f,0xaf,0xfa,0xb9,0xdc,0x74,0x76,0x77,0x39,0xeb,0xa7,0x9d,0x0f,0xf5,0xac,0xc6,0x1c,0x29,
0x4f,0x65,0x97,0x39,0x33,0x6c,0xbc,0x2e,0x7b,0x56,0x8c,0x3f,0xd7,0x9a,0xce,0xeb,0xcb,0xae,0x1b,0x49,0x92,0x1c,0xaf,0xe7,
0xfd,0x71,0x66,0x09,0xe4,0x70,0xa9,0xaa,0xed,0xe1,0x54,0xdb,0xc3,0xa9,0xb6,0x87,0x73,0x48,0x6d,0xe3,0xf7,0xb8,0xbb,0x70,
0xc5,0x8e,0xe6,0xf5,0xca,0x66,0x24,0x49,0x92,0x24,0x1f,0x85,0xf3,0xb0,0xe4,0x24,0xaa,0xf0,0xe1,0x6a,0xd8,0x5e,0xdb,0xc3,
0x9d,0x17,0x71,0x4b,0xd6,0x60,0xb9,0x76,0xf5,0xc9,0xc3,0x61,0x6c,0xaf,0x58,0x97,0x3e,0x63,0x4c,0xe1,0x67,0x14,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0xd9,0xdd,0xfc,0xf5,0xec,0x3c,0x4d,0xa1,0x7a,0x24,0x79,0xbe,0xce,0xc3,0xf2,0x69,0x37,
0xfb,0xf6,0x1f,0xe3,0x54,0x19,0x76,0x89,0x90,0xc2,0x28,0x90,0xe4,0xf1,0xcd,0x5f,0x1f,0xe3,0xda,0x7a,0x7d,0xf2,0xf7,0x88,
0x8f,0x75,0x73,0xd8,0x5e,0xee,0x8a,0x96,0x61,0x76,0x19,0xd3,0x14,0xe6,0x18,0x49,0x92,0x8f,0xcd,0xfc,0xf5,0xe4,0xdc,0xcc,
0xef,0x67,0x9e,0x1c,0xb1,0x3e,0x4b,0x16,0x35,0xdf,0xe9,0x5d,0xb1,0x76,0x98,0xed,0x95,0x7f,0x1b,0x6e,0xf6,0xf6,0x21,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0xc9,0xc7,0x63,0xfe,0x7a,0xaf,0x9b,0xed,0xfd,0xeb,0x6b,0xfb,0xc6,0xef,0xeb,0x3a,
0xfe,0xec,0x86,0x24,0xd3,0xf3,0x5d,0x98,0x85,0xb5,0xc3,0x22,0xcc,0xc3,0xb2,0xa3,0xf1,0xbe,0x1e,0x8f,0x79,0x95,0x16,0x4c,
0xcf,0x7c,0x4e,0x76,0xb4,0xec,0xdf,0x34,0xbe,0x77,0xc5,0xda,0x61,0x36,0xc5,0x7c,0x5d,0xac,0x7d,0xdd,0xda,0x87,0x24,0x49,
0x92,0x24,0x49,0x92,0xec,0xe6,0x3c,0xac,0x3e,0xe3,0xe2,0x61,0x7d,0xd3,0xb3,0xbd,0xf4,0xdd,0x04,0xa6,0x30,0xc7,0x1e,0xb3,
0xa7,0x9f,0x7b,0x8f,0xcd,0x29,0xce,0x1a,0xe7,0x17,0xc9,0xb1,0xe6,0x57,0xa4,0xab,0x5d,0x6e,0xde,0x17,0x76,0xae,0x4d,0xc7,
0x7a,0x9e,0x71,0x4b,0x7c,0x25,0x9c,0xea,0xb8,0xda,0x23,0x34,0xed,0xab,0xcb,0xb5,0xba,0xbd,0x67,0x97,0xf8,0xd3,0xd6,0x67,
0xd8,0x7e,0xdb,0xe3,0x8f,0x9f,0x69,0x63,0xa2,0x1d,0x73,0x26,0x1c,0x62,0x9e,0xb7,0xcf,0x8d,0xbe,0xb9,0xa5,0x93,0x3f,0x9b,
0x47,0x36,0xbb,0x5a,0xeb,0xfe,0x90,0x24,0x39,0x95,0x2f,0x43,0x16,0x66,0x8b,0x1d,0x2e,0x1a,0xda,0x2f,0xd6,0xd0,0x60,0x0a,
0xb9,0xf1,0xf2,0x6c,0x9a,0x6f,0x7d,0x3d,0x4e,0x86,0x87,0xde,0xcb,0x01,0x22,0x2f,0x0e,0x1c,0x3f,0x21,0x87,0xcf,0x9f,0xa7,
0xf9,0xc3,0xd9,0xec,0x66,0x94,0xab,0x1c,0xee,0xad,0xe7,0xf6,0x74,0x1e,0x8a,0x9e,0xe7,0xe4,0xea,0x17,0xe3,0x56,0x9e,0x6b,
0xfe,0xe7,0x62,0x51,0xe1,0xd8,0x1d,0x73,0xbb,0xe8,0x19,0x3b,0xd5,0xde,0x0f,0x11,0x73,0xed,0xa2,0x16,0xb9,0x6c,0x19,0xe6,
0x11,0x47,0x64,0xea,0xf7,0x26,0xae,0xfc,0x8e,0x95,0xd7,0x69,0xfa,0x72,0x11,0xae,0xaf,0x6e,0x72,0xc3,0xd5,0xe2,0xe5,0xe2,
0x00,0x15,0x58,0x14,0xf3,0x6a,0xb8,0xe3,0x23,0x4c,0xbb,0xf7,0xc5,0x20,0x6f,0x26,0xae,0x4f,0xbf,0xfa,0x1f,0x66,0x64,0xef,
0xe3,0x67,0xfb,0x4d,0xe0,0x1c,0x24,0xb9,0xc3,0x2e,0xe7,0x6f,0xfa,0x4e,0xfb,0xcc,0x38,0x6c,0xef,0x29,0xd4,0x81,0x93,0x8e,
0xd4,0xfb,0xc9,0xcc,0xd8,0x10,0x39,0xc1,0x8c,0x9d,0xc8,0x10,0xd9,0xa5,0x67,0x97,0x6a,0xc7,0xb6,0x8f,0xc5,0x7d,0xcf,0xf0,
0x60,0x8f,0xca,0x9c,0xf6,0x8a,0x31,0x7e,0xb6,0xb4,0xb7,0x47,0x7e,0xcb,0xca,0xeb,0x26,0x93,0x38,0x2b,0x1f,0xa7,0xb5,0x71,
0x6c,0x9f,0xf9,0x63,0x3c,0xed,0x91,0x8e,0xcf,0x7f,0xfc,0xf1,0xb6,0xd7,0xa1,0x29,0xc2,0x98,0x4a,0xd6,0xe3,0x1c,0xa2,0xb6,
0xa1,0xc3,0x72,0x97,0x0c,0xbb,0x44,0xee,0x12,0x93,0x49,0x5b,0x7b,0xa7,0x08,0x9d,0x3d,0x74,0x6e,0xdd,0x33,0x39,0x55,0xce,
0x93,0xe5,0x56,0xfd,0xdc,0xbb,0x8b,0x8b,0xba,0x7b,0xee,0x40,0x12,0xb8,0x3f,0xdc,0x33,0x03,0x47,0xd8,0x78,0xd7,0x17,0xf7,
0x99,0x74,0x8f,0x63,0xf2,0x6c,0xcf,0xf0,0x20,0x79,0x26,0x70,0xec,0x29,0xdb,0x74,0x4e,0xed,0x39,0xd7,0x92,0xb1,0x47,0xce,
0x29,0x9c,0xf5,0x1c,0x64,0xf7,0x3b,0xdb,0x26,0x07,0xbd,0xd7,0x9c,0x99,0x1f,0xd6,0x7c,0x55,0xb3,0x69,0xdb,0x14,0x46,0xf9,
0x10,0x73,0x26,0x85,0x99,0x39,0x59,0xb6,0x1d,0xae,0x87,0x8d,0xef,0xa1,0xed,0xd1,0x76,0xac,0xed,0xf9,0x69,0xf9,0xf8,0xeb,
0xf9,0x9e,0xbd,0x77,0x3e,0xae,0x4e,0x95,0xac,0xc6,0x4f,0xe1,0xfc,0x25,0xfb,0x3a,0xd5,0xf7,0x5f,0x29,0x1c,0x0b,0x4f,0x37,
0x8b,0xb2,0x86,0x6b,0xec,0xd1,0xbf,0x3f,0x6d,0x8f,0x7f,0xb0,0xef,0x7f,0x57,0x75,0x28,0x7e,0xbf,0x6c,0xa4,0xab,0x68,0x61,
0x51,0x77,0xaa,0xf8,0x6c,0xaf,0xf3,0x21,0xea,0x7f,0xe8,0xf8,0xe7,0xe8,0x31,0xeb,0x9f,0xc6,0x31,0x66,0x91,0xfd,0x8e,0x9d,
0xe9,0xbb,0x1a,0xf1,0x29,0xde,0x49,0xbb,0x7c,0x5f,0x3f,0xec,0xb9,0x72,0xfc,0x37,0x9b,0xe3,0x9f,0x4f,0x47,0x7d,0x0b,0x19,
0xd5,0x67,0xe0,0xf3,0x72,0x11,0x21,0x85,0xcf,0x16,0x52,0x36,0x85,0x6f,0xba,0x1f,0x9b,0xed,0xdf,0x98,0x1f,0x7f,0x5c,0xba,
0x7f,0x8f,0x7f,0xbe,0x3f,0x4d,0x31,0xad,0xc5,0xd5,0x9b,0x8f,0xce,0xe9,0x9e,0x22,0xb3,0x03,0xd8,0xf9,0xf9,0xba,0x9e,0xcf,
0xb4,0xfd,0xdb,0xb7,0xed,0x62,0x02,0xe7,0xf8,0xa8,0x63,0x3c,0x44,0xcc,0xd6,0xf8,0x3b,0xae,0xb7,0x63,0xe6,0xe7,0xe1,0x32,
0x1f,0x16,0xbf,0x67,0xfe,0x3d,0xde,0x95,0x06,0xd5,0x27,0x85,0xe7,0x4d,0xf2,0xf1,0xb8,0xfe,0x77,0x57,0x4f,0x9f,0xc9,0x65,
0x98,0xc2,0xbf,0x02,0x7c,0x38,0xef,0xc2,0xd5,0x60,0xbb,0xc4,0x4f,0xe1,0x33,0x28,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x39,0xde,0x77,0xe1,0x49,0xf1,0xf9,0xff,0xca,0x97,0x8b,0x30,0x9f,0x91,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0xf2,0x94,0x86,0x33,0x37,0x85,0x1a,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0xd6,0xf5,0xef,0x2f,
0x90,0xe4,0x21,0x74,0xfd,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0xc6,0x86,0x03,0x98,0xc2,0x71,0x91,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0xa7,0x32,0x90,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x76,0x36,0x85,0xbf,0x9e,0x44,0x92,0x24,0x49,0x92,0x4d,0xa6,0xf0,
0xdc,0x44,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x9e,0xc4,0x77,0xe1,0x49,0x08,0xf7,0xbe,0x3c,0xf5,
0x4f,0xf2,0x90,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x87,0xf6,0xe4,
0xff,0xa2,0x28,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0xe4,0x79,0xf9,0x2e,0x3c,0x09,0x61,0x63,0x20,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0xc9,0xc8,0x27,0x91,0x29,0xe4,0x43,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x32,0x1d,0x9f,0x44,0xa6,0x90,0x0f,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0xc9,0x74,0x7c,0x12,0x99,0x42,0x3e,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0xd3,0xf1,0x49,0x64,0x0a,0xf9,0x90,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0xe4,0xff,0x6f,0xef,0x8e,0x51,0x18,0x06,
0x62,0x28,0x0a,0xca,0x8b,0x09,0xd1,0xfd,0x2f,0x1c,0x30,0x98,0x88,0xa4,0x33,0x86,0xfc,0xc0,0x34,0x53,0xa8,0x7a,0x85,0xd0,
0x96,0x4b,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x73,0xec,0x61,0x42,0x0f,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0xc9,0x1c,0x7b,0x98,0xd0,0x43,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x32,0xc7,0x1e,0x26,0xf4,0x90,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0xcc,0xb1,0x87,0x09,0x3d,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x73,0xec,0x61,0x42,0x0f,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0xc9,0x1c,0xfb,0xc3,0xf5,0x35,0xf9,
0x17,0x8f,0xf2,0x9d,0xbc,0x66,0xc2,0x0e,0x93,0x3f,0xbb,0x9f,0xeb,0xb9,0x91,0x24,0xf3,0x4c,0x78,0x23,0x48,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x5e,0x35,0xe1,0x3f,0x02,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0xbc,0xcb,0x7e,0xbb,0xaa,0x36,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x3c,0xad,0xae,0x3a,0x4d,0xe8,0x21,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x99,0x63,0x75,0xd5,0xe3,0x05,0x08,
0xc2,0x7e,0x44,
};

File diff suppressed because it is too large Load diff

View file

@ -1,62 +0,0 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
namespace juce
{
static constexpr bool graphemeBreakTable[14][14] =
{
// Other cr lf Control Extend ri Prepend SpacingMark L V T LV LVT zwj
/*Other*/ { true, true, true, true, false, true, true, false, true, true, true, true, true, true },
/*cr*/ { true, true, false, true, true, true, true, true, true, true, true, true, true, true },
/*lf*/ { true, true, true, true, true, true, true, true, true, true, true, true, true, true },
/*Control*/ { true, true, true, true, true, true, true, true, true, true, true, true, true, true },
/*Extend*/ { true, true, true, true, false, true, true, false, true, true, true, true, true, true },
/*ri*/ { true, true, true, true, false, false, true, false, true, true, true, true, true, true },
/*Prepend*/ { false, true, true, true, false, false, false, false, false, false, false, false, false, false },
/*SpacingMark*/ { true, true, true, true, false, true, true, false, true, true, true, true, true, true },
/*L*/ { true, true, true, true, false, true, true, false, false, false, true, false, false, true },
/*V*/ { true, true, true, true, false, true, true, false, true, false, false, true, true, true },
/*T*/ { true, true, true, true, false, true, true, false, true, true, false, true, true, true },
/*LV*/ { true, true, true, true, false, true, true, false, true, false, false, true, true, true },
/*LVT*/ { true, true, true, true, false, true, true, false, true, true, false, true, true, true },
/*zwj*/ { true, true, true, true, false, true, true, false, true, true, true, true, true, true }
};
static inline bool isGraphemeBreak (GraphemeBreakType g1, GraphemeBreakType g2)
{
return graphemeBreakTable[(int) g1][(int) g2];
}
} // namespace juce

View file

@ -32,260 +32,242 @@
==============================================================================
*/
namespace juce::tr14
namespace juce
{
using EAWType = EastAsianWidthType;
using BreakClass = LineBreakType;
// This compiles down to the same machine code as an array matrix and
// gives us enum value compile time safety. This way we dont need to worry
// about the enum being modified and the table being out of sync.
template <size_t Size, typename ValueType, typename ResultType>
struct LookUpTable
class TR14
{
inline constexpr void set (ValueType v1, ValueType v2, ResultType result)
{
cols[index (v1)][index (v2)] = result;
}
public:
TR14() = delete;
inline constexpr ResultType get (ValueType v1, ValueType v2) const
template <typename Callback>
static size_t analyseLineBreaks (Span<const UnicodeAnalysisPoint> span, Callback&& callback)
{
return cols[index (v1)][index (v2)];
uint32_t resultIndex = 0;
uint32_t regionalCounter = 0;
std::optional<LineBreakType> lb9;
bool lb21a{};
const auto data = span.data();
const auto len = span.size();
const auto emit = [&] (auto op) { callback ((int) resultIndex++, op); };
for (size_t i = 0; i < len;)
{
const auto isSOT = i == 0;
const auto isEOT = i == len - 1;
const auto resolved = resolve (data[i]);
const auto prev = isSOT ? resolveSOT (resolved)
: lb9.value_or (resolved);
const auto finalBreak = lb9.has_value() ? LineBreakType::al
: LineBreakType::cm;
const auto next = isEOT ? finalBreak
: resolve (data[i + 1]);
lb9.reset();
// LB3
if (isEOT)
{
emit (TextBreakType::soft);
break;
}
//==============================================================================
// LB4-6
if (prev == LineBreakType::bk)
{
emit (TextBreakType::hard);
i++;
continue;
}
if (prev == LineBreakType::cr && next == LineBreakType::lf)
{
emit (TextBreakType::none);
i++;
continue;
}
if (contains ({ LineBreakType::cr, LineBreakType::lf, LineBreakType::nl }, prev))
{
emit (TextBreakType::hard);
i++;
continue;
}
if (contains ({ LineBreakType::cr, LineBreakType::lf, LineBreakType::nl, LineBreakType::bk }, next))
{
emit (TextBreakType::none);
i++;
continue;
}
//==============================================================================
// LB7
if (contains ({ LineBreakType::sp, LineBreakType::zw }, next))
{
emit (TextBreakType::none);
i++;
continue;
}
// LB8a
if (prev == LineBreakType::zwj)
{
emit (TextBreakType::none);
i++;
continue;
}
// LB13
if (contains ({ LineBreakType::cl, LineBreakType::cp, LineBreakType::ex, LineBreakType::is, LineBreakType::sy }, next))
{
emit (TextBreakType::none);
i++;
continue;
}
// lb21a
if (lb21a && contains ({ LineBreakType::hy, LineBreakType::ba }, prev))
{
emit (TextBreakType::none);
i++;
continue;
}
lb21a = prev == LineBreakType::hl;
// LB30a
if (prev == LineBreakType::ri)
{
regionalCounter++;
if (next == LineBreakType::ri && regionalCounter % 2 == 0)
{
regionalCounter = 0;
emit (TextBreakType::soft);
i++;
continue;
}
}
else
{
regionalCounter = 0;
}
const auto bt = BreakPairTable::getLineBreakOpportunity (prev, next);
switch (bt)
{
case BreakOpportunity::direct:
{
emit (TextBreakType::soft);
i++;
continue;
}
case BreakOpportunity::prohibited:
{
emit (TextBreakType::none);
i++;
continue;
}
case BreakOpportunity::indirect:
{
emit (next == LineBreakType::sp || next == LineBreakType::cm ? TextBreakType::soft
: TextBreakType::none);
i++;
continue;
}
case BreakOpportunity::combinedIndirect:
case BreakOpportunity::combinedProhibited:
{
if (! contains ({ LineBreakType::bk, LineBreakType::cr,
LineBreakType::lf, LineBreakType::nl,
LineBreakType::sp, LineBreakType::zw }, prev))
{
lb9 = std::make_optional (prev);
}
while (i < len)
{
if (i == len - 1)
{
emit (TextBreakType::soft);
i++;
break;
}
emit (TextBreakType::none);
if (! contains ({ LineBreakType::cm, LineBreakType::zwj }, resolve (data[i])))
break;
i++;
}
i++;
continue;
}
}
i++;
continue;
}
return resultIndex;
}
private:
static inline constexpr size_t index (ValueType value)
static LineBreakType resolve (const UnicodeAnalysisPoint& point)
{
return (size_t) value;
const auto bc = point.getBreakType();
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wswitch-enum")
switch (bc)
{
case LineBreakType::ai:
case LineBreakType::sg:
case LineBreakType::xx:
return LineBreakType::al;
case LineBreakType::cj:
return LineBreakType::ns;
case LineBreakType::sa:
return contains ({ GeneralCategory::mn, GeneralCategory::mc }, point.getGeneralCategory())
? LineBreakType::cm
: LineBreakType::al;
default: break;
}
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
return bc;
}
ResultType cols[Size][Size];
};
enum class BreakOppurtunity
{
direct,
indirect,
prohibited,
combinedProhibited,
combinedIndirect
};
struct BreakAtom final : public UnicodeAnalysisPoint
{
constexpr bool operator== (BreakClass type) const { return data.bt == type; }
constexpr bool operator== (EAWType type) const { return data.asian == type; }
constexpr auto getBreakClass() const { return data.bt; }
constexpr auto getEastAsianWidthType() const { return data.asian; }
};
static_assert (sizeof (BreakAtom) == sizeof (UnicodeAnalysisPoint), "BreakAtom - UnicodeAnalysisPoint size mismatch");
struct BreakPairTable final : LookUpTable<42, BreakClass, BreakOppurtunity>
{
BreakPairTable()
static LineBreakType resolveSOT (LineBreakType bc)
{
#include "juce_LineBreakTable.inl"
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wswitch-enum")
switch (bc)
{
case LineBreakType::lf:
case LineBreakType::nl:
return LineBreakType::bk;
case LineBreakType::sp:
return LineBreakType::wj;
default: break;
}
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
return bc;
}
};
static inline BreakClass resolve (BreakClass bc, [[maybe_unused]] bool mnMc = false)
{
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wswitch-enum")
switch (bc)
{
case BreakClass::ai:
case BreakClass::sg:
case BreakClass::xx:
return BreakClass::al;
case BreakClass::sa:
return BreakClass::al;
case BreakClass::cj:
return BreakClass::ns;
default: break;
}
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
return bc;
}
static inline BreakClass resolveSOT (BreakClass bc)
{
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wswitch-enum")
switch (bc)
{
case BreakClass::lf:
case BreakClass::nl:
return BreakClass::bk;
case BreakClass::sp:
return BreakClass::wj;
default: break;
}
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
return bc;
}
static const BreakPairTable pairTable;
template <typename Callback>
size_t analyseLineBreaks (Span<const UnicodeAnalysisPoint> span, Callback&& callback)
{
uint32_t resultIndex = 0;
uint32_t regionalCounter = 0;
std::optional<BreakClass> lb9;
bool lb21a{};
const auto data = (const BreakAtom*) span.data();
const auto len = span.size();
const auto emit = [&] (auto op) { callback ((int) resultIndex++, op); };
#define step() i++; continue
for (size_t i = 0; i < len;)
{
const auto isSOT = i == 0;
const auto isEOT = i == len - 1;
const auto prev = isSOT ? resolveSOT (resolve (data[i].getBreakClass()))
: lb9.value_or (resolve (data[i].getBreakClass()));
const auto next = isEOT ? BreakClass::cm
: resolve (data[i + 1].getBreakClass());
lb9.reset();
if (prev == BreakClass::cr && next == BreakClass::lf)
{
emit (TextBreakType::none);
step();
}
// LB4
if (any (prev, BreakClass::bk, BreakClass::lf, BreakClass::nl))
{
emit (TextBreakType::hard);
step();
}
// LB6
if (any (next, BreakClass::bk, BreakClass::lf, BreakClass::nl))
{
emit (TextBreakType::none);
step();
}
// LB7
if (any (next, BreakClass::sp, BreakClass::zw))
{
emit (TextBreakType::none);
step();
}
// LB13
if (any (next, BreakClass::cl, BreakClass::cp, BreakClass::ex, BreakClass::is, BreakClass::sy))
{
emit (TextBreakType::none);
step();
}
// lb21a
if (lb21a && any (prev, BreakClass::hy, BreakClass::ba))
{
emit (TextBreakType::none);
step();
}
lb21a = prev == BreakClass::hl;
// LB30a
if (prev == BreakClass::ri)
{
regionalCounter++;
if (next == BreakClass::ri && regionalCounter % 2 == 0)
{
regionalCounter = 0;
emit (TextBreakType::soft);
step();
}
}
else
{
regionalCounter = 0;
}
const auto bt = pairTable.get (prev, next);
switch (bt)
{
case BreakOppurtunity::direct:
{
emit (TextBreakType::soft);
step();
} break;
case BreakOppurtunity::prohibited:
{
emit (TextBreakType::none);
step();
} break;
case BreakOppurtunity::indirect:
{
while (i < len)
{
emit (TextBreakType::none);
if (resolve (data[i].getBreakClass()) != BreakClass::sp)
break;
i++;
}
step();
} break;
case BreakOppurtunity::combinedIndirect:
{
lb9 = std::make_optional (prev);
while (i < len)
{
emit (TextBreakType::none);
if (! any (resolve (data[i].getBreakClass()), BreakClass::cm, BreakClass::zwj))
break;
i++;
}
step();
} break;
case BreakOppurtunity::combinedProhibited:
{
emit (TextBreakType::none);
step();
} break;
}
step();
}
//emit (TextBreakType::soft);
#undef emit
#undef step
return resultIndex;
}
}

View file

@ -34,126 +34,202 @@
namespace juce
{
inline TextScript mapTextScript (UnicodeTextScript type)
// https://www.unicode.org/reports/tr31/#Table_Recommended_Scripts
enum class TextScript
{
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wswitch-enum")
// Recommend scripts
common,
arabic,
armenian,
bengali,
bopomofo,
cyrillic,
devanagari,
ethiopic,
georgian,
greek,
gujarati,
gurmukhi,
hangul,
han,
hebrew,
hiragana,
katakana,
kannada,
khmer,
lao,
latin,
malayalam,
myanmar,
oriya,
sinhala,
tamil,
telugu,
thaana,
thai,
tibetan,
#define CASE(in, out) case UnicodeTextScript::in: return TextScript::out
switch (type)
{
CASE (Common, common);
CASE (Emoji, emoji);
CASE (Arabic, arabic);
CASE (Armenian, armenian);
CASE (Bengali, bengali);
CASE (Bopomofo, bopomofo);
CASE (Cyrillic, cyrillic);
CASE (Devanagari, devanagari);
CASE (Ethiopic, ethiopic);
CASE (Georgian, georgian);
CASE (Greek, greek);
CASE (Gujarati, gujarati);
CASE (Gurmukhi, gurmukhi);
CASE (Hangul, hangul);
CASE (Han, han);
CASE (Hebrew, hebrew);
CASE (Hiragana, hiragana);
CASE (Katakana, katakana);
CASE (Kannada, kannada);
CASE (Khmer, khmer);
CASE (Lao, lao);
CASE (Latin, latin);
CASE (Malayalam, malayalam);
CASE (Myanmar, myanmar);
CASE (Oriya, oriya);
CASE (Sinhala, sinhala);
CASE (Tamil, tamil);
CASE (Telugu, telugu);
CASE (Thaana, thaana);
CASE (Thai, thai);
CASE (Tibetan, tibetan);
// Limited use
adlam,
balinese,
bamum,
batak,
chakma,
canadianAboriginalSyllabics,
cham,
cherokee,
nyiakengPuachueHmong,
javanese,
kayahLi,
taiTham,
lepcha,
limbu,
lisu,
mandaic,
meeteiMayek,
newa,
nko,
olChiki,
osage,
miao,
hanifiRohingya,
saurashtra,
sundanese,
sylotiNagri,
syriac,
taiLe,
newTaiLue,
taiViet,
tifinagh,
vai,
wancho,
yi,
CASE (Adlam, adlam);
CASE (Balinese, balinese);
CASE (Bamum, bamum);
CASE (Batak, batak);
CASE (Chakma, chakma);
CASE (Cham, cham);
CASE (Cherokee, cherokee);
CASE (Javanese, javanese);
CASE (Kayah_Li, kayahLi);
CASE (Tai_Tham, taiTham);
CASE (Lepcha, lepcha);
CASE (Limbu, limbu);
CASE (Lisu, lisu);
CASE (Mandaic, mandaic);
CASE (Meetei_Mayek, meeteiMayek);
CASE (Newa, newa);
CASE (Nko, nko);
CASE (Ol_Chiki, olChiki);
CASE (Osage, osage);
CASE (Miao, miao);
CASE (Saurashtra, saurashtra);
CASE (Sundanese, sundanese);
CASE (Syloti_Nagri, sylotiNagri);
CASE (Syriac, syriac);
CASE (Tai_Le, taiLe);
CASE (New_Tai_Lue, newTaiLue);
CASE (Tai_Viet, taiViet);
CASE (Tifinagh, tifinagh);
CASE (Vai, vai);
CASE (Wancho, wancho);
CASE (Yi, yi);
emoji,
CASE (Hanifi_Rohingya, hanifiRohingya);
CASE (Nyiakeng_Puachue_Hmong, nyiakengPuachueHmong);
CASE (Canadian_Aboriginal, canadianAboriginalSyllabics);
scriptCount
};
default: break;
}
#undef CASE
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
return TextScript::common;
}
// TR24
// https://www.unicode.org/reports/tr24/tr24-32.html
namespace tr24
class TR24
{
public:
TR24() = delete;
template <typename Callback>
void inline analyseScripts (const Span<UnicodeAnalysisPoint> points, Callback&& callback)
{
bool once = false;
UnicodeTextScript previousBaseTextScript = UnicodeTextScript::Common;
for (size_t i = 0; i < points.size(); i++)
template <typename Callback>
static void analyseScripts (Span<const UnicodeAnalysisPoint> points, Callback&& callback)
{
const auto& entry = points[i].data;
auto script = entry.script;
bool once = false;
auto previousBaseTextScript = UnicodeScriptType::common;
if (! std::exchange (once, true))
for (const auto [i, value] : enumerate (points))
{
if (script == UnicodeTextScript::Inherited)
script = UnicodeTextScript::Common;
const auto& entry = value.data;
auto script = entry.script;
if (! std::exchange (once, true))
{
if (script == UnicodeScriptType::inherited)
script = UnicodeScriptType::common;
previousBaseTextScript = script;
}
if (script == UnicodeScriptType::common && entry.emoji == EmojiType::extended)
script = UnicodeScriptType::emoji;
if (script == UnicodeScriptType::common || script == UnicodeScriptType::inherited)
script = previousBaseTextScript;
callback ((int) i, mapTextScript (script));
previousBaseTextScript = script;
}
if (script == UnicodeTextScript::Common && entry.emoji == EmojiType::extended)
script = UnicodeTextScript::Emoji;
// Last part is a hack..
if (script == UnicodeTextScript::Common || script == UnicodeTextScript::Inherited)
script = previousBaseTextScript;
callback ((int) i, mapTextScript (script));
previousBaseTextScript = script;
}
}
}
private:
// The Unicode script spec lists a large number of scripts, some of which are recommended to be ignored.
// We map them to a script that we support here.
static TextScript mapTextScript (UnicodeScriptType type)
{
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wswitch-enum")
switch (type)
{
case UnicodeScriptType::common: return TextScript::common;
case UnicodeScriptType::emoji: return TextScript::emoji;
case UnicodeScriptType::arabic: return TextScript::arabic;
case UnicodeScriptType::armenian: return TextScript::armenian;
case UnicodeScriptType::bengali: return TextScript::bengali;
case UnicodeScriptType::bopomofo: return TextScript::bopomofo;
case UnicodeScriptType::cyrillic: return TextScript::cyrillic;
case UnicodeScriptType::devanagari: return TextScript::devanagari;
case UnicodeScriptType::ethiopic: return TextScript::ethiopic;
case UnicodeScriptType::georgian: return TextScript::georgian;
case UnicodeScriptType::greek: return TextScript::greek;
case UnicodeScriptType::gujarati: return TextScript::gujarati;
case UnicodeScriptType::gurmukhi: return TextScript::gurmukhi;
case UnicodeScriptType::hangul: return TextScript::hangul;
case UnicodeScriptType::han: return TextScript::han;
case UnicodeScriptType::hebrew: return TextScript::hebrew;
case UnicodeScriptType::hiragana: return TextScript::hiragana;
case UnicodeScriptType::katakana: return TextScript::katakana;
case UnicodeScriptType::kannada: return TextScript::kannada;
case UnicodeScriptType::khmer: return TextScript::khmer;
case UnicodeScriptType::lao: return TextScript::lao;
case UnicodeScriptType::latin: return TextScript::latin;
case UnicodeScriptType::malayalam: return TextScript::malayalam;
case UnicodeScriptType::myanmar: return TextScript::myanmar;
case UnicodeScriptType::oriya: return TextScript::oriya;
case UnicodeScriptType::sinhala: return TextScript::sinhala;
case UnicodeScriptType::tamil: return TextScript::tamil;
case UnicodeScriptType::telugu: return TextScript::telugu;
case UnicodeScriptType::thaana: return TextScript::thaana;
case UnicodeScriptType::thai: return TextScript::thai;
case UnicodeScriptType::tibetan: return TextScript::tibetan;
case UnicodeScriptType::adlam: return TextScript::adlam;
case UnicodeScriptType::balinese: return TextScript::balinese;
case UnicodeScriptType::bamum: return TextScript::bamum;
case UnicodeScriptType::batak: return TextScript::batak;
case UnicodeScriptType::chakma: return TextScript::chakma;
case UnicodeScriptType::cham: return TextScript::cham;
case UnicodeScriptType::cherokee: return TextScript::cherokee;
case UnicodeScriptType::javanese: return TextScript::javanese;
case UnicodeScriptType::kayah_li: return TextScript::kayahLi;
case UnicodeScriptType::tai_tham: return TextScript::taiTham;
case UnicodeScriptType::lepcha: return TextScript::lepcha;
case UnicodeScriptType::limbu: return TextScript::limbu;
case UnicodeScriptType::lisu: return TextScript::lisu;
case UnicodeScriptType::mandaic: return TextScript::mandaic;
case UnicodeScriptType::meetei_mayek: return TextScript::meeteiMayek;
case UnicodeScriptType::newa: return TextScript::newa;
case UnicodeScriptType::nko: return TextScript::nko;
case UnicodeScriptType::ol_chiki: return TextScript::olChiki;
case UnicodeScriptType::osage: return TextScript::osage;
case UnicodeScriptType::miao: return TextScript::miao;
case UnicodeScriptType::saurashtra: return TextScript::saurashtra;
case UnicodeScriptType::sundanese: return TextScript::sundanese;
case UnicodeScriptType::syloti_nagri: return TextScript::sylotiNagri;
case UnicodeScriptType::syriac: return TextScript::syriac;
case UnicodeScriptType::tai_le: return TextScript::taiLe;
case UnicodeScriptType::new_tai_lue: return TextScript::newTaiLue;
case UnicodeScriptType::tai_viet: return TextScript::taiViet;
case UnicodeScriptType::tifinagh: return TextScript::tifinagh;
case UnicodeScriptType::vai: return TextScript::vai;
case UnicodeScriptType::wancho: return TextScript::wancho;
case UnicodeScriptType::yi: return TextScript::yi;
case UnicodeScriptType::hanifi_rohingya: return TextScript::hanifiRohingya;
case UnicodeScriptType::nyiakeng_puachue_hmong: return TextScript::nyiakengPuachueHmong;
case UnicodeScriptType::canadian_aboriginal: return TextScript::canadianAboriginalSyllabics;
default: break;
}
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
return TextScript::common;
}
};
}

View file

@ -1,114 +0,0 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
namespace juce
{
// https://www.unicode.org/reports/tr31/#Table_Recommended_Scripts
enum class TextScript
{
// Recommend scripts
common,
arabic,
armenian,
bengali,
bopomofo,
cyrillic,
devanagari,
ethiopic,
georgian,
greek,
gujarati,
gurmukhi,
hangul,
han,
hebrew,
hiragana,
katakana,
kannada,
khmer,
lao,
latin,
malayalam,
myanmar,
oriya,
sinhala,
tamil,
telugu,
thaana,
thai,
tibetan,
// Limited use
adlam,
balinese,
bamum,
batak,
chakma,
canadianAboriginalSyllabics,
cham,
cherokee,
nyiakengPuachueHmong,
javanese,
kayahLi,
taiTham,
lepcha,
limbu,
lisu,
mandaic,
meeteiMayek,
newa,
nko,
olChiki,
osage,
miao,
hanifiRohingya,
saurashtra,
sundanese,
sylotiNagri,
syriac,
taiLe,
newTaiLue,
taiViet,
tifinagh,
vai,
wancho,
yi,
emoji,
scriptCount
};
} // namespace juce

File diff suppressed because it is too large Load diff

View file

@ -35,235 +35,70 @@
namespace juce
{
// This only make sense with integral/enum types.
// We use it for enums and std::pair<enum, enum>.
template <typename T, typename... TT>
static constexpr bool any (T b, TT... bs)
template <typename T>
static constexpr bool contains (std::initializer_list<T> span, const T& b)
{
return ((b == bs) || ...);
for (const auto& i : span)
if (i == b)
return true;
return false;
}
// Order is important!!!!
enum class LineBreakType : uint8_t
{
al, bk, cm, cr, gl, lf, nl, sp, wj,
zw, zwj, ai, b2, ba, bb, cb, cj, cl, cp,
eb, em, ex, h2, h3, hl, hy, in, is, jl,
id, jt, jv, ns, nu, op, po, pr, qu, ri,
sa, sg, sy, xx, opw
};
// Order is important!!!!
enum class EastAsianWidthType : uint8_t
{
N,
narrow,
ambiguous,
full,
half,
wide
};
// Order is important!!!!
enum class BidiType : uint8_t
{
// Strong: Left to right
ltr,
// Strong: Right to left
rtl,
// Strong: Arabic Right to left
al,
// Weak: European number
en,
// Weak: Arabic umber
an,
// Weak: European number seperator
es,
// Weak: European number terminator
et,
// Weak: Common number seperator
cs,
// Weak: onspacing mark
nsm,
// Weak: Boundary
bn,
// eutral: Paragraph seperator
b,
// eutral: Segment seperator
s,
// eutral: Whitespace
ws,
// eutral: Other s
on,
// Explicit Formatting: LTR Embedding
lre,
// Explicit Formatting: LTR Override
lro,
// Explicit Formatting: RTL Embedding
rle,
// Explicit Formatting: RTL Overide
rlo,
// Explicit Formatting: Pop Directional Format
pdf,
// Explicit Formatting: LTR Isolate
lri,
// Explicit Formatting: RTL Isolate
rli,
// Explicit Formatting: First Strong Isolate
fsi,
// Explicit Formatting: Pop Directional Isolate
pdi,
none
};
enum class VerticalTransformType : uint8_t
{
R, U, Tr, Tu
};
// https://www.unicode.org/reports/tr51/tr51-21.html
enum class EmojiType : uint8_t
{
yes,
presentation,
modifier,
modifierBase,
component,
extended,
no
};
// This is an internal type
enum class UnicodeTextScript : uint8_t
{
Common, Inherited, Han, Arabic, Hiragana, Adlam, Mende_Kikakui, Ethiopic, Wancho,
Toto, Nyiakeng_Puachue_Hmong, Glagolitic, Latin, SignWriting, Greek, Duployan,
Nushu, Katakana, Tangut, Khitan_Small_Script, Miao, Medefaidrin, Pahawh_Hmong,
Bassa_Vah, Tangsa, Mro, Bamum, Cypro_Minoan, Cuneiform, Tamil, Lisu, Makasar,
Gunjala_Gondi, Masaram_Gondi, Marchen, Bhaiksuki, Pau_Cin_Hau, Canadian_Aboriginal,
Soyombo, Zanabazar_Square, Nandinagari, Dives_Akuru, Warang_Citi, Dogra, Ahom,
Takri, Mongolian, Modi, Siddham, Tirhuta, Newa, Grantha, Khudawadi, Multani,
Khojki, Sinhala, Sharada, Mahajani, Chakma, Sora_Sompeng, Kaithi, Brahmi, Elymaic,
Chorasmian, Sogdian, Yezidi, Hanifi_Rohingya, Psalter_Pahlavi, Avestan, Manichaean,
Kharoshthi, Meroitic_Cursive, Lydian, Phoenician, Hatran, Nabataean, Palmyrene,
Imperial_Aramaic, Cypriot, Vithkuqi, Caucasian_Albanian, Elbasan, Osage,
Osmanya, Shavian, Deseret, Ugaritic, Gothic, Carian, Lycian, Hangul, Cyrillic,
Hebrew, Armenian, Meetei_Mayek, Cherokee, Tai_Viet, Myanmar, Cham, Javanese, Rejang,
Kayah_Li, Devanagari, Saurashtra, Phags_Pa, Syloti_Nagri, Vai, Yi, Bopomofo,
Tifinagh, Georgian, Coptic, Braille, Sundanese, Ol_Chiki, Lepcha, Batak, Balinese,
Tai_Tham, Buginese, Khmer, Limbu, Tai_Le, Tagbanwa, Buhid, Hanunoo, Tagalog, Runic,
Ogham, Tibetan, Lao, Thai, Malayalam, Kannada, Telugu, Oriya, Gujarati, Gurmukhi,
Bengali, Syriac, Mandaic, Samaritan, Nko, Thaana,
Linear_A,
Linear_B,
New_Tai_Lue,
Old_Hungarian,
Old_Turkic,
Old_Uyghur,
Old_Sogdian,
Old_South_Arabian,
Old_North_Arabian,
Old_Persian,
Old_Permic,
Old_Italic,
Inscriptional_Pahlavi,
Inscriptional_Parthian,
Anatolian_Hieroglyphs,
Egyptian_Hieroglyphs,
Meroitic_Hieroglyphs,
Emoji
};
enum class GraphemeBreakType : uint8_t
{
other, cr, lf, control, extend, regionalIndicator, prepend, spacingMark,
l, v, t, lv, lvt, zwj
};
namespace generated
{
#include "juce_UnicodeData.cpp"
#ifdef JUCE_UNIT_TESTS
#include "juce_UnicodeTestData.cpp"
#endif
}
using UnicodeData = generated::UnicodeEntry;
struct UnicodeAnalysisPoint
{
uint32_t character;
UnicodeData data;
char32_t character = 0;
UnicodeEntry data{};
uint16_t bidiLevel = 0;
struct
UnicodeAnalysisPoint (char32_t characterIn, UnicodeEntry entry)
: character { characterIn },
data { std::move (entry) }
{}
LineBreakType getBreakType() const
{
uint16_t level;
} bidi;
return data.bt;
}
GeneralCategory getGeneralCategory() const
{
return data.generalCategory;
}
BidiType getBidiType() const
{
return data.bidi;
}
void setBidiType (BidiType newType)
{
data.bidi = newType;
}
bool operator== (const BidiType& b) const
{
return getBidiType() == b;
}
};
static UnicodeData getUnicodeDataForCodepoint (uint32_t codepoint)
//==============================================================================
/* Types of breaks between characters. */
enum class TextBreakType
{
static const Array<UnicodeData> data = []
{
using namespace generated;
none, // The sequence of characters should not be broken.
Array<UnicodeData> arr;
soft, // The sequence of characters can be broken, if required.
MemoryInputStream mStream {compressedUnicodeData, std::size (compressedUnicodeData), false};
GZIPDecompressorInputStream zStream {&mStream, false};
hard // The sequence of characters must be broken here.
};
// TODO: error checking
arr.resize (uncompressedUnicodeDataSize / sizeof (UnicodeData));
zStream.read (arr.getRawDataPointer(), uncompressedUnicodeDataSize);
return arr;
}();
return data[(int) codepoint];
}
// https://www.unicode.org/Public/UCD/latest/ucd/Jamo.txt
static inline bool isJamoSymbol (uint32_t cp)
/** Types of text direction. This may also be applied to characters. */
enum class TextDirection
{
return ((cp >= 0x1100 && cp <= 0x1112) ||
(cp >= 0x1161 && cp <= 0x1175) ||
(cp >= 0x11A8 && cp <= 0x11C2));
}
ltr, // This text reads left to right.
static inline EmojiType getEmojiType (uint32_t cp)
{
return getUnicodeDataForCodepoint (cp).emoji;
}
rtl // This text reads right to left.
};
} // namespace juce