mirror of
https://github.com/nodejs/node.git
synced 2026-10-28 18:25:13 +08:00
PR-URL: https://github.com/nodejs/node/pull/64790 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Filip Skokan <panva.ip@gmail.com> Reviewed-By: René <contact.9a5d6388@renegade334.me.uk>
15487 lines
706 KiB
C++
15487 lines
706 KiB
C++
/* auto-generated on 2026-07-27 16:10:09 -0400. Do not edit! */
|
|
/* begin file src/ada.cpp */
|
|
#include "ada.h"
|
|
/* begin file src/checkers.cpp */
|
|
|
|
#include <algorithm>
|
|
#include <array>
|
|
#include <string_view>
|
|
|
|
namespace ada::checkers {
|
|
|
|
ada_really_inline constexpr bool is_ipv4(std::string_view view) noexcept {
|
|
// The string is not empty and does not contain upper case ASCII characters.
|
|
//
|
|
// Optimization. To be considered as a possible ipv4, the string must end
|
|
// with 'x' or a lowercase hex character.
|
|
// Most of the time, this will be false so this simple check will save a lot
|
|
// of effort.
|
|
// If the address ends with a dot, we need to prune it (special case).
|
|
if (view.ends_with('.')) {
|
|
view.remove_suffix(1);
|
|
if (view.empty()) {
|
|
return false;
|
|
}
|
|
}
|
|
char last_char = view.back();
|
|
bool possible_ipv4 = (last_char >= '0' && last_char <= '9') ||
|
|
(last_char >= 'a' && last_char <= 'f') ||
|
|
last_char == 'x';
|
|
if (!possible_ipv4) {
|
|
return false;
|
|
}
|
|
// From the last character, find the last dot.
|
|
size_t last_dot = view.rfind('.');
|
|
if (last_dot != std::string_view::npos) {
|
|
// We have at least one dot.
|
|
view.remove_prefix(last_dot + 1);
|
|
}
|
|
/** Optimization opportunity: we have basically identified the last number of
|
|
the ipv4 if we return true here. We might as well parse it and have at
|
|
least one number parsed when we get to parse_ipv4. */
|
|
if (std::ranges::all_of(view, ada::checkers::is_digit)) {
|
|
return true;
|
|
}
|
|
// It could be hex (0x), but not if there is a single character.
|
|
if (view.size() == 1) {
|
|
return false;
|
|
}
|
|
// It must start with 0x.
|
|
if (!view.starts_with("0x")) {
|
|
return false;
|
|
}
|
|
// We must allow "0x".
|
|
if (view.size() == 2) {
|
|
return true;
|
|
}
|
|
// We have 0x followed by some characters, we need to check that they are
|
|
// hexadecimals.
|
|
view.remove_prefix(2);
|
|
return std::ranges::all_of(view, ada::unicode::is_lowercase_hex);
|
|
}
|
|
|
|
// for use with path_signature, we include all characters that need percent
|
|
// encoding.
|
|
static constexpr std::array<uint8_t, 256> path_signature_table =
|
|
[]() consteval {
|
|
std::array<uint8_t, 256> result{};
|
|
for (size_t i = 0; i < 256; i++) {
|
|
if (i <= 0x20 || i == 0x22 || i == 0x23 || i == 0x3c || i == 0x3e ||
|
|
i == 0x3f || i == 0x5e || i == 0x60 || i == 0x7b || i == 0x7d ||
|
|
i > 0x7e) {
|
|
result[i] = 1;
|
|
} else if (i == 0x25) {
|
|
result[i] = 8;
|
|
} else if (i == 0x2e) {
|
|
result[i] = 4;
|
|
} else if (i == 0x5c) {
|
|
result[i] = 2;
|
|
} else {
|
|
result[i] = 0;
|
|
}
|
|
}
|
|
return result;
|
|
}();
|
|
|
|
ada_really_inline constexpr uint8_t path_signature(
|
|
std::string_view input) noexcept {
|
|
// The path percent-encode set is the query percent-encode set and U+003F (?),
|
|
// U+0060 (`), U+007B ({), and U+007D (}). The query percent-encode set is the
|
|
// C0 control percent-encode set and U+0020 SPACE, U+0022 ("), U+0023 (#),
|
|
// U+003C (<), and U+003E (>). The C0 control percent-encode set are the C0
|
|
// controls and all code points greater than U+007E (~).
|
|
size_t i = 0;
|
|
uint8_t accumulator{};
|
|
for (; i + 7 < input.size(); i += 8) {
|
|
accumulator |= uint8_t(path_signature_table[uint8_t(input[i])] |
|
|
path_signature_table[uint8_t(input[i + 1])] |
|
|
path_signature_table[uint8_t(input[i + 2])] |
|
|
path_signature_table[uint8_t(input[i + 3])] |
|
|
path_signature_table[uint8_t(input[i + 4])] |
|
|
path_signature_table[uint8_t(input[i + 5])] |
|
|
path_signature_table[uint8_t(input[i + 6])] |
|
|
path_signature_table[uint8_t(input[i + 7])]);
|
|
}
|
|
for (; i < input.size(); i++) {
|
|
accumulator |= uint8_t(path_signature_table[uint8_t(input[i])]);
|
|
}
|
|
return accumulator;
|
|
}
|
|
|
|
ada_really_inline constexpr bool verify_dns_length(
|
|
std::string_view input) noexcept {
|
|
if (input.empty()) return false;
|
|
if (input.back() == '.') {
|
|
if (input.size() > 254) return false;
|
|
} else if (input.size() > 253)
|
|
return false;
|
|
|
|
size_t start = 0;
|
|
while (start < input.size()) {
|
|
auto dot_location = input.find('.', start);
|
|
// If not found, it's likely the end of the domain
|
|
if (dot_location == std::string_view::npos) dot_location = input.size();
|
|
|
|
auto label_size = dot_location - start;
|
|
if (label_size > 63 || label_size == 0) return false;
|
|
|
|
start = dot_location + 1;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
} // namespace ada::checkers
|
|
/* end file src/checkers.cpp */
|
|
/* begin file src/unicode.cpp */
|
|
|
|
|
|
ADA_PUSH_DISABLE_ALL_WARNINGS
|
|
/* begin file src/ada_idna.cpp */
|
|
/* auto-generated on 2026-07-12 20:34:08 -0400. Do not edit! */
|
|
/* begin file src/idna.cpp */
|
|
/* begin file src/unicode_transcoding.cpp */
|
|
/* begin file include/ada/idna/unicode_transcoding.h */
|
|
#ifndef ADA_IDNA_UNICODE_TRANSCODING_H
|
|
#define ADA_IDNA_UNICODE_TRANSCODING_H
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
namespace ada::idna {
|
|
|
|
size_t utf8_to_utf32(const char* buf, size_t len, char32_t* utf32_output);
|
|
|
|
size_t utf8_length_from_utf32(const char32_t* buf, size_t len);
|
|
|
|
size_t utf32_length_from_utf8(const char* buf, size_t len);
|
|
|
|
size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output);
|
|
|
|
} // namespace ada::idna
|
|
|
|
#endif // ADA_IDNA_UNICODE_TRANSCODING_H
|
|
/* end file include/ada/idna/unicode_transcoding.h */
|
|
|
|
#include <algorithm>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
|
|
namespace ada::idna {
|
|
|
|
size_t utf8_to_utf32(const char* buf, size_t len, char32_t* utf32_output) {
|
|
const uint8_t* data = reinterpret_cast<const uint8_t*>(buf);
|
|
size_t pos = 0;
|
|
const char32_t* start{utf32_output};
|
|
while (pos < len) {
|
|
// try to convert the next block of 16 ASCII bytes
|
|
if (pos + 16 <= len) { // if it is safe to read 16 more
|
|
// bytes, check that they are ascii
|
|
uint64_t v1;
|
|
std::memcpy(&v1, data + pos, sizeof(uint64_t));
|
|
uint64_t v2;
|
|
std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t));
|
|
uint64_t v{v1 | v2};
|
|
if ((v & 0x8080808080808080) == 0) {
|
|
size_t final_pos = pos + 16;
|
|
while (pos < final_pos) {
|
|
*utf32_output++ = char32_t(buf[pos]);
|
|
pos++;
|
|
}
|
|
continue;
|
|
}
|
|
}
|
|
uint8_t leading_byte = data[pos]; // leading byte
|
|
if (leading_byte < 0b10000000) {
|
|
// converting one ASCII byte !!!
|
|
*utf32_output++ = char32_t(leading_byte);
|
|
pos++;
|
|
} else if ((leading_byte & 0b11100000) == 0b11000000) {
|
|
// We have a two-byte UTF-8
|
|
if (pos + 1 >= len) {
|
|
return 0;
|
|
} // minimal bound checking
|
|
if ((data[pos + 1] & 0b11000000) != 0b10000000) {
|
|
return 0;
|
|
}
|
|
// range check
|
|
uint32_t code_point =
|
|
(leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111);
|
|
if (code_point < 0x80 || 0x7ff < code_point) {
|
|
return 0;
|
|
}
|
|
*utf32_output++ = char32_t(code_point);
|
|
pos += 2;
|
|
} else if ((leading_byte & 0b11110000) == 0b11100000) {
|
|
// We have a three-byte UTF-8
|
|
if (pos + 2 >= len) {
|
|
return 0;
|
|
} // minimal bound checking
|
|
|
|
if ((data[pos + 1] & 0b11000000) != 0b10000000) {
|
|
return 0;
|
|
}
|
|
if ((data[pos + 2] & 0b11000000) != 0b10000000) {
|
|
return 0;
|
|
}
|
|
// range check
|
|
uint32_t code_point = (leading_byte & 0b00001111) << 12 |
|
|
(data[pos + 1] & 0b00111111) << 6 |
|
|
(data[pos + 2] & 0b00111111);
|
|
if (code_point < 0x800 || 0xffff < code_point ||
|
|
(0xd7ff < code_point && code_point < 0xe000)) {
|
|
return 0;
|
|
}
|
|
*utf32_output++ = char32_t(code_point);
|
|
pos += 3;
|
|
} else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000
|
|
// we have a 4-byte UTF-8 word.
|
|
if (pos + 3 >= len) {
|
|
return 0;
|
|
} // minimal bound checking
|
|
if ((data[pos + 1] & 0b11000000) != 0b10000000) {
|
|
return 0;
|
|
}
|
|
if ((data[pos + 2] & 0b11000000) != 0b10000000) {
|
|
return 0;
|
|
}
|
|
if ((data[pos + 3] & 0b11000000) != 0b10000000) {
|
|
return 0;
|
|
}
|
|
|
|
// range check
|
|
uint32_t code_point = (leading_byte & 0b00000111) << 18 |
|
|
(data[pos + 1] & 0b00111111) << 12 |
|
|
(data[pos + 2] & 0b00111111) << 6 |
|
|
(data[pos + 3] & 0b00111111);
|
|
if (code_point <= 0xffff || 0x10ffff < code_point) {
|
|
return 0;
|
|
}
|
|
*utf32_output++ = char32_t(code_point);
|
|
pos += 4;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
return utf32_output - start;
|
|
}
|
|
|
|
size_t utf8_length_from_utf32(const char32_t* buf, size_t len) {
|
|
// We are not BOM aware.
|
|
const uint32_t* p = reinterpret_cast<const uint32_t*>(buf);
|
|
size_t counter{0};
|
|
for (size_t i = 0; i != len; ++i) {
|
|
++counter; // ASCII
|
|
counter += static_cast<size_t>(p[i] > 0x7F); // two-byte
|
|
counter += static_cast<size_t>(p[i] > 0x7FF); // three-byte
|
|
counter += static_cast<size_t>(p[i] > 0xFFFF); // four-bytes
|
|
}
|
|
return counter;
|
|
}
|
|
|
|
size_t utf32_length_from_utf8(const char* buf, size_t len) {
|
|
const int8_t* p = reinterpret_cast<const int8_t*>(buf);
|
|
return std::count_if(p, std::next(p, len), [](int8_t c) {
|
|
// -65 is 0b10111111, anything larger in two-complement's
|
|
// should start a new code point.
|
|
return c > -65;
|
|
});
|
|
}
|
|
|
|
size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) {
|
|
const uint32_t* data = reinterpret_cast<const uint32_t*>(buf);
|
|
size_t pos = 0;
|
|
const char* start{utf8_output};
|
|
while (pos < len) {
|
|
// try to convert the next block of 2 ASCII characters
|
|
if (pos + 2 <= len) { // if it is safe to read 8 more
|
|
// bytes, check that they are ascii
|
|
uint64_t v;
|
|
std::memcpy(&v, data + pos, sizeof(uint64_t));
|
|
if ((v & 0xFFFFFF80FFFFFF80) == 0) {
|
|
*utf8_output++ = char(buf[pos]);
|
|
*utf8_output++ = char(buf[pos + 1]);
|
|
pos += 2;
|
|
continue;
|
|
}
|
|
}
|
|
uint32_t word = data[pos];
|
|
if ((word & 0xFFFFFF80) == 0) {
|
|
// will generate one UTF-8 bytes
|
|
*utf8_output++ = char(word);
|
|
pos++;
|
|
} else if ((word & 0xFFFFF800) == 0) {
|
|
// will generate two UTF-8 bytes
|
|
// we have 0b110XXXXX 0b10XXXXXX
|
|
*utf8_output++ = char((word >> 6) | 0b11000000);
|
|
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
pos++;
|
|
} else if ((word & 0xFFFF0000) == 0) {
|
|
// will generate three UTF-8 bytes
|
|
// we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX
|
|
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
return 0;
|
|
}
|
|
*utf8_output++ = char((word >> 12) | 0b11100000);
|
|
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
pos++;
|
|
} else {
|
|
// will generate four UTF-8 bytes
|
|
// we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX
|
|
// 0b10XXXXXX
|
|
if (word > 0x10FFFF) {
|
|
return 0;
|
|
}
|
|
*utf8_output++ = char((word >> 18) | 0b11110000);
|
|
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
|
|
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
pos++;
|
|
}
|
|
}
|
|
return utf8_output - start;
|
|
}
|
|
} // namespace ada::idna
|
|
/* end file src/unicode_transcoding.cpp */
|
|
/* begin file src/mapping.cpp */
|
|
/* begin file include/ada/idna/mapping.h */
|
|
#ifndef ADA_IDNA_MAPPING_H
|
|
#define ADA_IDNA_MAPPING_H
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
namespace ada::idna {
|
|
|
|
// If the input is ascii, then the mapping is just -> lower case.
|
|
void ascii_map(char* input, size_t length);
|
|
// Map the characters according to IDNA, returning the empty string on error.
|
|
std::u32string map(std::u32string_view input);
|
|
// Map into an existing buffer (cleared on entry). Returns false if any code
|
|
// point is disallowed. Reusing the buffer avoids repeated heap allocations
|
|
// when called in a loop over multiple labels.
|
|
bool map(std::u32string_view input, std::u32string& out);
|
|
|
|
} // namespace ada::idna
|
|
|
|
#endif
|
|
/* end file include/ada/idna/mapping.h */
|
|
|
|
#include <array>
|
|
#include <cstring>
|
|
#include <cstdint>
|
|
#include <string>
|
|
|
|
/* begin file src/table_store.hpp */
|
|
// Runtime store for compressed Unicode/IDNA tables.
|
|
// Large tables are DEFLATE-compressed (read-only) and expanded once on first
|
|
// use into a heap buffer so the working set does not bloat the on-disk binary.
|
|
// Hot-path lookups use the same O(1) multi-stage layout as the pre-compression
|
|
// code; compression only affects on-disk size and one-time init.
|
|
//
|
|
// Thread-safe without mutex: atomic CAS + spin-wait. ensure_tables() returns
|
|
// false if initialization fails (OOM, corrupt blob); callers must treat that
|
|
// as a hard error and not touch table pointers.
|
|
|
|
/* begin file src/raw_inflate.hpp */
|
|
// Minimal raw DEFLATE inflater (RFC 1951), enough for zlib raw streams.
|
|
// Returns number of output bytes written, or 0 on failure.
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
|
|
namespace ada::idna::deflate {
|
|
|
|
struct BitReader {
|
|
const uint8_t* p;
|
|
const uint8_t* end;
|
|
uint32_t acc = 0;
|
|
int bits = 0;
|
|
|
|
explicit BitReader(const uint8_t* data, size_t len)
|
|
: p(data), end(data + len) {}
|
|
|
|
bool ensure(int n) {
|
|
while (bits < n) {
|
|
if (p >= end) return false;
|
|
acc |= uint32_t(*p++) << bits;
|
|
bits += 8;
|
|
}
|
|
return true;
|
|
}
|
|
uint32_t get(int n) {
|
|
if (!ensure(n)) return UINT32_MAX;
|
|
uint32_t v = acc & ((1u << n) - 1);
|
|
acc >>= n;
|
|
bits -= n;
|
|
return v;
|
|
}
|
|
void align_byte() {
|
|
acc >>= (bits & 7);
|
|
bits -= (bits & 7);
|
|
}
|
|
};
|
|
|
|
struct Huff {
|
|
// canonical codes: for each length, list of symbols
|
|
// Fast path: table for codes up to max_bits
|
|
static constexpr int MAXBITS = 15;
|
|
uint8_t lengths[288]{};
|
|
int counts[MAXBITS + 1]{};
|
|
int first_code[MAXBITS + 1]{};
|
|
int16_t symbols[288]{};
|
|
int nsymbols = 0;
|
|
int max_bits = 0;
|
|
|
|
// Base index into symbols[] for each code length (used by decode).
|
|
int base_idx[MAXBITS + 1]{};
|
|
|
|
bool build(const uint8_t* lens, int n) {
|
|
std::memset(counts, 0, sizeof(counts));
|
|
std::memset(first_code, 0, sizeof(first_code));
|
|
std::memset(base_idx, 0, sizeof(base_idx));
|
|
nsymbols = n;
|
|
max_bits = 0;
|
|
for (int i = 0; i < n; i++) {
|
|
lengths[i] = lens[i];
|
|
if (lens[i]) {
|
|
counts[lens[i]]++;
|
|
if (lens[i] > max_bits) max_bits = lens[i];
|
|
}
|
|
}
|
|
// Canonical first code for each bit length (RFC 1951).
|
|
int code = 0;
|
|
for (int bits = 1; bits <= MAXBITS; bits++) {
|
|
code = (code + counts[bits - 1]) << 1;
|
|
first_code[bits] = code;
|
|
}
|
|
int idx = 0;
|
|
for (int bits = 1; bits <= max_bits; bits++) {
|
|
base_idx[bits] = idx;
|
|
// assign symbols in symbol order for codes of this length
|
|
for (int sym = 0; sym < n; sym++) {
|
|
if (lengths[sym] == bits) {
|
|
symbols[idx++] = static_cast<int16_t>(sym);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int decode(BitReader& br) const {
|
|
if (max_bits == 0) return -1;
|
|
int code = 0;
|
|
for (int len = 1; len <= max_bits; len++) {
|
|
uint32_t b = br.get(1);
|
|
if (b == UINT32_MAX) return -1;
|
|
code = (code << 1) | int(b);
|
|
int first = first_code[len];
|
|
int cnt = counts[len];
|
|
if (cnt && code - first < cnt) {
|
|
return symbols[base_idx[len] + (code - first)];
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
};
|
|
|
|
// Fixed Huffman tables are built once at dynamic initialization (before main /
|
|
// single-threaded), so concurrent first-use of inflate cannot race.
|
|
inline Huff make_fixed_litlen_huff() {
|
|
Huff h;
|
|
uint8_t lens[288];
|
|
// Fixed Huffman: 0-143:8, 144-255:9, 256-279:7, 280-287:8
|
|
for (int i = 0; i <= 143; i++) lens[i] = 8;
|
|
for (int i = 144; i <= 255; i++) lens[i] = 9;
|
|
for (int i = 256; i <= 279; i++) lens[i] = 7;
|
|
for (int i = 280; i <= 287; i++) lens[i] = 8;
|
|
h.build(lens, 288);
|
|
return h;
|
|
}
|
|
|
|
inline Huff make_fixed_dist_huff() {
|
|
Huff h;
|
|
uint8_t lens[32];
|
|
for (int i = 0; i < 32; i++) lens[i] = 5;
|
|
h.build(lens, 32);
|
|
return h;
|
|
}
|
|
|
|
// NOLINTNEXTLINE(cert-err58-cpp) -- intentional process-lifetime tables
|
|
inline const Huff kFixedLitLenHuff = make_fixed_litlen_huff();
|
|
// NOLINTNEXTLINE(cert-err58-cpp)
|
|
inline const Huff kFixedDistHuff = make_fixed_dist_huff();
|
|
|
|
inline int fixed_litlen(BitReader& br) { return kFixedLitLenHuff.decode(br); }
|
|
|
|
inline int fixed_dist(BitReader& br) { return kFixedDistHuff.decode(br); }
|
|
|
|
// length and distance base tables
|
|
static const uint16_t len_base[29] = {
|
|
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27,
|
|
31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258};
|
|
static const uint8_t len_extra[29] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
|
|
1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
|
|
4, 4, 4, 4, 5, 5, 5, 5, 0};
|
|
static const uint16_t dist_base[30] = {
|
|
1, 2, 3, 4, 5, 7, 9, 13, 17, 25,
|
|
33, 49, 65, 97, 129, 193, 257, 385, 513, 769,
|
|
1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577};
|
|
static const uint8_t dist_extra[30] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3,
|
|
4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
|
|
9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
|
|
|
|
inline size_t inflate_raw(const uint8_t* src, size_t src_len, uint8_t* dst,
|
|
size_t dst_cap) {
|
|
BitReader br(src, src_len);
|
|
size_t out = 0;
|
|
for (;;) {
|
|
uint32_t bfinal = br.get(1);
|
|
uint32_t btype = br.get(2);
|
|
if (bfinal == UINT32_MAX || btype == UINT32_MAX) return 0;
|
|
if (btype == 0) {
|
|
// stored
|
|
br.align_byte();
|
|
if (!br.ensure(16)) return 0;
|
|
// read 16+16 from bit buffer awkwardly - use byte path
|
|
// Align: bits is multiple of 8
|
|
// Get len from remaining bits then bytes
|
|
uint32_t len = br.get(16);
|
|
uint32_t nlen = br.get(16);
|
|
if (len == UINT32_MAX || nlen == UINT32_MAX) return 0;
|
|
if ((len ^ 0xFFFF) != nlen) return 0;
|
|
// After get, may have bits in acc from previous - for stored, should be
|
|
// byte aligned Copy len bytes from p
|
|
if (br.bits != 0) {
|
|
// leftover bits should be 0 if aligned
|
|
}
|
|
if (size_t(br.end - br.p) < len) return 0;
|
|
if (out + len > dst_cap) return 0;
|
|
std::memcpy(dst + out, br.p, len);
|
|
br.p += len;
|
|
out += len;
|
|
} else if (btype == 1 || btype == 2) {
|
|
Huff lit, dist;
|
|
if (btype == 1) {
|
|
// use fixed via functions
|
|
} else {
|
|
// dynamic
|
|
uint32_t hlit = br.get(5);
|
|
if (hlit == UINT32_MAX) return 0;
|
|
hlit += 257;
|
|
uint32_t hdist = br.get(5);
|
|
if (hdist == UINT32_MAX) return 0;
|
|
hdist += 1;
|
|
uint32_t hclen = br.get(4);
|
|
if (hclen == UINT32_MAX) return 0;
|
|
hclen += 4;
|
|
static const int order[19] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5,
|
|
11, 4, 12, 3, 13, 2, 14, 1, 15};
|
|
uint8_t clen[19]{};
|
|
for (uint32_t i = 0; i < hclen; i++) {
|
|
uint32_t v = br.get(3);
|
|
if (v == UINT32_MAX) return 0;
|
|
clen[order[i]] = uint8_t(v);
|
|
}
|
|
Huff cl;
|
|
if (!cl.build(clen, 19)) return 0;
|
|
uint8_t lens[288 + 32]{};
|
|
uint32_t n = hlit + hdist;
|
|
for (uint32_t i = 0; i < n;) {
|
|
int sym = cl.decode(br);
|
|
if (sym < 0) return 0;
|
|
if (sym < 16) {
|
|
lens[i++] = uint8_t(sym);
|
|
} else if (sym == 16) {
|
|
uint32_t rep = br.get(2);
|
|
if (rep == UINT32_MAX) return 0;
|
|
rep += 3;
|
|
if (i == 0) return 0;
|
|
uint8_t v = lens[i - 1];
|
|
while (rep--) lens[i++] = v;
|
|
} else if (sym == 17) {
|
|
uint32_t rep = br.get(3);
|
|
if (rep == UINT32_MAX) return 0;
|
|
rep += 3;
|
|
while (rep--) lens[i++] = 0;
|
|
} else if (sym == 18) {
|
|
uint32_t rep = br.get(7);
|
|
if (rep == UINT32_MAX) return 0;
|
|
rep += 11;
|
|
while (rep--) lens[i++] = 0;
|
|
} else
|
|
return 0;
|
|
}
|
|
if (!lit.build(lens, int(hlit))) return 0;
|
|
if (!dist.build(lens + hlit, int(hdist))) return 0;
|
|
}
|
|
for (;;) {
|
|
int sym;
|
|
if (btype == 1)
|
|
sym = fixed_litlen(br);
|
|
else
|
|
sym = lit.decode(br);
|
|
if (sym < 0) return 0;
|
|
if (sym < 256) {
|
|
if (out >= dst_cap) return 0;
|
|
dst[out++] = uint8_t(sym);
|
|
} else if (sym == 256) {
|
|
break;
|
|
} else {
|
|
int len_code = sym - 257;
|
|
if (len_code < 0 || len_code > 28) return 0;
|
|
uint32_t extra = br.get(len_extra[len_code]);
|
|
if (len_extra[len_code] && extra == UINT32_MAX) return 0;
|
|
uint32_t length =
|
|
len_base[len_code] + (len_extra[len_code] ? extra : 0);
|
|
int dsym;
|
|
if (btype == 1)
|
|
dsym = fixed_dist(br);
|
|
else
|
|
dsym = dist.decode(br);
|
|
if (dsym < 0 || dsym > 29) return 0;
|
|
uint32_t dextra = br.get(dist_extra[dsym]);
|
|
if (dist_extra[dsym] && dextra == UINT32_MAX) return 0;
|
|
uint32_t distance = dist_base[dsym] + (dist_extra[dsym] ? dextra : 0);
|
|
if (distance > out || out + length > dst_cap) return 0;
|
|
for (uint32_t k = 0; k < length; k++) {
|
|
dst[out] = dst[out - distance];
|
|
out++;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
return 0; // reserved
|
|
}
|
|
if (bfinal) break;
|
|
}
|
|
return out;
|
|
}
|
|
|
|
} // namespace ada::idna::deflate
|
|
/* end file src/raw_inflate.hpp */
|
|
/* begin file src/table_blob.inc */
|
|
// Auto-generated by scripts/pack_tables.py - do not edit.
|
|
// Compressed Unicode/IDNA tables (raw DEFLATE).
|
|
// clang-format off
|
|
#ifndef ADA_IDNA_TABLE_BLOB_H
|
|
#define ADA_IDNA_TABLE_BLOB_H
|
|
#include <cstdint>
|
|
#include <cstddef>
|
|
namespace ada::idna::table_blob {
|
|
constexpr size_t uncompressed_size = 224608;
|
|
constexpr size_t compressed_size = 62377;
|
|
constexpr uint32_t uncompressed_crc32 = 0x6F4A6B2Eu;
|
|
constexpr size_t decomposition_block_rows = 67;
|
|
constexpr size_t decomposition_block_cols = 257;
|
|
constexpr size_t ccc_block_rows = 67;
|
|
constexpr size_t ccc_block_cols = 256;
|
|
constexpr size_t composition_block_rows = 67;
|
|
constexpr size_t composition_block_cols = 257;
|
|
constexpr size_t id_continue_count = 1418;
|
|
constexpr size_t id_start_count = 776;
|
|
constexpr size_t dir_table_count = 1449;
|
|
constexpr size_t combining_range_count = 290;
|
|
// Offsets into the decompressed buffer:
|
|
constexpr size_t off_idna_stage1 = 0;
|
|
constexpr size_t count_idna_stage1 = 3282;
|
|
constexpr size_t off_idna_stage2 = 6564;
|
|
constexpr size_t count_idna_stage2 = 11456;
|
|
constexpr size_t off_idna_bool_blocks = 29480;
|
|
constexpr size_t count_idna_bool_blocks = 225;
|
|
constexpr size_t off_idna_utf8_mappings = 31280;
|
|
constexpr size_t count_idna_utf8_mappings = 17383;
|
|
constexpr size_t off_decomposition_index = 48663;
|
|
constexpr size_t count_decomposition_index = 4352;
|
|
constexpr size_t off_decomposition_block = 53016;
|
|
constexpr size_t count_decomposition_block = 17219;
|
|
constexpr size_t off_decomposition_data = 87456;
|
|
constexpr size_t count_decomposition_data = 9102;
|
|
constexpr size_t off_ccc_index = 123864;
|
|
constexpr size_t count_ccc_index = 4352;
|
|
constexpr size_t off_ccc_block = 128216;
|
|
constexpr size_t count_ccc_block = 17152;
|
|
constexpr size_t off_composition_index = 145368;
|
|
constexpr size_t count_composition_index = 4352;
|
|
constexpr size_t off_composition_block = 149720;
|
|
constexpr size_t count_composition_block = 17219;
|
|
constexpr size_t off_composition_data = 184160;
|
|
constexpr size_t count_composition_data = 1883;
|
|
constexpr size_t off_id_continue_flat = 191692;
|
|
constexpr size_t count_id_continue_flat = 2836;
|
|
constexpr size_t off_id_start_flat = 203036;
|
|
constexpr size_t count_id_start_flat = 1552;
|
|
constexpr size_t off_dir_start = 209244;
|
|
constexpr size_t count_dir_start = 1449;
|
|
constexpr size_t off_dir_final = 215040;
|
|
constexpr size_t count_dir_final = 1449;
|
|
constexpr size_t off_dir_value = 220836;
|
|
constexpr size_t count_dir_value = 1449;
|
|
constexpr size_t off_combining_flat = 222288;
|
|
constexpr size_t count_combining_flat = 580;
|
|
alignas(8) inline constexpr uint8_t compressed[] = {
|
|
0xec,0x9c,0x09,0x40,0x53,0xc7,0xda,0xfe,0x5f,0x08,0x98,0x28,0x4b,0x4c,0xc2,0x12,
|
|
0x14,0x09,0x12,0x42,0x12,0x76,0x12,0x20,0xec,0x09,0xd0,0xdd,0x56,0xdb,0xda,0xdd,
|
|
0x5b,0x5b,0x97,0x6a,0xdd,0xad,0xb6,0xda,0xc5,0x96,0x23,0xbb,0xa2,0xe0,0xbe,0xb0,
|
|
0x8a,0xa8,0xa8,0x88,0x08,0xa8,0xec,0xcb,0x2d,0x2a,0x62,0xad,0x88,0xa8,0xdd,0xeb,
|
|
0x56,0x36,0x6d,0x6b,0x5b,0xdb,0xda,0xd6,0x96,0xfc,0x9f,0x73,0x12,0xd4,0xb6,0xf6,
|
|
0xb6,0xb7,0xcb,0xfd,0xbe,0xfb,0xfd,0x9b,0xe1,0x37,0x33,0xe7,0x9c,0x99,0x79,0xde,
|
|
0x79,0xcf,0x9c,0x73,0x66,0x4e,0x00,0x62,0x88,0x0c,0xc4,0x50,0x33,0x91,0x85,0xc1,
|
|
0x82,0xb1,0x68,0xb6,0x20,0x4b,0x83,0x25,0x63,0x49,0x4c,0xb3,0x25,0xf1,0x0c,0x3c,
|
|
0x86,0xd7,0xcc,0x23,0x2b,0x83,0x15,0x63,0xd5,0x6c,0x45,0xd6,0x16,0x8c,0x25,0x63,
|
|
0xb0,0x26,0x86,0xc7,0x58,0x31,0xd6,0xcc,0x20,0x86,0xcf,0x08,0x98,0xc1,0xcc,0x10,
|
|
0xc6,0x86,0x21,0x86,0xb1,0xb6,0x65,0x9a,0xad,0x69,0x90,0x61,0x90,0x1d,0x63,0xcf,
|
|
0x08,0x19,0x66,0xd0,0x50,0x46,0xc4,0x88,0x19,0x09,0xe3,0xc0,0x38,0x32,0x4e,0x8c,
|
|
0x33,0x23,0x65,0x5c,0x98,0xe6,0x41,0xc3,0x18,0xe2,0x1b,0xf8,0x0c,0xbf,0x99,0x4f,
|
|
0x82,0xe1,0xa8,0x47,0x8c,0x41,0xc0,0x08,0xa0,0x27,0x20,0x6e,0xcb,0x95,0x19,0xc1,
|
|
0xb8,0x31,0x32,0xc6,0x9d,0x19,0xc9,0xd0,0x60,0xd3,0xbe,0x1f,0x07,0x0f,0x46,0xce,
|
|
0x78,0x32,0x0a,0xc6,0x30,0xd8,0x8b,0x61,0x06,0xcb,0x19,0x25,0xa3,0x62,0xd4,0x8c,
|
|
0x37,0xe3,0xc3,0xf8,0x32,0x7e,0x8c,0x3f,0x13,0xc0,0x04,0xa2,0x54,0x10,0xd0,0x30,
|
|
0x5a,0x26,0x98,0x69,0x1e,0x1c,0xc2,0xd0,0x10,0xc3,0x10,0x66,0x08,0x54,0x86,0x90,
|
|
0x8d,0xc1,0x86,0xb1,0x69,0xb6,0x21,0x5b,0x83,0x2d,0x63,0xdb,0x6c,0x4b,0x76,0x06,
|
|
0xbb,0x50,0x86,0xb1,0x6b,0xb6,0x23,0x7b,0xd8,0x62,0x6f,0xd2,0x60,0xcc,0xa9,0x8e,
|
|
0x69,0xb6,0x27,0xa1,0x41,0x78,0x2b,0x3b,0x6e,0x15,0x18,0x61,0x33,0x5b,0x76,0x28,
|
|
0x31,0x61,0xa6,0xbe,0x0d,0x65,0x86,0x36,0x0f,0x25,0x51,0x38,0x63,0x10,0x45,0x30,
|
|
0x91,0xd8,0x13,0xc5,0x30,0xa2,0x66,0x11,0x89,0x0d,0x62,0x46,0xdc,0x2c,0x26,0x49,
|
|
0x34,0x63,0x90,0x30,0x92,0x66,0x09,0x39,0x18,0x1c,0x62,0x18,0xc6,0xa1,0xd9,0x81,
|
|
0x1c,0x0d,0x8e,0x8c,0x63,0xb3,0x23,0x39,0x19,0x9c,0x7e,0xab,0xee,0xdf,0xe1,0xef,
|
|
0xf0,0x77,0xf8,0x6b,0x82,0x9e,0x31,0x5c,0xcf,0xc7,0x32,0x8c,0x53,0xb3,0x53,0x1c,
|
|
0x43,0xce,0x06,0x67,0xc6,0xb9,0xd9,0x39,0x9e,0x41,0x9e,0xb9,0x0d,0xdc,0x0e,0xee,
|
|
0x60,0xee,0x64,0xee,0x42,0x7a,0x37,0x73,0x0f,0x43,0x52,0x83,0x74,0xd4,0xdf,0xde,
|
|
0xfb,0x0b,0xc3,0xbd,0xcc,0x7d,0xcc,0xe8,0xbf,0x03,0x17,0x18,0x69,0xb3,0x94,0x5c,
|
|
0x0c,0x2e,0x8c,0x4b,0xb3,0x0b,0x0d,0x33,0x0c,0x63,0x86,0x35,0x0f,0xa3,0xe1,0x86,
|
|
0xe1,0xcc,0xf0,0xe6,0xe1,0xe4,0x6a,0x70,0x65,0x5c,0x9b,0x5d,0x69,0x84,0x61,0x04,
|
|
0x33,0xa2,0x79,0x04,0xb9,0x19,0xdc,0x18,0xb7,0x66,0x37,0x92,0x19,0x64,0x63,0x98,
|
|
0xfb,0xe1,0xc9,0x07,0x98,0x07,0x11,0x8f,0x65,0x1e,0xe2,0xda,0x7a,0x98,0x79,0x84,
|
|
0x79,0x94,0x79,0x8c,0x79,0x9c,0x79,0x82,0x61,0x64,0x78,0x66,0xca,0xc8,0x7d,0x1c,
|
|
0x63,0x70,0x67,0xdc,0xff,0x71,0xdd,0xf7,0x77,0x32,0x4f,0x32,0xcd,0xee,0xa3,0x99,
|
|
0xf1,0xcc,0x53,0xcc,0xd3,0xcc,0x04,0x66,0x22,0x33,0x89,0x99,0xcc,0x3c,0xc3,0x4c,
|
|
0x61,0xa6,0x32,0xcf,0x32,0xd3,0x98,0xe9,0xcc,0x0c,0x66,0x26,0xda,0x22,0x66,0x16,
|
|
0x43,0x23,0x67,0x33,0x73,0x18,0xc3,0xc8,0xb9,0x5c,0xeb,0xcf,0x31,0xf3,0x98,0xf9,
|
|
0xcc,0x38,0xe6,0x79,0xe6,0x05,0x66,0x01,0x8e,0x2f,0x64,0x5e,0x64,0x5e,0x62,0x5e,
|
|
0x66,0x5e,0x41,0x7e,0x11,0xf3,0x2a,0xf3,0x1a,0x93,0xc0,0x30,0xcc,0x62,0x26,0x91,
|
|
0x49,0x62,0x92,0xb1,0x2f,0x05,0xa4,0x72,0x35,0xd3,0xf0,0xec,0x24,0x26,0x9d,0x59,
|
|
0xc2,0x2c,0x65,0x32,0x98,0x65,0xdc,0xbe,0xe5,0x6c,0xdf,0x47,0x66,0x32,0x59,0xcc,
|
|
0x0a,0x66,0x25,0xb3,0x0a,0xc7,0x57,0x33,0x6b,0x30,0x3f,0x58,0xcb,0xac,0xc3,0x91,
|
|
0xf5,0xcc,0x06,0x66,0x23,0x93,0x8d,0x5c,0x0e,0x93,0xcb,0xe4,0x31,0xf9,0x66,0x6f,
|
|
0x15,0x30,0x9b,0x98,0x42,0x66,0x33,0x53,0xf4,0x2f,0xc7,0xd7,0x24,0xce,0xfe,0x2d,
|
|
0xe6,0xad,0xad,0x7f,0xfa,0x39,0xdb,0xc6,0x14,0xff,0xea,0x18,0xdf,0xce,0xec,0xf8,
|
|
0x1f,0xbc,0xc2,0x1e,0xb8,0xc5,0xbe,0x65,0xff,0x27,0xaf,0x9f,0x25,0xbf,0xb3,0xde,
|
|
0x4f,0xbd,0x23,0x67,0x76,0x32,0x25,0xcc,0x2e,0xe4,0x4a,0x99,0xdd,0xb7,0x54,0x68,
|
|
0x1e,0x49,0x1e,0x65,0x38,0xbe,0x87,0x29,0x67,0x2a,0xfe,0x3f,0xb9,0x53,0x57,0x32,
|
|
0x7b,0x39,0x5f,0x15,0xff,0x7d,0xa7,0xfe,0x51,0xd8,0x77,0xdd,0x43,0xfb,0x99,0xaa,
|
|
0x9b,0xfc,0xb5,0xfc,0x4f,0x53,0x20,0xa6,0x9a,0x31,0x78,0xfc,0xcf,0xf5,0xd0,0xbc,
|
|
0x2a,0xf2,0xb8,0x79,0x34,0xd4,0x30,0xb5,0x4c,0x1d,0x37,0xa7,0xda,0x6a,0xde,0xa3,
|
|
0x62,0xea,0x99,0x66,0x0f,0x92,0x1b,0xe4,0xc4,0x34,0xa0,0x56,0x23,0xf6,0x35,0x99,
|
|
0x9e,0x6b,0xf2,0x66,0x39,0x79,0x1a,0x3c,0x19,0xcf,0x66,0x4f,0x52,0x18,0x14,0x8c,
|
|
0xa2,0x59,0x41,0x5e,0x06,0x2f,0xc6,0xab,0xd9,0x8b,0x94,0x06,0xe5,0xad,0x46,0x5b,
|
|
0xf3,0x6f,0xb0,0xeb,0x9f,0x03,0xcf,0x4d,0x65,0xb3,0xf2,0x75,0xa4,0x2d,0xcc,0x81,
|
|
0xeb,0xc7,0x0e,0x32,0x87,0x7e,0x52,0xba,0xd5,0x9c,0x1e,0x36,0xa7,0x6d,0xe6,0xf4,
|
|
0x88,0x59,0xf1,0x0d,0x86,0x54,0x47,0x7f,0x41,0xe9,0x4d,0xe6,0x18,0xe2,0x76,0xf3,
|
|
0x96,0x41,0xc5,0xa8,0x9a,0x55,0xc7,0xaf,0x1f,0xf5,0x41,0xed,0x0e,0xe6,0x04,0x43,
|
|
0x6a,0x83,0x9a,0x51,0x77,0x32,0xcd,0x6a,0xf2,0xbe,0xd5,0x7d,0xe5,0xc7,0xe1,0xa4,
|
|
0x39,0x3d,0xc5,0x9c,0x66,0xde,0x62,0xde,0x66,0xde,0xb9,0xe9,0xd8,0xbb,0xcc,0x7b,
|
|
0xcc,0xfb,0x5c,0xee,0x03,0xc6,0xe0,0xfd,0xef,0xde,0xbf,0xfe,0x0e,0x7f,0x87,0xbf,
|
|
0xc3,0xdf,0xe1,0xef,0xf0,0xaf,0xc2,0xb3,0xff,0x6b,0x2c,0xf9,0xf0,0xbf,0xd0,0x7b,
|
|
0x75,0xff,0xdf,0x8c,0x93,0x33,0xb7,0xd8,0x17,0xf5,0xe7,0xae,0xfb,0xbd,0x9b,0xbd,
|
|
0xc9,0xc7,0xe0,0xc3,0xf8,0x34,0xfb,0x90,0xaf,0xc1,0x97,0xf1,0xfd,0x63,0xeb,0x97,
|
|
0xff,0x3d,0xe1,0xec,0xdf,0xf7,0x19,0x2e,0x2c,0x61,0x8c,0x46,0x0b,0xe2,0x91,0x35,
|
|
0xf1,0x69,0x30,0xd9,0x90,0x1d,0x09,0x49,0x44,0x12,0x72,0x24,0x67,0x72,0xa1,0xe1,
|
|
0x34,0x82,0x64,0x34,0x92,0xe4,0xa4,0x20,0x25,0xa9,0xc9,0x87,0xfc,0x28,0x80,0x82,
|
|
0x48,0x4b,0xc6,0x3f,0xed,0xd3,0xff,0x07,0x43,0xc8,0x4f,0x6c,0xd1,0x11,0xdb,0x23,
|
|
0x36,0x47,0x88,0x23,0xb9,0x9c,0x9e,0x62,0x29,0x9e,0xee,0xe4,0xf2,0xf7,0xd0,0x68,
|
|
0xf4,0xca,0x68,0xbc,0x9f,0x1e,0xa1,0x7f,0x20,0x9d,0x48,0xcf,0xd0,0xb3,0x34,0x83,
|
|
0x66,0xd3,0x73,0xf4,0x3c,0x2d,0xa4,0x97,0xe9,0x55,0x38,0x26,0x89,0x52,0x69,0x09,
|
|
0x2d,0xa3,0x2c,0x5a,0x45,0x6b,0x69,0x03,0xe5,0x50,0x3e,0x15,0xd2,0x16,0x94,0x2f,
|
|
0xa6,0x9d,0x54,0x4a,0x7b,0xa8,0x92,0xf6,0x53,0xcd,0x9f,0xe0,0x87,0x7a,0xb4,0xd1,
|
|
0x04,0x5e,0x07,0x07,0xc1,0x61,0xf0,0x06,0x38,0x06,0x3a,0xc0,0x49,0xf0,0x16,0x78,
|
|
0x17,0x7c,0x00,0xce,0x82,0x0b,0xa0,0x1b,0xf4,0x81,0x8f,0xc1,0x65,0xf0,0x05,0xf8,
|
|
0x0a,0x7c,0x03,0xae,0x81,0x7e,0xd6,0x0f,0x16,0x46,0xa3,0x15,0x10,0x58,0x08,0x2c,
|
|
0x6c,0x90,0xda,0x5b,0xb0,0x8a,0x22,0xc4,0x0e,0xc0,0x19,0x0c,0xb3,0x18,0x66,0xe1,
|
|
0x86,0x74,0x24,0xf0,0x04,0x4a,0xe0,0x6d,0xe1,0x8f,0x38,0x08,0x04,0x03,0x1d,0x88,
|
|
0x00,0xd1,0xc0,0x00,0xe2,0xc1,0x1d,0xe0,0x6e,0x70,0x2f,0x18,0x03,0x1e,0x04,0x0f,
|
|
0x83,0xc7,0xc0,0x38,0x30,0x1e,0x4c,0x00,0x93,0xc1,0x54,0x30,0x1d,0xcc,0x02,0x73,
|
|
0xc1,0x7c,0x8b,0x05,0x88,0x5f,0x02,0x8b,0x80,0x02,0x56,0x26,0x58,0x24,0x22,0x97,
|
|
0x02,0xd2,0x2d,0x32,0x10,0x67,0x5a,0xac,0xb4,0x58,0xc3,0x59,0xba,0xde,0x22,0xdb,
|
|
0x22,0xcf,0x62,0x13,0xf2,0x45,0x16,0xdb,0x10,0xef,0xb0,0xd8,0x65,0x51,0x66,0x61,
|
|
0xf2,0x5b,0x85,0xc5,0x3e,0xe4,0xaa,0x2d,0xea,0x10,0x37,0x82,0x7f,0x82,0x03,0x16,
|
|
0xad,0x88,0x8f,0x70,0x25,0xde,0x44,0x7c,0xdc,0xa2,0x13,0xf1,0x69,0x8b,0x77,0x2c,
|
|
0xde,0x47,0x7a,0x06,0x9c,0xb7,0xe8,0x32,0xd7,0xef,0xb5,0xf8,0xf1,0x79,0xb8,0x64,
|
|
0xc1,0x86,0xcb,0x5c,0xf8,0x82,0x0b,0x5f,0xa1,0xc4,0x37,0xe0,0x1a,0xe8,0x07,0x16,
|
|
0x96,0xf0,0x26,0xe0,0x83,0x21,0x96,0x6c,0x1d,0x3b,0xc4,0x43,0x81,0x04,0x38,0x01,
|
|
0x17,0xe0,0x0a,0x64,0xc0,0x03,0x28,0xb8,0x52,0x2a,0x4b,0x36,0xf8,0x20,0xef,0x6f,
|
|
0x19,0x64,0x19,0x8c,0x54,0x07,0x22,0x40,0x34,0x30,0x80,0x78,0x70,0x07,0xb8,0x1b,
|
|
0xdc,0x0b,0xc6,0x80,0x07,0xc1,0xc3,0xe0,0x31,0x30,0x0e,0x8c,0x07,0x13,0xc0,0x64,
|
|
0x30,0x15,0x4c,0x07,0xb3,0xc0,0x5c,0x30,0x1f,0x2c,0x00,0x2f,0x81,0x45,0x20,0x01,
|
|
0x24,0x82,0x14,0x90,0x0e,0x32,0x2c,0x7f,0xdc,0xd7,0x4c,0xcb,0x55,0xd8,0xb3,0xd6,
|
|
0x72,0x03,0xb7,0x3f,0x17,0x71,0x81,0xe5,0x66,0xcb,0xad,0x96,0xdb,0x91,0x2b,0x01,
|
|
0xbb,0x41,0x39,0xd8,0x6b,0x69,0xfc,0xaf,0xff,0x08,0xa9,0xca,0x52,0x82,0x3b,0x58,
|
|
0xad,0x65,0x83,0x65,0xb3,0xa5,0x1f,0xee,0x5e,0x7f,0xac,0xbd,0x16,0xcb,0x56,0xcb,
|
|
0x37,0x2c,0xdb,0x2d,0x3b,0x2d,0xdf,0xe2,0xbc,0xb3,0xcd,0xc2,0x19,0x77,0xc7,0x00,
|
|
0x7a,0xef,0x77,0xfa,0xea,0x43,0xcb,0x73,0xa8,0xf9,0x91,0x65,0x8f,0xe5,0xc7,0xb7,
|
|
0x68,0x81,0xfe,0xf0,0x1d,0xe6,0x32,0x5a,0xfd,0x02,0x7c,0x05,0xbe,0xb1,0x34,0xdd,
|
|
0x6f,0xaf,0x0d,0x28,0x59,0x5a,0xf0,0x06,0xee,0xa3,0xf1,0x64,0xc5,0x1b,0xc2,0xb3,
|
|
0xe3,0x0d,0xe5,0x49,0x78,0x4e,0xd8,0xeb,0x02,0x5c,0x79,0x32,0x1e,0x46,0x32,0x4f,
|
|
0xc1,0x53,0xf1,0x7c,0x78,0xfe,0xbc,0x20,0x5e,0x30,0x4f,0xc7,0xfb,0xd8,0x32,0x82,
|
|
0x17,0xcd,0xbb,0x93,0x0c,0xbc,0x78,0xde,0x1d,0xbc,0xbb,0x79,0xf7,0xa2,0xe4,0x18,
|
|
0xde,0x83,0xbc,0x87,0x79,0x8f,0xf1,0xc6,0xf1,0xc6,0xf3,0x26,0xf0,0x26,0xf3,0xa6,
|
|
0xf2,0xfe,0x9c,0xb3,0x37,0x1d,0xda,0x3a,0xb4,0xec,0x8a,0x16,0x1f,0x83,0x16,0xc6,
|
|
0x3c,0x98,0x0b,0xe6,0x83,0x05,0xe0,0x25,0xb0,0x08,0x24,0x80,0x44,0x90,0x02,0xd2,
|
|
0x41,0x06,0xc8,0x04,0x11,0xb0,0x6f,0x0c,0x52,0x1d,0xec,0x37,0x1a,0x57,0x82,0x31,
|
|
0xbc,0x35,0x9c,0x75,0xeb,0x79,0xd9,0xbc,0x3c,0xde,0x26,0x5e,0x11,0x6f,0x1b,0x6f,
|
|
0x07,0x6f,0x17,0xaf,0x8c,0x57,0xc1,0xdb,0xc7,0xab,0xe6,0xd5,0xf1,0x1a,0x79,0xff,
|
|
0xe4,0x1d,0xe0,0xb5,0xf2,0x8e,0xf0,0xde,0xe4,0x1d,0xe7,0x75,0xf2,0x4e,0xf3,0xde,
|
|
0xe1,0xbd,0xcf,0x3b,0xc3,0x3b,0xcf,0xeb,0xe2,0xf5,0xf2,0x2e,0xf1,0x3e,0xe5,0x7d,
|
|
0xce,0xfb,0x92,0x77,0x95,0xf7,0x1d,0xef,0x07,0x1e,0xdc,0x66,0x35,0xc8,0x6a,0xb0,
|
|
0x95,0xad,0x95,0xd0,0x4a,0x6c,0xe5,0x68,0x25,0xb5,0x1a,0x6e,0xe5,0x66,0x35,0xd2,
|
|
0xca,0xd3,0x4a,0x69,0xe5,0x6d,0xe5,0x67,0xf5,0x57,0x8f,0xef,0x40,0x28,0x68,0x41,
|
|
0x28,0x08,0x07,0x51,0x40,0x0f,0xe2,0xc0,0xed,0xe0,0x2e,0x30,0x0a,0x8c,0x06,0x0f,
|
|
0x80,0x87,0xc0,0xa3,0xe0,0x09,0xf0,0x24,0x78,0xfa,0x16,0x16,0x4e,0xc2,0xbe,0x29,
|
|
0x60,0x1a,0x98,0x09,0xe6,0x80,0x79,0xe0,0x05,0xf0,0x22,0x78,0x05,0xbc,0x06,0x16,
|
|
0x83,0x64,0x90,0x06,0x96,0x82,0xe5,0x60,0x05,0x58,0x0d,0xd6,0x81,0x8d,0x20,0x17,
|
|
0x14,0x80,0xcd,0x60,0x2b,0xd8,0x0e,0x4a,0xc0,0x6e,0x50,0x0e,0xf6,0x5a,0x55,0x21,
|
|
0xae,0x05,0x0d,0xa0,0x19,0xb4,0x80,0x43,0xa0,0x8d,0xb3,0xec,0x28,0xe2,0x76,0x70,
|
|
0x02,0x9c,0x02,0x6f,0x83,0xf7,0xc0,0x87,0xe0,0x1c,0xf8,0x08,0xf4,0x80,0x8b,0xe0,
|
|
0x13,0xf0,0x19,0xb8,0x02,0xbe,0x06,0xdf,0x82,0xef,0xd9,0x56,0x80,0xa5,0xb5,0xd1,
|
|
0x68,0x0d,0x04,0xc0,0x06,0xd8,0x03,0x11,0x70,0x00,0xce,0x60,0x18,0x18,0x01,0xdc,
|
|
0x81,0x1c,0x78,0x01,0x35,0xf0,0x05,0x01,0x40,0x03,0x42,0x40,0x18,0x88,0x04,0x31,
|
|
0x20,0x16,0xdc,0x06,0xee,0x04,0xf7,0x80,0xfb,0xc0,0xfd,0x60,0x2c,0x78,0x04,0x3c,
|
|
0x6e,0xcd,0x5e,0x6f,0xff,0xb0,0x7e,0xca,0x7a,0xa2,0xf5,0x33,0xd6,0xcf,0x5a,0xcf,
|
|
0xb0,0x9e,0x6d,0xfd,0x9c,0xf5,0xf3,0xd6,0x0b,0xad,0x5f,0xb6,0x7e,0xd5,0x9a,0xb1,
|
|
0x4e,0xb2,0x4e,0xb5,0x5e,0x62,0xbd,0xcc,0x3a,0xcb,0x7a,0x95,0xf5,0x5a,0xeb,0x0d,
|
|
0xd6,0x39,0xd6,0xf9,0xd6,0x85,0xd6,0x5b,0xac,0x8b,0xad,0x77,0x5a,0x97,0x5a,0xef,
|
|
0xb1,0xae,0xb4,0xde,0x6f,0x5d,0x63,0x5d,0x6f,0xdd,0x64,0xfd,0xba,0xf5,0x41,0xeb,
|
|
0xc3,0xd6,0x6f,0x58,0xb3,0x57,0xea,0x5f,0xf9,0x39,0x66,0x7d,0x63,0x56,0x36,0x90,
|
|
0xfb,0xbf,0xf2,0xe9,0xb4,0x7e,0xdb,0xfa,0x03,0xeb,0xf3,0xd6,0x7f,0xac,0x95,0x1e,
|
|
0xeb,0x4f,0xad,0xbf,0xb2,0xfe,0xde,0x9a,0x37,0x68,0xc8,0x20,0xd1,0x20,0xe9,0xa0,
|
|
0x3f,0x77,0x26,0xfc,0x63,0xdf,0xff,0x7c,0x76,0x7c,0x63,0x8f,0x6c,0x90,0xd7,0xa0,
|
|
0x7e,0xa3,0xdf,0xa0,0x9f,0xd6,0xfe,0x7d,0x9a,0x3f,0x3d,0xcf,0x37,0xf4,0xfe,0xfd,
|
|
0x96,0xfb,0x6f,0xb1,0x1d,0x3c,0x88,0x8d,0x23,0x07,0xdd,0xdc,0x62,0xff,0xaf,0xea,
|
|
0xfd,0xb4,0xcf,0xa6,0x10,0x37,0xe8,0xee,0x41,0xf7,0x0f,0x62,0xf7,0x3e,0x3a,0xe8,
|
|
0xa7,0xde,0xf9,0xf7,0x57,0x1b,0xff,0xca,0xff,0xb7,0x2a,0x39,0xb0,0x35,0x7e,0xd0,
|
|
0x33,0x83,0xfa,0x6f,0xe9,0xc9,0xdf,0x6f,0xc1,0x5f,0xf7,0x99,0x39,0xc8,0xf8,0x0b,
|
|
0xe7,0xb7,0xff,0xfa,0x39,0xea,0xff,0x17,0xe7,0xf0,0xb7,0x9d,0xf5,0x5f,0xae,0x35,
|
|
0x7f,0xd0,0xbf,0x1e,0x7d,0xbf,0xd4,0x42,0xff,0x2f,0xfa,0xf0,0xe5,0x41,0x8b,0x07,
|
|
0xfd,0x19,0xeb,0xc7,0x5f,0xfa,0xa4,0x0f,0xfa,0x4f,0xde,0x9b,0x96,0x0d,0xfa,0x79,
|
|
0x8f,0x57,0x5f,0xdf,0x97,0x7d,0x3d,0x57,0x78,0x3d,0xb7,0xfd,0x17,0xed,0x2b,0x1b,
|
|
0xf4,0xf3,0x6b,0x6a,0x3f,0xf6,0x35,0x0c,0x3a,0x30,0xe8,0x8d,0x41,0xa7,0x06,0xbd,
|
|
0xff,0x93,0x9a,0xdd,0xbf,0xa1,0xa7,0x9f,0xdc,0xc2,0xbe,0x2f,0xaf,0xef,0xbb,0x76,
|
|
0x3d,0x67,0xc9,0x1f,0xc8,0x0d,0xe6,0xff,0x52,0x5b,0x43,0xf9,0x7f,0xe6,0x93,0xc5,
|
|
0x99,0x3f,0x9c,0x2f,0xe3,0xcb,0xf9,0x4a,0xbe,0x0f,0x3f,0x80,0xaf,0xe5,0xeb,0xf8,
|
|
0x91,0x7c,0x3d,0x3f,0x9e,0x7f,0x27,0x7f,0x14,0x7f,0x0c,0x7f,0x2c,0xff,0x51,0xfe,
|
|
0x38,0xfe,0x53,0xfc,0x49,0xfc,0xa9,0xfc,0x19,0xfc,0x39,0xfc,0xf9,0xfc,0x85,0xfc,
|
|
0x57,0xf8,0x09,0xfc,0x24,0x7e,0x1a,0x3f,0x83,0x9f,0xc5,0x5f,0xcd,0x5f,0xcf,0xcf,
|
|
0xe1,0x17,0xf0,0x8b,0xf8,0xc5,0xfc,0x12,0x7e,0xbf,0xb1,0x8c,0x7f,0x63,0x64,0x54,
|
|
0xf2,0xff,0xca,0xab,0xb3,0x8a,0xff,0x67,0xb4,0x42,0x44,0x64,0xfc,0xaf,0xf9,0xb0,
|
|
0xfe,0xac,0xe3,0x37,0xf1,0x5b,0xf8,0xad,0xfc,0x37,0xf8,0xed,0xfc,0xfe,0xff,0xe0,
|
|
0xec,0xe2,0xdf,0xf3,0x14,0x5d,0xff,0xfc,0xda,0x3d,0xfc,0x8f,0x7e,0x4e,0x63,0x65,
|
|
0xf1,0x1d,0x8f,0x5d,0x43,0x0c,0xc2,0xba,0x41,0x6b,0xd5,0xc9,0x7f,0x8b,0x7f,0xb3,
|
|
0xc2,0x7b,0xfc,0x33,0xfc,0x0b,0xfc,0x1e,0xfe,0x25,0xfe,0x65,0xfe,0x15,0xfe,0x55,
|
|
0xfe,0x35,0xbe,0x91,0xcf,0x13,0xf0,0x05,0x55,0x7c,0x1b,0x81,0x50,0x20,0x11,0x38,
|
|
0x0b,0x86,0x0b,0x64,0x02,0xb9,0x40,0x29,0xf0,0x11,0x04,0x08,0xb4,0x02,0x9d,0x20,
|
|
0x52,0xa0,0x17,0xc4,0x0b,0xee,0x14,0x8c,0x12,0x8c,0x11,0x8c,0x15,0x3c,0x2a,0x18,
|
|
0x27,0x78,0x4a,0x30,0x49,0x30,0x55,0x30,0x43,0x30,0x47,0x30,0x5f,0xb0,0x50,0xf0,
|
|
0x8a,0x20,0x41,0xc0,0xb6,0x9c,0x24,0x48,0x13,0x64,0x08,0xfe,0x2a,0x7f,0x5b,0xd0,
|
|
0xf3,0xc4,0x83,0xf7,0xd8,0xf7,0x8a,0xeb,0x2d,0x7e,0xfa,0x5e,0x11,0x73,0x6d,0x9a,
|
|
0x6f,0x29,0xc3,0xba,0x9c,0x7d,0xaf,0xe8,0x47,0x16,0x94,0x25,0x58,0x25,0x58,0x2b,
|
|
0xe0,0x71,0xef,0x21,0xd9,0xb7,0x3e,0x1b,0x05,0x76,0x28,0xe5,0x88,0xd2,0xfe,0x16,
|
|
0x23,0x28,0xdd,0x22,0x57,0xb0,0x49,0x20,0xe3,0x4a,0x6f,0x11,0x54,0x58,0xf8,0xd0,
|
|
0x76,0x81,0x69,0x55,0xca,0xae,0x39,0x45,0x68,0x87,0x7d,0x3b,0xc9,0xee,0xb9,0x97,
|
|
0xdb,0xf3,0xcb,0x76,0x5d,0xfd,0x53,0x56,0xa6,0xbb,0x04,0xd6,0x54,0x26,0x58,0x45,
|
|
0x1b,0x05,0x36,0x54,0x21,0xd8,0x27,0xa8,0x16,0xec,0xb2,0xd8,0x61,0x51,0x27,0x68,
|
|
0x14,0xbc,0x2e,0x38,0x28,0x38,0x2c,0x38,0x2a,0x68,0x17,0x9c,0x10,0xec,0xb3,0x38,
|
|
0x25,0x78,0x5b,0x50,0x6d,0xf1,0x9e,0xe0,0x43,0xc1,0x11,0x8b,0x73,0x82,0xcd,0x96,
|
|
0xa7,0x2d,0x3e,0x12,0xbc,0x63,0xb1,0xd5,0x52,0x4b,0xbd,0x82,0x4b,0x82,0xf3,0x16,
|
|
0x3a,0xde,0xa7,0x38,0x03,0x5f,0x80,0xaf,0xc1,0x77,0xa0,0x1f,0x58,0x0e,0x36,0x1a,
|
|
0x07,0x81,0x21,0xc0,0x1e,0x88,0x81,0x13,0x18,0x06,0xdc,0x80,0x07,0xf0,0x02,0xde,
|
|
0xc0,0x1f,0x68,0x40,0x28,0x88,0x00,0x31,0x20,0x0e,0xdc,0x01,0xee,0x01,0xa3,0xc1,
|
|
0x83,0xe0,0x11,0xf0,0x04,0x18,0x0f,0x26,0x82,0x29,0x60,0x3a,0x98,0x0d,0xe6,0x81,
|
|
0x05,0xe0,0x65,0xf0,0x1a,0x48,0x04,0xa9,0x60,0x29,0xc8,0x04,0xab,0xc0,0x3a,0x90,
|
|
0x0d,0xf2,0xc1,0x66,0xb0,0x0d,0xec,0x04,0xbb,0x41,0x05,0xd8,0x0f,0x6a,0x41,0x23,
|
|
0x78,0x1d,0x1c,0x02,0x47,0xc0,0x31,0x70,0x02,0x9c,0x06,0xef,0x82,0x0f,0xc1,0x79,
|
|
0xd0,0x0d,0x2e,0x82,0x4f,0xc1,0x17,0xe0,0x6b,0xf0,0x1d,0xe8,0x07,0x96,0x43,0xd0,
|
|
0x7f,0x30,0x04,0xd8,0x03,0x31,0x70,0x1a,0x72,0xc3,0xfb,0xc3,0x86,0xb0,0xaa,0xf0,
|
|
0x05,0xf6,0x8d,0x04,0x0a,0xa0,0x06,0x7e,0x20,0x08,0x84,0x80,0x70,0x10,0x0d,0x62,
|
|
0xc1,0xed,0xe0,0x6e,0x70,0x1f,0x78,0x00,0x3c,0x0c,0x1e,0x07,0x4f,0x82,0x09,0xe0,
|
|
0x19,0x30,0x0d,0xcc,0x02,0xcf,0x81,0x17,0xc0,0x4b,0xe0,0x55,0xb0,0x18,0xa4,0x80,
|
|
0x25,0x60,0x39,0x58,0x09,0xd6,0x82,0x8d,0x20,0x0f,0x14,0x82,0xad,0x60,0x07,0x28,
|
|
0x05,0xe5,0x60,0x1f,0xa8,0x01,0x0d,0xe0,0x9f,0xe0,0x20,0x68,0x03,0x6f,0x82,0x0e,
|
|
0x70,0x0a,0xbc,0x03,0x3e,0x18,0xf2,0xf3,0x91,0x75,0x6e,0x48,0xd7,0x90,0xbe,0x21,
|
|
0x9f,0x0c,0xf9,0x7c,0xc8,0x57,0x43,0xbe,0x1d,0xf2,0xc3,0x90,0x9f,0xde,0x77,0x2c,
|
|
0x6c,0xac,0x6d,0x06,0xdb,0xd8,0xd9,0x88,0x6c,0x1c,0x6d,0x6e,0x75,0xff,0x71,0xb1,
|
|
0x19,0x61,0x33,0xd2,0x46,0x61,0xa3,0xb6,0xf1,0xb3,0x09,0xb2,0x09,0xb1,0xf9,0xe9,
|
|
0xf1,0x70,0x9b,0x68,0x9b,0x58,0x9b,0xdb,0x6d,0xee,0xb6,0xb9,0xcf,0xe6,0x01,0x9b,
|
|
0x87,0x6d,0x7e,0xda,0xfe,0xe3,0x36,0x4f,0xda,0x4c,0xb0,0x79,0xc6,0x66,0x9a,0xcd,
|
|
0xac,0x5b,0xb6,0xdf,0x6f,0x7c,0x0e,0xfb,0x5f,0x00,0x2f,0x81,0x57,0x7f,0xd6,0xfe,
|
|
0x62,0x9b,0x14,0x9b,0x25,0x36,0xcb,0x6d,0x56,0xda,0xac,0xb5,0xd9,0x68,0x93,0x87,
|
|
0xe3,0x43,0x70,0xc5,0x0d,0x05,0x12,0xe0,0x04,0x5c,0x80,0x2b,0x90,0x71,0xef,0x9e,
|
|
0x0a,0x6d,0x8a,0x6d,0x4a,0x6d,0x2a,0x6d,0x6a,0x6c,0x9a,0x6c,0x0e,0xda,0xbc,0x61,
|
|
0xf3,0xd3,0xed,0x0e,0x9b,0xb7,0x6c,0x3e,0xb0,0xb9,0x60,0xd3,0x67,0x73,0xd9,0xe6,
|
|
0x2b,0x9b,0x6b,0x3f,0xdb,0xb6,0xb0,0xe5,0xdb,0xda,0xd9,0x4a,0x6c,0x5d,0x6c,0x65,
|
|
0xb6,0x0a,0x5b,0x1f,0xdb,0x9f,0x6e,0xb3,0x36,0x05,0xd9,0xea,0x6c,0xa3,0x6c,0xd9,
|
|
0xbe,0xc4,0xda,0xde,0x69,0x3b,0xca,0x76,0x8c,0xed,0x10,0x9e,0xce,0x76,0xac,0xed,
|
|
0xc7,0x96,0x63,0x6d,0x1f,0xb5,0x1d,0x67,0x3b,0xc1,0x76,0xaa,0xed,0x4c,0xee,0xf8,
|
|
0x73,0xb6,0x0b,0x6d,0x87,0xf2,0x5e,0xb1,0x95,0xf0,0xa6,0xda,0x26,0xd8,0xa6,0xd8,
|
|
0x66,0xd8,0x9a,0x7a,0xb5,0xd2,0x76,0xc0,0x17,0x6b,0x6c,0x37,0xd8,0xe6,0xda,0xb2,
|
|
0x6f,0xc8,0x36,0xd9,0x6e,0xb3,0xdd,0x65,0x3e,0x5e,0x61,0x3b,0xd0,0xff,0x7d,0xb6,
|
|
0x35,0xb6,0x0d,0xb6,0xae,0xbc,0x7f,0xda,0x1e,0xb4,0xb5,0xe2,0xbd,0xc1,0xd5,0x7b,
|
|
0xd3,0xb6,0xd3,0xf6,0x6d,0xae,0xfd,0x0f,0x6c,0x2f,0xd8,0xba,0xf0,0x7a,0x6c,0x65,
|
|
0xbc,0x4e,0xdb,0x78,0xba,0x64,0xcb,0x7e,0x7f,0x71,0xab,0x60,0x7a,0xee,0x98,0x34,
|
|
0x2f,0xdb,0xde,0xf0,0xee,0x15,0xdb,0x7f,0xbd,0xae,0x30,0xfe,0xc2,0xb7,0x23,0x57,
|
|
0x6d,0xfb,0x51,0x53,0x60,0x27,0xb4,0xbb,0x3e,0x4e,0x90,0x73,0xb5,0xfb,0x69,0x2b,
|
|
0xee,0x76,0x72,0x3b,0x2f,0xbb,0x5f,0xbe,0xef,0xa9,0x7f,0x72,0x2c,0xe4,0xc6,0x83,
|
|
0x92,0x6e,0xa8,0xde,0xb4,0x93,0x42,0xed,0x44,0xdc,0x91,0x30,0xbb,0x08,0xbb,0x28,
|
|
0xbb,0x18,0x3b,0x83,0x5d,0x9c,0xdd,0x6d,0x76,0x77,0xd8,0xdd,0x63,0x77,0xaf,0xdd,
|
|
0x68,0xbb,0xe1,0x38,0x3e,0x9a,0xd8,0xef,0x67,0x6e,0x7d,0x1c,0xe3,0x1d,0xcf,0x83,
|
|
0x11,0x14,0x80,0x67,0x82,0xf0,0xfa,0xd3,0x43,0xc6,0x7d,0x1f,0x75,0xeb,0xe7,0xef,
|
|
0xfd,0x76,0xff,0xde,0x9d,0x7c,0xac,0xdd,0xa3,0x76,0xd6,0x34,0x0e,0xb5,0x9e,0xb2,
|
|
0x9b,0x64,0x97,0xc7,0x7e,0x63,0x61,0xc7,0x3e,0xad,0x4c,0xe1,0x2b,0x3c,0xb5,0x44,
|
|
0x50,0x75,0x86,0x1f,0x87,0xd3,0x0c,0xae,0x6d,0xd3,0x37,0x62,0x6c,0x60,0xb7,0x66,
|
|
0xdb,0x3d,0x67,0xf7,0x02,0xf6,0xb3,0xdf,0x89,0x4d,0xe0,0x99,0x52,0x47,0x7a,0x8e,
|
|
0xfb,0x4e,0x0d,0xb3,0x60,0xee,0x5b,0xb5,0x17,0xed,0x5c,0xd0,0x87,0x45,0x76,0x09,
|
|
0x76,0x89,0x76,0x29,0xf0,0x07,0x56,0x17,0x76,0x77,0xe3,0x59,0xa5,0xe2,0xdd,0xcd,
|
|
0x5b,0x76,0xdd,0x5e,0x3e,0xf7,0xec,0x63,0x9f,0x92,0x37,0xdb,0xb7,0xc2,0x6e,0x9d,
|
|
0x5d,0xae,0x5d,0x91,0xdd,0x0e,0xbb,0x32,0xbb,0x7d,0x76,0x75,0x76,0xff,0xb4,0x6b,
|
|
0xb5,0x7b,0xd3,0xae,0xd3,0xee,0x1d,0xbb,0x33,0x76,0x5d,0x76,0x97,0xd0,0xda,0x67,
|
|
0x76,0x57,0xec,0xae,0xda,0xf9,0xd0,0x77,0x76,0x3f,0xd8,0x59,0xd8,0x0f,0xb2,0x0f,
|
|
0xa0,0xc1,0xf6,0xb6,0xf6,0xce,0xdc,0x77,0x7a,0x2e,0xf4,0x6b,0xc7,0xcd,0x73,0x72,
|
|
0xfb,0x1b,0x8a,0x0e,0xf6,0x3f,0x5d,0x3d,0xfc,0x37,0x7e,0x86,0xd9,0x8f,0x44,0x3f,
|
|
0x7c,0xec,0x35,0xf6,0xff,0x69,0xe5,0x28,0x7b,0xc3,0x1f,0xd6,0xfc,0xed,0xeb,0xd7,
|
|
0x5b,0x5c,0x3d,0xf6,0x77,0xda,0xdf,0x63,0x7f,0x9f,0xfd,0xfd,0xf6,0x63,0xed,0x1f,
|
|
0xb1,0x7f,0xdc,0xfe,0x1f,0xf6,0x4f,0xd9,0x4f,0xb4,0x7f,0xc6,0x7e,0x9a,0xfd,0x2c,
|
|
0xfb,0xe7,0xec,0x5f,0xb0,0x7f,0xc9,0xfe,0x55,0xfb,0xc5,0xf6,0x29,0xf6,0x4b,0xec,
|
|
0x33,0xed,0x57,0xdb,0x6f,0xb0,0xcf,0xb3,0xdf,0x6c,0x5f,0x6c,0xbf,0xcb,0xbe,0xdc,
|
|
0x7e,0xbf,0x7d,0x9d,0xfd,0x6f,0xd5,0x6d,0xb6,0x3f,0x60,0x7f,0xd8,0xfe,0xa8,0xfd,
|
|
0x71,0xfb,0x93,0xf6,0x6f,0xdb,0xbf,0x6f,0x7f,0xd6,0xfe,0x23,0xfb,0x5e,0xfb,0x8f,
|
|
0xed,0x3f,0xb3,0xff,0xd2,0xfe,0x1b,0xfb,0xef,0xed,0x49,0x68,0x25,0x14,0x08,0x6d,
|
|
0x85,0x43,0x85,0x0e,0x42,0xa9,0xd0,0x55,0xe8,0x2e,0xf4,0x14,0xfe,0x9e,0x6f,0x9a,
|
|
0x7f,0x4f,0x9d,0x50,0xbb,0x3f,0x7e,0x16,0x55,0x42,0xe3,0xff,0xa9,0x4f,0x88,0x30,
|
|
0x5c,0x18,0xf5,0x27,0xf6,0xc9,0xf0,0x27,0xb5,0x75,0x87,0xf0,0x1e,0xe1,0x68,0xe1,
|
|
0x83,0xc2,0x47,0x84,0x4f,0x08,0xc7,0x0b,0x27,0x0a,0xa7,0x08,0xa7,0x0b,0x67,0x0b,
|
|
0xe7,0x09,0x17,0x08,0x5f,0x16,0xbe,0x26,0x4c,0x14,0xa6,0x0a,0x97,0x0a,0x33,0x85,
|
|
0xab,0x84,0xeb,0x84,0xd9,0xc2,0x7c,0xe1,0x66,0xe1,0x36,0xe1,0x4e,0xe1,0x6e,0x61,
|
|
0x85,0x70,0xbf,0xb0,0x56,0xd8,0x28,0x7c,0x5d,0x78,0x48,0x78,0x44,0x78,0x4c,0x78,
|
|
0x42,0x78,0x5a,0xf8,0xae,0xf0,0x43,0xe1,0x79,0x61,0xb7,0xf0,0xa2,0xf0,0x53,0xe1,
|
|
0x17,0xc2,0xaf,0x85,0xdf,0x09,0xfb,0x85,0x96,0x43,0xff,0x6a,0xbf,0x0e,0x82,0xc2,
|
|
0x90,0xa1,0x76,0x43,0x45,0x9c,0x92,0x03,0x62,0x29,0x70,0x05,0xab,0xb0,0x06,0xc8,
|
|
0x12,0xec,0xc2,0x7c,0xde,0x9d,0x3b,0xe6,0xf9,0x23,0x5b,0x24,0x18,0xaf,0xaa,0xa1,
|
|
0x3e,0x43,0xfd,0xb1,0x57,0x03,0x42,0x41,0x04,0x88,0x01,0x71,0xe0,0x0e,0x70,0x0f,
|
|
0x18,0x0d,0x1e,0x04,0x8f,0x80,0x27,0xc0,0x78,0x30,0x11,0x4c,0x01,0xd3,0xc1,0x6c,
|
|
0x30,0x0f,0x2c,0x00,0x2f,0x83,0xd7,0x40,0x22,0x48,0x05,0x4b,0x41,0x26,0x6b,0x09,
|
|
0x58,0x07,0xb2,0x41,0x3e,0xd8,0x0c,0xb6,0x81,0x9d,0x60,0x37,0xa8,0x00,0xfb,0x41,
|
|
0x2d,0x68,0x04,0xaf,0x83,0x43,0xe0,0x08,0x38,0x06,0x4e,0x80,0xd3,0xe0,0x5d,0xf0,
|
|
0x21,0x38,0x0f,0xba,0xc1,0x45,0xf0,0x29,0xf8,0xe2,0x67,0x5e,0xfe,0x1a,0x7b,0xbe,
|
|
0xbb,0xbe,0xb7,0x7f,0xa8,0xf1,0x3f,0xf6,0xbe,0xf3,0xc7,0x77,0x29,0x4b,0x91,0xf1,
|
|
0x77,0xbd,0xfd,0xfb,0xad,0x6f,0xb8,0x07,0x89,0xfe,0x3b,0xae,0xfe,0x21,0xa2,0x5f,
|
|
0xf2,0x80,0xbd,0x48,0x2c,0x72,0x12,0x0d,0x13,0xb9,0x89,0x3c,0x44,0x5e,0x22,0x6f,
|
|
0x91,0xbf,0x48,0x23,0x0a,0x15,0x45,0x88,0x62,0x44,0x71,0xa2,0x3b,0x44,0xf7,0x88,
|
|
0x46,0x8b,0x1e,0x14,0x3d,0x22,0x7a,0x42,0x34,0x5e,0x34,0x51,0x34,0x45,0x34,0x5d,
|
|
0x34,0x5b,0x34,0x4f,0xb4,0x40,0xf4,0xb2,0xe8,0x35,0x51,0xa2,0x28,0x55,0xb4,0x54,
|
|
0x94,0x29,0x5a,0x25,0x5a,0x27,0xca,0x16,0xe5,0x8b,0x36,0x8b,0xb6,0x89,0x76,0x8a,
|
|
0x76,0x8b,0x2a,0x44,0xfb,0x45,0xb5,0xa2,0x46,0xd1,0xeb,0xa2,0x43,0xa2,0x23,0xa2,
|
|
0x63,0xa2,0x13,0xa2,0xd3,0xa2,0x77,0x45,0x1f,0x8a,0xce,0x8b,0xba,0x45,0x17,0x45,
|
|
0x9f,0x8a,0xbe,0x10,0x7d,0x2d,0xfa,0x4e,0xd4,0x2f,0xb2,0x14,0x0f,0x12,0x0f,0x11,
|
|
0xdb,0x8b,0xc5,0x62,0x27,0xf1,0x30,0xb1,0x9b,0xd8,0x43,0xec,0x25,0xf6,0x16,0xfb,
|
|
0x8b,0x35,0xe2,0x50,0x71,0x84,0x38,0x46,0x1c,0x27,0xbe,0x43,0x7c,0x8f,0x78,0xb4,
|
|
0xf8,0x41,0xf1,0x23,0xe2,0x27,0xc4,0xe3,0xc5,0x13,0xc5,0x53,0xc4,0xd3,0xc5,0xb3,
|
|
0xc5,0xf3,0xc4,0x0b,0xc4,0x2f,0x8b,0x5f,0x13,0x27,0x8a,0x53,0xc5,0x4b,0xc5,0x99,
|
|
0xe2,0x55,0xe2,0x75,0xe2,0x6c,0x71,0xbe,0x78,0xb3,0x78,0x9b,0x78,0xa7,0x78,0xb7,
|
|
0xb8,0x42,0xbc,0x5f,0x5c,0x2b,0x6e,0x14,0xbf,0x2e,0x3e,0x24,0x3e,0x22,0x3e,0x26,
|
|
0x3e,0x21,0x3e,0x2d,0x7e,0x57,0xfc,0xa1,0xf8,0xbc,0xb8,0x5b,0x7c,0x51,0xfc,0xa9,
|
|
0xf8,0x0b,0xf1,0xd7,0xe2,0xef,0xc4,0xfd,0x62,0x4b,0xc9,0x20,0xc9,0x10,0x89,0xbd,
|
|
0x44,0x2c,0x71,0x92,0x0c,0x93,0xb8,0x49,0x3c,0x24,0x5e,0x12,0x6f,0x89,0xbf,0x44,
|
|
0x23,0x09,0x95,0x44,0x48,0x62,0x24,0x71,0x92,0x3b,0x24,0xf7,0x48,0x46,0x4b,0x1e,
|
|
0x94,0x3c,0x22,0x79,0x42,0x32,0x5e,0x32,0x51,0x32,0x45,0x32,0x5d,0x32,0x5b,0x32,
|
|
0x4f,0xb2,0x40,0xf2,0xb2,0xe4,0x35,0x49,0xa2,0x24,0x55,0xb2,0x54,0x92,0x29,0x59,
|
|
0x25,0x59,0x27,0xc9,0x96,0xe4,0x4b,0x36,0x4b,0xb6,0x49,0x76,0x4a,0x76,0x4b,0x2a,
|
|
0x24,0xfb,0x25,0xb5,0x92,0x46,0xc9,0xeb,0x92,0x43,0x92,0x23,0x92,0x63,0x92,0x13,
|
|
0x92,0xd3,0x92,0x77,0x25,0x1f,0x4a,0xce,0x4b,0xba,0x25,0x17,0x25,0x9f,0x4a,0xbe,
|
|
0x90,0x7c,0x2d,0xf9,0x4e,0xd2,0x2f,0xb1,0x74,0x18,0xe4,0x30,0xc4,0xc1,0xde,0x41,
|
|
0xec,0xe0,0xe4,0x30,0xcc,0xc1,0xcd,0xc1,0xc3,0xc1,0xcb,0xc1,0xdb,0xc1,0xdf,0x41,
|
|
0xe3,0x10,0xea,0x10,0xe1,0x10,0xe3,0x10,0xe7,0x70,0x87,0xc3,0x3d,0x0e,0xa3,0x1d,
|
|
0x1e,0x74,0x78,0xc4,0xe1,0x09,0x87,0xf1,0x0e,0x13,0x1d,0xfa,0x8d,0x7f,0x7e,0x60,
|
|
0x57,0x08,0x53,0x1c,0xfe,0x33,0xa3,0xf0,0x59,0xe8,0x4c,0x17,0xcd,0x74,0x98,0xeb,
|
|
0xf0,0x47,0xae,0x6e,0xf6,0xf3,0xbc,0xc3,0x4b,0x5c,0x1b,0xaf,0x39,0xfc,0x77,0x3f,
|
|
0x95,0x53,0x1c,0xfe,0xea,0xfb,0x62,0xbf,0x71,0x99,0xc3,0x0a,0x87,0x35,0x0e,0x1b,
|
|
0x1c,0x72,0x1d,0x36,0x39,0x6c,0x71,0xd8,0xee,0xb0,0xcb,0x61,0x8f,0xc3,0x5e,0x87,
|
|
0x6a,0x87,0x7a,0x87,0x66,0x87,0x03,0x0e,0x87,0x1d,0x8e,0x3a,0x1c,0x77,0x38,0xe9,
|
|
0xf0,0xb6,0xc3,0xfb,0x0e,0x67,0x1d,0x3e,0x72,0xe8,0x75,0xf8,0xd8,0xe1,0x33,0x87,
|
|
0x2f,0x1d,0xbe,0x71,0xf8,0xde,0x81,0x1c,0xad,0x1c,0x05,0x8e,0xb6,0x8e,0x43,0x1d,
|
|
0x1d,0x1c,0xa5,0x8e,0xae,0x8e,0xee,0x8e,0x9e,0x8e,0x2a,0x47,0x5f,0xc7,0x40,0xc7,
|
|
0x60,0xc7,0x30,0xc7,0x28,0x47,0x83,0xe3,0x6d,0x8e,0x77,0x39,0xde,0xeb,0x78,0xbf,
|
|
0xe3,0x43,0x8e,0x44,0x8f,0x39,0xfe,0xc3,0xf1,0x69,0xc7,0xc9,0x8e,0xcf,0x3a,0xce,
|
|
0x74,0x9c,0xeb,0xf8,0xbc,0xe3,0x8b,0x8e,0x8b,0x1c,0x19,0xc7,0x64,0xc7,0x74,0xc7,
|
|
0x65,0x8e,0x2b,0x1c,0xd7,0x38,0x6e,0x70,0xcc,0x75,0xdc,0xe4,0xb8,0xc5,0x71,0xbb,
|
|
0xe3,0x2e,0xc7,0x3d,0x8e,0x7b,0x1d,0xab,0x1d,0xeb,0x1d,0x9b,0x1d,0x0f,0x38,0x1e,
|
|
0x76,0x3c,0xea,0x78,0xdc,0xf1,0xa4,0xe3,0xdb,0x8e,0xef,0x3b,0x9e,0x75,0xfc,0xc8,
|
|
0xb1,0xd7,0xf1,0x63,0xc7,0xcf,0x1c,0xbf,0x74,0xfc,0xc6,0xf1,0x7b,0x47,0x93,0x57,
|
|
0xec,0x71,0x67,0x22,0x27,0x2b,0x27,0x81,0x93,0xad,0xd3,0x50,0x27,0x07,0x27,0x37,
|
|
0x91,0xd4,0xc9,0xd5,0xc9,0xdd,0xc9,0xd3,0xc9,0xff,0x0f,0xdf,0x7f,0x55,0x4e,0xfe,
|
|
0x4e,0xc1,0x4e,0x11,0x4e,0x06,0xa7,0x3b,0x9c,0xee,0x75,0x7a,0xd0,0xe9,0x31,0xa7,
|
|
0xf1,0x4e,0x93,0x9d,0xa6,0x3b,0xcd,0x75,0x5a,0xe0,0xb4,0xc8,0x29,0xd1,0x29,0xdd,
|
|
0x29,0xd3,0x69,0x8d,0x53,0xb6,0xd3,0x26,0xa7,0x6d,0x4e,0xbb,0x9c,0x2a,0x9c,0xaa,
|
|
0x9d,0x1a,0x9d,0x0e,0x38,0x1d,0x71,0x3a,0xee,0x74,0xda,0xe9,0x8c,0x53,0xbf,0xb1,
|
|
0xd7,0xe9,0x53,0xa7,0x2f,0x9d,0xbe,0x73,0x22,0xe7,0x41,0xce,0xb6,0xce,0x62,0x67,
|
|
0xa9,0xb3,0x9b,0xb3,0xa7,0xb3,0xb7,0x73,0xa0,0x73,0xa8,0x73,0x94,0x73,0x9c,0xf3,
|
|
0x5d,0xce,0xa3,0x9d,0x1f,0x72,0x7e,0xc2,0xf9,0x69,0xe7,0x29,0xce,0x33,0x9d,0xe7,
|
|
0x39,0xbf,0xe8,0xfc,0x9a,0x73,0xb2,0xf3,0x52,0xe7,0x15,0xce,0xeb,0x9c,0x73,0x9d,
|
|
0x37,0x3b,0x6f,0x77,0xde,0xed,0xbc,0xd7,0xb9,0xd6,0xb9,0xd9,0xf9,0x80,0xb3,0x93,
|
|
0xf8,0xb0,0xf3,0x4f,0xed,0x3b,0xea,0x7c,0xdc,0xb9,0xd3,0xf9,0xb4,0xf3,0x3b,0xce,
|
|
0xef,0x3b,0x9f,0x71,0x3e,0xef,0xdc,0xe5,0xdc,0xeb,0x7c,0xc9,0xf9,0x53,0xe7,0xcf,
|
|
0x9d,0xbf,0x74,0xbe,0xea,0xfc,0x9d,0xf3,0x32,0x9c,0xd9,0x2d,0x38,0xa7,0xec,0x59,
|
|
0x7c,0x9f,0x3b,0x7f,0x37,0xce,0xde,0x0f,0xce,0x16,0x52,0x6b,0xe9,0x60,0xa9,0x9d,
|
|
0x54,0x24,0x75,0x94,0xba,0x48,0x47,0x48,0x47,0x4a,0x15,0x52,0xb5,0xd4,0x4f,0x1a,
|
|
0x24,0x0d,0x91,0x46,0x49,0xe3,0xa5,0x37,0x7c,0x7b,0xa7,0x74,0x94,0x74,0x8c,0x34,
|
|
0x42,0x34,0x56,0x3a,0x5d,0xa4,0xc1,0xbd,0x76,0x3c,0xee,0xc2,0xdb,0x24,0x4b,0x45,
|
|
0xde,0xe2,0x47,0xa5,0xe3,0xa4,0x4f,0x49,0x27,0x49,0xa7,0x4a,0x67,0x48,0xe7,0x48,
|
|
0xe7,0x4b,0x17,0x4a,0x5f,0x91,0x6e,0x16,0x25,0x48,0x93,0xa4,0x69,0xd2,0x0c,0x69,
|
|
0x96,0x74,0xb5,0x74,0xbd,0x34,0x47,0x6a,0x3a,0x37,0x05,0xd2,0x22,0x69,0xb1,0xb4,
|
|
0x44,0x5a,0x26,0xad,0x94,0x56,0x49,0xeb,0xa4,0x4d,0xd2,0x16,0x69,0xab,0xf4,0x88,
|
|
0xf4,0x4d,0xe9,0x71,0x69,0xa7,0xf4,0xb4,0xf4,0x1d,0xe9,0xfb,0xd2,0x33,0xd2,0xf3,
|
|
0xd2,0x2e,0x69,0xaf,0xf4,0x92,0xf4,0x53,0xe9,0xe7,0xd2,0x2f,0xa5,0xdf,0x4a,0xfb,
|
|
0xa5,0x3c,0x17,0x81,0x8b,0x9d,0x8b,0xd8,0xc5,0xd9,0xc5,0xd5,0x65,0xa4,0x8b,0xd2,
|
|
0xc5,0xcf,0x45,0xeb,0x12,0xea,0x12,0xe1,0x12,0xed,0x12,0xeb,0x72,0xbb,0xcb,0xdd,
|
|
0x2e,0xf7,0xb9,0x3c,0xe0,0xf2,0xb0,0xcb,0xe3,0x2e,0x4f,0xba,0x4c,0x70,0x79,0xc6,
|
|
0x65,0x9a,0xcb,0x2c,0x97,0xe7,0x5c,0x5e,0x70,0x79,0xc9,0xe5,0x55,0x97,0xc5,0x2e,
|
|
0x29,0x2e,0x4b,0x5c,0x96,0xbb,0xac,0x74,0x59,0xeb,0xb2,0xd1,0x25,0xcf,0xa5,0xd0,
|
|
0x65,0xab,0xcb,0x0e,0x97,0x52,0x97,0x72,0x97,0x7d,0x2e,0x35,0x2e,0x0d,0x2e,0xff,
|
|
0x74,0x39,0xe8,0xd2,0xe6,0xf2,0xa6,0x4b,0x87,0xcb,0x29,0x97,0x77,0x5c,0x3e,0x70,
|
|
0x39,0xe7,0xd2,0xe5,0xd2,0xe7,0xf2,0x89,0xcb,0xe7,0x2e,0x5f,0xb9,0x7c,0xeb,0xf2,
|
|
0x83,0x8b,0xd5,0x30,0xd1,0x30,0xb7,0x61,0x3e,0xc3,0x42,0x86,0xc5,0x0d,0xbb,0x77,
|
|
0xd8,0x23,0xc3,0xa6,0x0c,0x9b,0x3f,0xec,0xd5,0x61,0x69,0xc3,0x56,0x0e,0xcb,0x1f,
|
|
0x56,0x32,0x6c,0xdf,0xb0,0xa6,0x61,0x87,0x86,0x1d,0x1f,0xf6,0xc1,0xb0,0x8b,0xc3,
|
|
0x3e,0x1f,0x66,0x31,0xdc,0x61,0xb8,0xe7,0x70,0xff,0xe1,0x31,0xc3,0x47,0x0f,0x1f,
|
|
0x37,0xfc,0x99,0xe1,0x73,0x86,0xbf,0x34,0x3c,0x75,0xf8,0xba,0xe1,0x45,0xc3,0x4b,
|
|
0x87,0x57,0x0d,0xff,0xe7,0xf0,0xc3,0xc3,0xdb,0x87,0x9f,0x1e,0xfe,0xc1,0xf0,0x9e,
|
|
0xe1,0x9f,0x0f,0xb7,0x70,0xb5,0x71,0x95,0xba,0xaa,0x5c,0x35,0xae,0xe1,0xae,0x06,
|
|
0xd7,0xfb,0x5d,0x9f,0x74,0x9d,0xe5,0xba,0xd0,0x35,0xcd,0x35,0xd3,0x75,0x83,0xeb,
|
|
0x66,0xd7,0x5d,0xae,0xfb,0x5d,0x9b,0x5d,0xdf,0x74,0x7d,0xcb,0xf5,0x43,0xd7,0x5e,
|
|
0xd7,0x2f,0x5c,0xbf,0x77,0x1d,0x3c,0x42,0x32,0x62,0xc4,0x08,0xe5,0x08,0xdd,0x88,
|
|
0xdb,0x46,0x8c,0x1a,0x31,0x6e,0xc4,0xc4,0x11,0x73,0x46,0x2c,0x1a,0x91,0x3a,0x62,
|
|
0xc5,0x88,0xec,0x11,0xc5,0x23,0x76,0x8f,0xa8,0x1e,0x71,0x70,0xc4,0xd1,0x11,0xef,
|
|
0x8f,0xe8,0x1e,0x71,0x69,0xc4,0x67,0x23,0xbe,0x1a,0xf1,0xdd,0x08,0xe3,0x08,0x2b,
|
|
0xb7,0xc1,0x6e,0xf6,0x6e,0x12,0x37,0xa9,0x9b,0x9b,0x9b,0xa7,0x9b,0xb7,0x5b,0xa0,
|
|
0x5b,0xa8,0x5b,0x94,0x5b,0x9c,0xdb,0x5d,0x6e,0xa3,0xdd,0x1e,0x72,0x7b,0xc2,0xed,
|
|
0x69,0xb7,0x29,0x6e,0x33,0xdd,0xe6,0xb9,0x2d,0x70,0x7b,0xc9,0x6d,0x91,0x1b,0xe3,
|
|
0x96,0xe4,0x96,0xea,0xb6,0xc4,0x6d,0xb9,0xdb,0x4a,0xb7,0x35,0x6e,0x39,0x6e,0x9b,
|
|
0xdd,0x76,0xb8,0xed,0x71,0x6b,0x70,0x6b,0x76,0x6b,0x71,0x6b,0x75,0x3b,0xe2,0xf6,
|
|
0xa6,0xdb,0x71,0xb7,0x4e,0xb7,0xd3,0x6e,0xef,0xba,0x9d,0x71,0x3b,0xef,0xd6,0xe5,
|
|
0xd6,0xe7,0xf6,0x89,0xdb,0x67,0x6e,0x57,0xdc,0xbe,0x76,0xfb,0xce,0xad,0xdf,0xcd,
|
|
0x52,0x36,0x48,0x36,0x44,0x66,0x27,0x1b,0x2a,0x93,0xc8,0x9c,0x64,0x2e,0xb2,0x11,
|
|
0x32,0x77,0x99,0x5c,0xe6,0x25,0xf3,0x96,0xf9,0xcb,0x82,0x64,0x21,0xb2,0x70,0x59,
|
|
0xb4,0xcc,0x20,0xbb,0x4d,0x76,0x8f,0xac,0xc1,0xed,0x01,0xd9,0xc3,0xb2,0xc7,0x65,
|
|
0x4f,0xca,0x26,0xc8,0xa6,0xc9,0xe6,0xc9,0x5e,0x90,0xbd,0x28,0x5b,0x24,0x4b,0x90,
|
|
0x25,0xca,0x52,0x64,0x4b,0x64,0xcb,0x40,0x96,0x6c,0x95,0x6c,0xad,0x6c,0xa3,0x2c,
|
|
0x17,0x14,0xc8,0x8a,0x64,0xfd,0xc6,0x62,0xd9,0x4e,0x59,0xa9,0x6c,0x0f,0x72,0x55,
|
|
0xb2,0x5a,0x59,0x83,0xac,0x59,0xd6,0x22,0x3b,0x84,0xf6,0xdb,0x64,0x47,0x65,0xed,
|
|
0xb2,0x13,0xb2,0xd3,0xb2,0xe3,0x6e,0xef,0xc8,0x3e,0x90,0x9d,0x43,0x89,0x8f,0x64,
|
|
0xbd,0xb2,0x4b,0xb2,0x4f,0x65,0x9f,0xcb,0xbe,0x94,0x7d,0x27,0x23,0x77,0x6b,0xf7,
|
|
0x21,0xee,0x42,0x77,0x07,0x77,0x17,0x77,0x37,0x77,0xb9,0xbb,0xca,0xdd,0xcf,0x5d,
|
|
0xeb,0x1e,0xee,0xae,0x77,0xbf,0xdd,0x7d,0x94,0xfb,0x03,0xee,0x8f,0xba,0x3f,0xe9,
|
|
0x3e,0xc9,0x7d,0x9a,0xfb,0x1c,0xf7,0x17,0xdc,0x5f,0x71,0x5f,0xec,0x9e,0xe6,0xbe,
|
|
0xdc,0x7d,0xb5,0xfb,0x46,0xf7,0x02,0xf7,0xad,0xee,0x25,0xee,0xe5,0xee,0xfb,0xdc,
|
|
0x8d,0xc6,0x1a,0xd0,0x00,0xfe,0x09,0x0e,0x82,0x4e,0xbe,0xd1,0xd8,0x86,0xf4,0x4d,
|
|
0xd0,0x01,0x4e,0x81,0x77,0xc0,0x07,0xe0,0x1c,0xe8,0x02,0x7d,0xe0,0x13,0xf0,0x39,
|
|
0xf8,0x0a,0x7c,0x0b,0x7e,0x00,0x16,0x23,0x8d,0x46,0x6b,0x30,0x78,0xe4,0x6f,0xbb,
|
|
0xff,0xd8,0xa1,0x9c,0x08,0x38,0x02,0x17,0x30,0x02,0x8c,0x04,0x0a,0xa0,0x06,0x7e,
|
|
0x20,0x08,0x84,0x80,0x70,0x10,0x0d,0x62,0x81,0x9b,0x95,0xa7,0xd5,0xff,0x96,0xa7,
|
|
0xd8,0xed,0xb0,0xe7,0x6e,0x70,0x1f,0x78,0x00,0x3c,0x0c,0x1e,0x07,0x4f,0x9a,0x7d,
|
|
0x30,0x01,0xe9,0x33,0x60,0x1a,0x98,0x05,0x9e,0x03,0x2f,0x80,0x97,0xc0,0xab,0x60,
|
|
0x31,0x48,0x01,0x4b,0xc0,0x72,0xb0,0x12,0xac,0x05,0x1b,0x41,0x1e,0x28,0x04,0x5b,
|
|
0xc1,0x0e,0x50,0x0a,0xca,0xc1,0x3e,0x50,0x03,0x1a,0xc0,0x3f,0xc1,0x41,0xd0,0x06,
|
|
0xde,0x04,0x1d,0xe0,0x14,0x78,0xc7,0xcc,0x8f,0x3f,0x1f,0x60,0xcf,0x39,0xd0,0x35,
|
|
0xb2,0x0f,0xf1,0x27,0xe0,0x73,0xf0,0x15,0xf8,0xf6,0x7a,0xd9,0x1f,0x90,0xab,0xe6,
|
|
0xbe,0x1b,0xb3,0xf0,0xc0,0xf9,0xf4,0x30,0x7f,0xa7,0x8d,0xd4,0x0e,0x88,0x80,0x23,
|
|
0x70,0x01,0x23,0xc0,0x48,0xa0,0x00,0x6a,0xe0,0x07,0xaa,0x2c,0x37,0x0a,0xf6,0x09,
|
|
0x82,0x3c,0xea,0xd0,0x42,0xb0,0x87,0xce,0xe3,0x75,0x41,0x84,0x47,0x0c,0xf6,0xc7,
|
|
0x81,0x3b,0xc0,0x3d,0x60,0x34,0x78,0x10,0x3c,0x02,0x9e,0x00,0xe3,0x3d,0x3e,0x14,
|
|
0x4c,0xf4,0x98,0x82,0xdc,0x74,0x30,0xdb,0xe3,0x39,0xc4,0x2f,0x80,0x97,0xc0,0xab,
|
|
0x60,0x31,0x48,0x01,0x4b,0xc0,0x72,0xb0,0xd2,0xe3,0xb7,0xce,0xf0,0x14,0x64,0x4d,
|
|
0x36,0x34,0x92,0xd6,0x70,0xbd,0xf8,0x8a,0x22,0x2c,0xfe,0x8c,0x73,0x7e,0xdf,0xc8,
|
|
0x0d,0x1e,0x43,0x86,0xe6,0x7a,0xfc,0xfc,0xc8,0x26,0x8f,0x9b,0xd7,0x61,0x45,0x1e,
|
|
0xc5,0x1e,0x25,0x1e,0x65,0x1e,0x95,0x1e,0x55,0x1e,0x75,0x1e,0x4d,0x1e,0x2d,0x1e,
|
|
0xad,0x1e,0x6f,0x78,0xb4,0x7b,0x74,0x7a,0xbc,0xe5,0xf1,0x9e,0xc7,0x19,0x8f,0x0b,
|
|
0x1e,0x3d,0x1e,0x97,0x3c,0x2e,0x7b,0x5c,0xf1,0xb8,0xea,0x71,0xcd,0xc3,0xe8,0xc1,
|
|
0x93,0xf3,0xe5,0x36,0x72,0xa1,0x5c,0x22,0x77,0x96,0x0f,0x97,0xcb,0xe4,0x72,0xb9,
|
|
0x52,0xee,0x23,0x0f,0x90,0x6b,0xe5,0x3a,0x79,0xa4,0x5c,0x2f,0x8f,0x97,0xdf,0x29,
|
|
0x1f,0x25,0x1f,0x23,0x1f,0x2b,0x7f,0x54,0x3e,0x4e,0xfe,0x94,0x7c,0x92,0x7c,0xaa,
|
|
0x7c,0x86,0x7c,0x8e,0x7c,0xbe,0x7c,0xa1,0xfc,0x15,0x79,0x82,0x3c,0x49,0x9e,0x26,
|
|
0xcf,0x90,0x67,0xc9,0x57,0xcb,0xd7,0xcb,0x73,0xe4,0x05,0xf2,0x22,0x79,0xb1,0xbc,
|
|
0x44,0x5e,0x26,0xaf,0x94,0x57,0xc9,0xeb,0xe4,0x4d,0xf2,0x16,0x79,0xab,0xfc,0x0d,
|
|
0x79,0xbb,0xbc,0x53,0xfe,0x96,0xfc,0x3d,0xf9,0x19,0xf9,0x05,0x79,0x8f,0x3c,0x55,
|
|
0x72,0x49,0x7e,0x59,0x7e,0x45,0x7e,0x55,0x3e,0x1e,0xf3,0xec,0x6b,0xf2,0x6d,0x12,
|
|
0xa3,0x9c,0xe7,0xc9,0xf7,0xb4,0xf1,0x14,0x7a,0x4a,0x3c,0x9d,0x3d,0x87,0x7b,0xca,
|
|
0x3c,0xe5,0x9e,0x4a,0x4f,0x1f,0xcf,0x00,0x4f,0xad,0xa7,0xce,0x33,0xd2,0x53,0xef,
|
|
0x19,0xef,0x79,0xa7,0xe7,0x28,0xcf,0x31,0x9e,0x63,0x3d,0x1f,0xf5,0x1c,0xe7,0xf9,
|
|
0x94,0xe7,0x24,0xcf,0xa9,0x9e,0x33,0x3c,0xe7,0x78,0xce,0xf7,0x5c,0xe8,0xf9,0x8a,
|
|
0x67,0x82,0x67,0x92,0x67,0x9a,0x67,0x86,0x67,0x96,0xe7,0x6a,0xcf,0xf5,0x9e,0x39,
|
|
0x9e,0x05,0x9e,0xfd,0xe2,0x22,0xcf,0x62,0xcf,0x12,0xcf,0x32,0xcf,0x4a,0xcf,0x2a,
|
|
0xcf,0x3a,0xcf,0x26,0xcf,0x16,0xcf,0x56,0xcf,0x37,0x3c,0x3d,0x1c,0xda,0x3d,0x3b,
|
|
0x3d,0xdf,0xf2,0x7c,0xcf,0xf3,0x8c,0xe7,0x05,0xcf,0x1e,0xcf,0x4b,0x9e,0x97,0x3d,
|
|
0xaf,0x78,0x5e,0xf5,0xbc,0xe6,0x69,0xf4,0xe4,0x29,0xf8,0x0a,0x1b,0x85,0x50,0x21,
|
|
0x51,0x38,0x2b,0x86,0x2b,0x64,0x0a,0xb9,0x42,0xa9,0xf0,0x51,0x04,0x28,0xb4,0x0a,
|
|
0x9d,0x42,0xee,0x19,0xa9,0xd0,0x2b,0xe2,0x15,0x77,0x2a,0x46,0x29,0xc6,0x28,0xc6,
|
|
0x2a,0x1e,0x55,0x8c,0x53,0x3c,0xa5,0x98,0xa4,0x98,0xaa,0x98,0xa1,0x98,0xa3,0x98,
|
|
0xaf,0x58,0xa8,0x78,0x45,0x91,0xa0,0x48,0x52,0xa4,0x29,0x32,0x25,0x19,0x8a,0x2c,
|
|
0xc5,0x6a,0xc5,0x7a,0x45,0x8e,0xa2,0x40,0x51,0xa4,0x28,0x56,0x94,0x28,0xca,0x14,
|
|
0x95,0x8a,0x2a,0x45,0x9d,0xa2,0x49,0xd1,0xa2,0xd8,0x2c,0x6a,0x55,0xbc,0xa1,0x68,
|
|
0x57,0x74,0x2a,0xde,0x52,0xbc,0xa7,0x38,0xa3,0xb8,0xa0,0x78,0x44,0xd4,0xa3,0xb8,
|
|
0xa4,0xb8,0xac,0xb8,0xa2,0xb8,0xaa,0xb8,0xa6,0x30,0x2a,0x78,0x5e,0x7c,0x2f,0x1b,
|
|
0x2f,0xa1,0x97,0xc4,0xcb,0xd9,0x6b,0xb8,0x97,0xcc,0x4b,0xee,0xa5,0xf4,0xf2,0xf1,
|
|
0x0a,0xf0,0xd2,0x7a,0xe9,0xbc,0x22,0xbd,0x92,0x14,0x7a,0xaf,0x78,0xaf,0x3b,0xbd,
|
|
0x46,0x79,0x8d,0xf1,0x1a,0xeb,0xf5,0xa8,0xd7,0x38,0xaf,0x78,0xc5,0x53,0x5e,0x93,
|
|
0xbc,0xa6,0x7a,0xcd,0xf0,0x9a,0xe3,0x35,0xdf,0x6b,0xa1,0xd7,0x2b,0x5e,0x09,0x5e,
|
|
0x49,0x5e,0x69,0x5e,0x19,0x5e,0x59,0x5e,0xab,0xbd,0xd6,0x7b,0xe5,0x78,0x15,0x78,
|
|
0x15,0x79,0x15,0x7b,0x95,0x78,0xc9,0x3d,0xcb,0xbc,0x2a,0xbd,0xaa,0xbc,0xea,0xbc,
|
|
0x9e,0x70,0x68,0xf2,0x6a,0xf1,0x6a,0xf5,0x7a,0xc3,0xab,0xdd,0xab,0xd3,0xeb,0x2d,
|
|
0xaf,0xf7,0xbc,0xce,0x78,0x5d,0xf0,0xea,0xf1,0xba,0xe4,0x35,0x4a,0x7a,0xd9,0xeb,
|
|
0x8a,0xd7,0x55,0xaf,0x6b,0x5e,0x46,0x2f,0x9e,0x92,0xaf,0xb4,0x51,0x0a,0x95,0xa3,
|
|
0x14,0x12,0xa5,0xb3,0x72,0xb8,0x52,0xa6,0x94,0x2b,0x95,0x4a,0x1f,0x65,0x80,0x52,
|
|
0xab,0xd4,0x29,0x23,0x95,0x7a,0x65,0xbc,0x72,0xb3,0xe4,0x4e,0xe5,0x28,0xe5,0x18,
|
|
0xe5,0x58,0xe5,0xa3,0xca,0x71,0xca,0xa7,0x94,0x93,0x94,0x53,0x95,0x33,0x94,0x73,
|
|
0x94,0xf3,0x95,0x0b,0x95,0x1f,0x8a,0x5f,0x51,0x26,0x28,0x93,0x94,0x69,0xca,0x0c,
|
|
0x65,0x96,0x72,0xb5,0x72,0xbd,0x32,0x47,0x59,0xa0,0x2c,0x52,0x16,0x2b,0x4b,0x94,
|
|
0x65,0xca,0x4a,0x65,0x95,0xf2,0x1e,0x49,0x9d,0xf2,0x11,0x49,0x93,0xb2,0x45,0xd9,
|
|
0xaa,0x64,0xc7,0xf1,0x1b,0x88,0xdb,0xb9,0x5c,0xa7,0xf2,0x2d,0xe5,0x7b,0xca,0x33,
|
|
0xca,0x0b,0xca,0x1e,0xe5,0x25,0xe5,0x65,0xe5,0x15,0xe5,0x77,0x62,0xa3,0xf1,0x2a,
|
|
0x8e,0x5d,0xe3,0x8e,0x1b,0x95,0x3c,0x95,0xf9,0x4d,0xbe,0xca,0x46,0x25,0x54,0x49,
|
|
0x54,0xce,0xaa,0xe1,0x2a,0x99,0x4a,0xae,0x52,0xaa,0x7c,0x54,0x01,0x2a,0xad,0x4a,
|
|
0xa7,0x8a,0x54,0xe9,0x55,0xf1,0xaa,0x3b,0x55,0xa3,0x54,0x8d,0xa2,0x31,0xaa,0xb1,
|
|
0xaa,0x47,0x55,0xe3,0x54,0x4f,0xa9,0x26,0xa9,0xa6,0xaa,0x66,0xa8,0xe6,0xa8,0xe6,
|
|
0xab,0x16,0xaa,0x5e,0x51,0x25,0xa8,0x92,0x54,0x69,0xaa,0xa7,0xa4,0x19,0xaa,0x2c,
|
|
0xd5,0x6a,0xd5,0x7a,0xd5,0x1c,0x69,0x8e,0xaa,0x40,0x55,0xa4,0x2a,0x56,0x95,0xa8,
|
|
0x24,0x5e,0x65,0xaa,0x4a,0x55,0x95,0xaa,0x4e,0xd5,0xa4,0x6a,0x41,0x68,0x55,0xbd,
|
|
0xa1,0x6a,0x57,0x75,0xaa,0xde,0x52,0xbd,0xa7,0x3a,0xa3,0xba,0xa0,0x32,0x2a,0x7b,
|
|
0x54,0x97,0x54,0x97,0x55,0x57,0x54,0x57,0x55,0xdf,0xab,0xb8,0xef,0x62,0xd4,0x56,
|
|
0x6a,0x81,0xda,0x56,0x3d,0x54,0xed,0xa0,0x96,0xaa,0x5d,0xd5,0x3a,0x95,0xbb,0xda,
|
|
0x53,0xad,0x52,0xbf,0xa1,0xf4,0x55,0x07,0xaa,0x83,0xd5,0x61,0xea,0x28,0xb5,0x41,
|
|
0x7d,0x9b,0xfa,0x2e,0xf5,0xbd,0xea,0xfb,0xd5,0x0f,0xa9,0x1f,0x53,0x3f,0xaa,0xfa,
|
|
0x87,0x7a,0x9c,0xea,0x69,0xf5,0x64,0xf5,0xb3,0xea,0x99,0xea,0xb9,0xea,0x76,0xe5,
|
|
0x42,0xcf,0xe7,0xd5,0x2f,0xaa,0xe3,0xc4,0x69,0x8a,0x4e,0xaf,0x45,0x6a,0x46,0xbd,
|
|
0x50,0x95,0xac,0x7e,0x45,0x95,0xae,0x5e,0xa6,0x5e,0xa1,0x7e,0x4b,0xb9,0x46,0xbd,
|
|
0x41,0x9d,0xab,0xde,0xa4,0xde,0xa2,0x7e,0x4f,0xb9,0x5d,0xbd,0x4b,0xbd,0x47,0xbd,
|
|
0x57,0x5d,0xad,0xae,0x57,0x97,0xa8,0x9a,0xd5,0x07,0xd4,0x12,0xaf,0xc3,0xea,0x3a,
|
|
0xd5,0x51,0xf5,0x71,0xf5,0x49,0xf5,0xdb,0xea,0xf7,0xd5,0xed,0xaa,0xb3,0xea,0x6b,
|
|
0xca,0x8f,0xd4,0x9d,0xaa,0x48,0x45,0xaf,0xfa,0x2d,0xd5,0xc7,0xea,0x33,0xaa,0xcf,
|
|
0xd4,0x5f,0xaa,0xbf,0x51,0x7f,0xaf,0x26,0xef,0x1e,0xd5,0x65,0xa5,0x95,0xf7,0x25,
|
|
0x95,0xc0,0xfb,0xb2,0xca,0xd6,0x7b,0xbc,0xc3,0x50,0x6f,0x47,0xef,0x61,0xde,0x32,
|
|
0x6f,0xb9,0xb7,0xd2,0xdb,0xc7,0x3b,0xd0,0x3b,0xc4,0x3b,0xc2,0x3b,0xc6,0xfb,0xcf,
|
|
0x5c,0xff,0xc6,0x79,0xdf,0xee,0x7d,0x97,0xf7,0x28,0xef,0x31,0xde,0x63,0x11,0x7e,
|
|
0xa9,0xd4,0x23,0xde,0xe3,0xbc,0x9f,0xf6,0x7e,0xc6,0x7b,0xfa,0x4d,0x25,0xe6,0x78,
|
|
0x63,0x1d,0xea,0xfd,0x92,0xf7,0x22,0xbb,0x14,0xbb,0x45,0xde,0x09,0xde,0x89,0xde,
|
|
0x29,0xde,0xe9,0xde,0x19,0xde,0xb7,0xd9,0x65,0x7a,0xaf,0xf6,0xde,0xe0,0x5d,0xe0,
|
|
0xbd,0xcd,0xbb,0xc4,0x7b,0x8f,0xf7,0x3e,0xef,0x5a,0xef,0x26,0xef,0x03,0xde,0x6d,
|
|
0xde,0xc7,0x50,0xbb,0xd3,0xfb,0x6d,0xef,0x0f,0xbc,0xcf,0x7b,0xf7,0x20,0xff,0x31,
|
|
0xf8,0xdc,0xfb,0x6b,0xc4,0xd7,0xbc,0xc9,0xa7,0xdf,0x68,0xed,0x33,0xc4,0x47,0xe8,
|
|
0xe3,0xe0,0xe3,0xe2,0xe3,0xe6,0x23,0xf7,0x51,0xf9,0xf8,0xf9,0x68,0x7c,0x74,0x08,
|
|
0x11,0xe6,0x10,0x6d,0x0e,0x06,0x73,0x88,0x37,0x87,0x3b,0xcc,0xe1,0x6e,0x73,0xb8,
|
|
0xd7,0x1c,0xc6,0x98,0xc3,0x83,0xe6,0xf0,0xb0,0x39,0x3c,0x66,0x0e,0xe3,0xcc,0x61,
|
|
0x3c,0xc2,0x04,0x84,0xc9,0x08,0x53,0x11,0xa6,0x23,0xcc,0x42,0x98,0x6b,0x0e,0xf3,
|
|
0xcd,0x61,0x81,0x39,0xbc,0x64,0x0e,0x8b,0x10,0x12,0xcc,0x21,0x11,0x21,0xc5,0x1c,
|
|
0xd2,0xcd,0x21,0x03,0x21,0x13,0xe1,0x8f,0x3f,0x6d,0x56,0xfa,0x98,0xc2,0x1a,0x84,
|
|
0xf5,0x08,0xd9,0x08,0x1f,0x58,0xe7,0xf9,0xe4,0xf9,0x6c,0x42,0x28,0x42,0xd8,0x66,
|
|
0x0e,0x3b,0x10,0x76,0x21,0x94,0x23,0xec,0x47,0xa8,0x43,0x68,0x46,0x38,0x88,0x70,
|
|
0x84,0x0b,0xed,0x5c,0x38,0x69,0x0e,0x6f,0xf9,0xbc,0xef,0x73,0x0e,0xdb,0xdd,0x3e,
|
|
0x97,0x7c,0x3e,0xf3,0xf9,0xca,0xe7,0x3b,0x1f,0xa3,0x8f,0x95,0xef,0x60,0x5f,0x7b,
|
|
0x5f,0x89,0xaf,0xd4,0x77,0x84,0xaf,0x87,0xaf,0xd2,0xd7,0xd7,0x37,0xc8,0x37,0xd4,
|
|
0x37,0xd2,0xd7,0xe0,0x7b,0xbb,0xef,0x3d,0xbe,0x63,0x7c,0x1f,0xf2,0x7d,0xdc,0x77,
|
|
0xbc,0xef,0x24,0xdf,0x67,0x7d,0x67,0xf9,0xce,0xf3,0x5d,0xe8,0xbb,0xc8,0x77,0xb1,
|
|
0x6f,0xaa,0x6f,0x86,0xef,0x0a,0xdf,0xb5,0xbe,0xd9,0xbe,0x05,0xbe,0x5b,0x7c,0x77,
|
|
0xf8,0xee,0xf6,0xad,0xf4,0xad,0xf6,0x6d,0xf0,0x7d,0xdd,0xb7,0xd5,0xf7,0xa8,0x6f,
|
|
0x87,0xef,0x69,0xdf,0xf7,0x7c,0xcf,0xfa,0x76,0xf9,0x5e,0xf4,0xbd,0xec,0xfb,0xa5,
|
|
0xef,0xb7,0xbe,0xfd,0xbe,0x3c,0x3f,0x81,0x9f,0x9d,0x9f,0xd8,0xcf,0xd9,0xcf,0xd5,
|
|
0x6f,0xa4,0x9f,0x97,0x9f,0x8f,0x5f,0xa0,0x5f,0x88,0x5f,0x84,0x9f,0xde,0xef,0x36,
|
|
0xbf,0xbb,0xfd,0x46,0xfb,0x8d,0xf5,0x7b,0xcc,0xef,0x49,0xbf,0x89,0x7e,0x53,0xfd,
|
|
0x66,0xfa,0x3d,0xe7,0xb7,0xc0,0xef,0x15,0x3f,0xc6,0x2f,0xc5,0x6f,0xa9,0x5f,0x96,
|
|
0xdf,0x1a,0xbf,0x8d,0x7e,0xf9,0x7e,0x45,0x7e,0xdb,0xfd,0x76,0xfb,0xed,0xf5,0xab,
|
|
0xf5,0x6b,0xf6,0x3b,0xe4,0x77,0xd4,0xaf,0xc3,0xef,0x9c,0xcf,0x69,0x3f,0xb6,0x27,
|
|
0xef,0xf9,0x9d,0xf5,0xfb,0xce,0xa7,0xcb,0x8f,0xed,0xc9,0x45,0xbf,0xcb,0x7e,0x52,
|
|
0xdf,0x2f,0xfd,0xd8,0x9e,0x7c,0xeb,0xd7,0xef,0xe7,0xeb,0xcb,0xf3,0x67,0x7b,0xc3,
|
|
0x5a,0x65,0xb2,0x68,0xc0,0x16,0x93,0x15,0x02,0xff,0x08,0x3f,0x3b,0x7f,0xb1,0xff,
|
|
0x63,0x7e,0xce,0xfe,0xac,0x7a,0x91,0x9f,0xab,0xff,0x48,0xff,0xa5,0x7e,0x5e,0xfe,
|
|
0xac,0x2e,0xeb,0x2d,0x1f,0xff,0x73,0x3e,0x81,0xfe,0x03,0xde,0x0a,0xf1,0x1f,0xf0,
|
|
0x55,0x84,0xbf,0xef,0x4d,0x3e,0xba,0xd9,0x43,0x7a,0xff,0x9b,0x7d,0xf4,0x73,0x0f,
|
|
0xb1,0xde,0xb9,0xe1,0x97,0x01,0x9f,0xdc,0xe6,0x3f,0xe0,0x91,0x01,0x6f,0xdc,0xed,
|
|
0xcf,0xfa,0x62,0xb4,0xff,0x80,0x27,0xc6,0x72,0x96,0xb0,0x36,0x98,0xd4,0x1f,0xf3,
|
|
0x9f,0xe5,0xfb,0xa4,0xff,0x44,0xff,0xa9,0xfe,0x6c,0x3b,0xae,0x5c,0x0d,0xb6,0xd4,
|
|
0x4c,0xff,0xf9,0xfe,0x2f,0xfb,0x2f,0xf6,0x4f,0xf5,0xcf,0xf0,0x5f,0xe1,0xbf,0xd6,
|
|
0x3f,0xdb,0xbf,0xc0,0x7f,0x8b,0xff,0x0e,0xff,0xdd,0xfe,0x95,0xfe,0xd5,0xfe,0x0d,
|
|
0xfe,0xaf,0xfb,0xb7,0xfa,0x1f,0xf5,0xef,0xf0,0x3f,0xed,0xff,0x9e,0xff,0x59,0xff,
|
|
0x2e,0xff,0x8b,0xfe,0x97,0xd1,0xca,0x97,0xfe,0xdf,0xfa,0xf7,0xfb,0xf3,0x02,0x7e,
|
|
0x6f,0xbd,0x81,0xed,0x27,0x61,0xcf,0x5a,0xb3,0x37,0x4c,0xfb,0xd8,0x51,0x22,0x08,
|
|
0x10,0x04,0xfc,0xa6,0xf5,0x41,0x80,0x03,0xc2,0xf0,0x00,0x8f,0x00,0x75,0x40,0x60,
|
|
0x80,0x2e,0x20,0x06,0xe1,0xf6,0x80,0x7b,0x03,0xc6,0x06,0x3c,0x11,0x30,0x21,0xe0,
|
|
0x59,0x84,0x39,0x01,0x0b,0x10,0x5e,0x45,0x48,0x0e,0xc8,0x40,0x58,0x15,0xb0,0x11,
|
|
0x61,0x13,0x42,0x71,0xc0,0x6e,0x84,0x7d,0x08,0xf5,0x01,0x2d,0x01,0x47,0x02,0x3a,
|
|
0x10,0xde,0x0e,0x38,0x13,0xd0,0x1d,0xf0,0x49,0xc0,0x97,0x08,0xd7,0x02,0x2c,0x03,
|
|
0x07,0x07,0x0e,0x0d,0x74,0x0e,0xc4,0xd2,0x31,0x50,0x81,0xe0,0x8b,0xa0,0x0d,0x8c,
|
|
0x08,0x8c,0x0d,0xbc,0x2b,0x70,0x4c,0xe0,0x23,0x81,0x4f,0x06,0xb2,0x36,0x4c,0x0e,
|
|
0x9c,0x11,0x38,0x2f,0xf0,0xa5,0x40,0x26,0x30,0x0d,0x21,0x33,0x70,0x6d,0x60,0x6e,
|
|
0x60,0x11,0xc2,0xce,0xc0,0xf2,0xc0,0xea,0xc0,0xa6,0xc0,0x43,0x81,0x6f,0x06,0x9e,
|
|
0x0c,0x7c,0x2f,0xf0,0x7c,0x60,0x5f,0xe0,0x67,0x81,0x57,0x03,0xfb,0x03,0xad,0x83,
|
|
0x6c,0x83,0x24,0x41,0xc3,0x82,0x46,0x06,0xa9,0x82,0x02,0x82,0x42,0x83,0xa2,0x83,
|
|
0xae,0x05,0x0c,0x0e,0xbc,0x2d,0x68,0x54,0xd0,0x83,0x41,0x8f,0x07,0x3d,0x1d,0x34,
|
|
0x15,0x3c,0x18,0x34,0x3b,0xe8,0x85,0xa0,0x45,0x41,0x49,0x41,0x4b,0xb1,0x7d,0x04,
|
|
0xd6,0xaf,0x0c,0xda,0x10,0xf4,0xfb,0xbf,0x09,0xbd,0x75,0x28,0x08,0xda,0x16,0x54,
|
|
0x1a,0xb4,0x3f,0xa8,0x29,0xe8,0x70,0x50,0x47,0xd0,0xbb,0x41,0x17,0x82,0x3e,0x0e,
|
|
0xba,0x12,0xe4,0xa8,0x51,0x68,0x7e,0xfa,0x9b,0x7e,0xb7,0xfe,0xf8,0x6b,0x02,0x35,
|
|
0xfd,0xc6,0x60,0x8d,0xd1,0x32,0x54,0x13,0xa6,0x89,0xd0,0xc4,0x68,0xfe,0xbd,0x6f,
|
|
0x10,0xf0,0x84,0xd1,0xdc,0xa1,0xb9,0x07,0x81,0xfd,0x7d,0x86,0x7b,0x35,0xa3,0x35,
|
|
0xf7,0x6b,0x1e,0xd2,0x3c,0xa6,0xf9,0x87,0xe6,0x69,0xcd,0x64,0x0d,0xfb,0x5d,0xf1,
|
|
0xb3,0x9a,0x99,0x9a,0xb9,0x9a,0xe7,0x39,0x7b,0x5e,0xd4,0xbc,0xac,0x71,0xb5,0x33,
|
|
0x85,0x7b,0xb8,0x5a,0x26,0x7d,0xe8,0x58,0x06,0x43,0x3f,0x54,0x13,0xf7,0xa3,0x76,
|
|
0x16,0x69,0x5e,0xd3,0x30,0x9a,0xdb,0xec,0x12,0x35,0xc9,0x9a,0x54,0xcd,0x3d,0x76,
|
|
0xfd,0xc6,0x74,0xcd,0x52,0xcd,0x32,0x4d,0xe6,0x75,0x2b,0x57,0x68,0xd6,0x68,0x36,
|
|
0xa2,0xed,0x3c,0xec,0x29,0xd4,0x6c,0xd5,0xec,0xd4,0xec,0xd6,0x54,0x6a,0xaa,0x34,
|
|
0xf5,0x9a,0x66,0xcd,0x41,0x4d,0x9b,0xe6,0x98,0xa6,0x03,0xe1,0x24,0xc2,0x5b,0x08,
|
|
0xef,0x22,0x7c,0x60,0x0e,0x67,0x11,0x2e,0x98,0x43,0x37,0x42,0x9f,0x39,0x7c,0x6c,
|
|
0x0e,0x97,0xcd,0xe1,0x0b,0x73,0xf8,0xca,0x1c,0xbe,0x41,0xb8,0x86,0xd0,0x8f,0x60,
|
|
0xa1,0xb5,0xd0,0x5a,0x99,0x03,0xdf,0x1c,0x86,0x98,0x83,0x9d,0x39,0x0c,0x35,0x07,
|
|
0x89,0x39,0x38,0x99,0x83,0x8b,0x39,0xb8,0x9a,0x83,0xcc,0x1c,0x3c,0xcc,0x41,0x61,
|
|
0x0e,0x2a,0x73,0xf0,0x31,0x07,0x7f,0x73,0x08,0x42,0x60,0x9f,0x06,0xc1,0x5a,0x53,
|
|
0xd0,0x21,0x44,0x21,0xc4,0x22,0xdc,0x81,0x60,0xfa,0x4d,0x95,0x7e,0x63,0xa8,0x66,
|
|
0x94,0x76,0x11,0xe7,0xb5,0xd7,0x34,0xf7,0x69,0x59,0xef,0xb2,0x1e,0xf5,0xd7,0x24,
|
|
0x6a,0xa6,0x38,0x8c,0xd1,0xde,0xea,0xf7,0x53,0xd8,0xd1,0x90,0x0c,0x6f,0xa7,0xe2,
|
|
0x8c,0x64,0x6a,0x7e,0xcf,0x37,0xd4,0x2f,0x6a,0xd2,0x71,0xa6,0x1f,0xd0,0xde,0xa3,
|
|
0x79,0xc3,0xf6,0xf7,0xd4,0xbf,0x57,0x33,0x56,0x3b,0x5a,0xf3,0xb0,0xf6,0x51,0xed,
|
|
0x38,0xed,0x14,0x07,0x76,0x04,0x05,0x6a,0x9e,0xd2,0x7e,0xeb,0x32,0x49,0x3b,0x55,
|
|
0x3b,0x43,0x3b,0x47,0x3b,0x5f,0xbb,0x50,0xfb,0x8a,0x36,0x41,0x9b,0xa4,0x4d,0xd3,
|
|
0xfe,0x55,0x6f,0xd0,0x32,0xb4,0x59,0xda,0xd5,0x5a,0xa2,0x3f,0xf2,0x7e,0xd9,0x34,
|
|
0x46,0x6f,0x7e,0xcb,0xcc,0x6e,0xdf,0xfc,0xa6,0x99,0xdd,0xbe,0xf9,0x6d,0x33,0xbb,
|
|
0x6d,0x7a,0xe3,0x6c,0xaa,0xbb,0x5e,0x9b,0xad,0xcd,0xd3,0x46,0xd2,0x26,0x6d,0x91,
|
|
0x76,0x1b,0xce,0xe9,0x4e,0xed,0x6e,0x6d,0x85,0x76,0xbf,0xb6,0x56,0xdb,0xa8,0x7d,
|
|
0x5d,0xfb,0xeb,0xf7,0x87,0x43,0xda,0x37,0xb4,0xc7,0xb5,0xa7,0xb4,0xef,0x6a,0xcf,
|
|
0x68,0x3f,0xd2,0xf6,0x69,0x3f,0xd5,0x5e,0xd1,0x7e,0xa3,0xfd,0x41,0x6b,0x19,0xcc,
|
|
0x0f,0xb6,0x0d,0x16,0x05,0x3b,0x05,0x0f,0x0f,0x76,0x0f,0x56,0x04,0x7b,0x07,0x07,
|
|
0x04,0x07,0x07,0x87,0x07,0xc7,0x04,0xc7,0x07,0xdf,0x15,0x7c,0x5f,0xf0,0x83,0xc1,
|
|
0x8f,0x06,0xff,0x23,0x78,0x42,0xf0,0x94,0xe0,0x19,0xc1,0x73,0x83,0x5f,0x08,0x7e,
|
|
0x39,0x38,0x21,0x38,0x39,0x78,0x49,0xf0,0x7f,0xfa,0xf7,0xa9,0x7f,0xed,0x3b,0xd0,
|
|
0xcc,0xe0,0xd5,0xc1,0x1b,0x82,0xf3,0x82,0x37,0x07,0x17,0x07,0xef,0x0a,0x2e,0x0f,
|
|
0xde,0x1f,0x5c,0x17,0xdc,0x1c,0x7c,0x30,0xf8,0x48,0x70,0x7b,0xf0,0xc9,0xe0,0x77,
|
|
0x82,0x3f,0x0c,0xbe,0x10,0xdc,0x1b,0xfc,0x49,0xf0,0x17,0xc1,0x57,0x83,0xbf,0x0f,
|
|
0xb6,0x08,0x19,0x14,0x62,0x13,0x32,0x34,0xc4,0x31,0x64,0x58,0x88,0x2c,0xc4,0x33,
|
|
0x44,0x1d,0xe2,0x1f,0xa2,0x0d,0x09,0x0b,0x89,0x0e,0xf9,0xb3,0xbf,0xa5,0xf8,0xab,
|
|
0xda,0xfb,0xe9,0xdd,0x39,0x2e,0xe4,0xce,0x90,0x7b,0x43,0x1e,0x08,0x79,0x24,0x64,
|
|
0x5c,0xc8,0xd3,0x21,0xcf,0x84,0x4c,0x0f,0x99,0x13,0xf2,0x3c,0x7a,0xf3,0x52,0xc8,
|
|
0x6b,0x21,0x49,0x21,0xe9,0x21,0xcb,0x43,0x56,0x85,0xac,0x0f,0xc9,0x0d,0x29,0x0c,
|
|
0xd9,0x16,0x52,0x12,0xb2,0x27,0x64,0x5f,0x48,0x6d,0x48,0x13,0x8e,0x1f,0x08,0x69,
|
|
0x0b,0x39,0x16,0xd2,0x19,0xf2,0x76,0xc8,0x07,0x21,0xe7,0xb1,0xdd,0x13,0xf2,0x71,
|
|
0x48,0xff,0xaf,0x7e,0x1f,0xfc,0xdb,0x8e,0xf7,0xff,0xe8,0x37,0xf6,0x3e,0x0f,0xf9,
|
|
0x32,0xe4,0x79,0xba,0x1a,0x92,0x60,0xd1,0x6f,0xfc,0x2e,0xe4,0x87,0x10,0x8b,0x50,
|
|
0xab,0x50,0xf6,0x6f,0xe0,0xf9,0xa1,0x36,0xa1,0xf6,0xa1,0xa2,0xd0,0xd9,0x1e,0x0e,
|
|
0xa1,0x45,0x16,0xce,0xa1,0x5f,0xd1,0xb0,0xd0,0x11,0xa1,0xee,0xa1,0xf2,0x50,0xaf,
|
|
0xd0,0x20,0x0f,0x75,0xa8,0x7f,0xa8,0x26,0x34,0x24,0x34,0x22,0x34,0x3a,0xb4,0x98,
|
|
0xe2,0x42,0x6f,0x0f,0x1d,0x49,0x77,0x85,0x8e,0x0a,0x15,0x0d,0xbd,0x3f,0xf4,0x80,
|
|
0xc5,0xd8,0xd0,0x47,0x42,0x1f,0x0f,0x7d,0x32,0xf4,0xb8,0xc5,0xd3,0xa1,0xfd,0xc6,
|
|
0xc9,0xa1,0x53,0x43,0xa7,0x87,0xce,0x0a,0x9d,0x1b,0x3a,0x3f,0x74,0x41,0xe8,0x4b,
|
|
0xa1,0xaf,0x85,0xde,0xf0,0x50,0x52,0x68,0x7a,0xe8,0xf2,0xd0,0x55,0xa1,0xeb,0x43,
|
|
0x73,0x43,0x0b,0x43,0xb7,0x85,0x96,0x84,0xee,0x09,0xdd,0x17,0x5a,0x1b,0xda,0x14,
|
|
0x7a,0x20,0xb4,0x2d,0xf4,0x58,0x68,0x67,0xe8,0xdb,0xa1,0x1f,0x84,0x9e,0x0f,0xed,
|
|
0x09,0xfd,0x38,0xf4,0xf3,0xd0,0xaf,0x43,0xaf,0x85,0x92,0xce,0x5a,0x37,0x44,0x27,
|
|
0xd4,0x39,0xe8,0x5c,0x74,0x6e,0x3a,0xb9,0x4e,0xa5,0xf3,0xd3,0x69,0x74,0x3a,0x5d,
|
|
0x94,0x2e,0x56,0x77,0x87,0x6e,0x94,0xee,0x7e,0xdd,0xc3,0xba,0x27,0x74,0x4f,0xe9,
|
|
0x26,0xeb,0xa6,0xe9,0x66,0xeb,0xe6,0xeb,0x5e,0xd4,0xbd,0xaa,0xfb,0xfd,0xdf,0xc0,
|
|
0x27,0xea,0xd2,0x74,0xcb,0x74,0x2b,0x75,0xeb,0x74,0x39,0xba,0x4d,0xba,0xad,0xba,
|
|
0x9d,0xba,0x32,0xdd,0x5e,0x5d,0x8d,0xae,0x51,0xd7,0xa2,0x3b,0xac,0x7b,0x53,0x77,
|
|
0x42,0xf7,0x96,0xee,0x7d,0xdd,0x39,0x5d,0xb7,0xee,0x92,0xee,0xf7,0x8c,0xa8,0x3f,
|
|
0x3a,0xbf,0xf8,0x4c,0xf7,0x95,0xee,0x3b,0x9d,0x51,0x67,0x15,0x36,0x38,0xcc,0x3e,
|
|
0x4c,0x12,0x26,0x0d,0x1b,0x11,0xe6,0x11,0xa6,0x0c,0xf3,0x0d,0x0b,0x0a,0x0b,0x0d,
|
|
0x8b,0x0c,0x33,0x84,0xdd,0x1e,0x76,0x4f,0xd8,0x98,0xb0,0x87,0xc2,0x1e,0x0f,0x1b,
|
|
0x1f,0x36,0x29,0xec,0xd9,0xb0,0x59,0x61,0xf3,0xc2,0x16,0x86,0x2d,0x0a,0x5b,0x1c,
|
|
0x96,0x1a,0x96,0x11,0xb6,0x22,0x6c,0x6d,0x58,0x76,0x58,0x41,0xd8,0x96,0xb0,0x1d,
|
|
0x61,0xbb,0xc3,0x2a,0xc3,0xaa,0xc3,0x1a,0xc2,0x5e,0x0f,0x6b,0x0d,0x3b,0x1a,0xd6,
|
|
0x11,0x76,0x3a,0xec,0xbd,0xb0,0xb3,0x61,0x5d,0x61,0x17,0xc3,0x2e,0x87,0x7d,0x19,
|
|
0xf6,0x6d,0x58,0x7f,0x18,0x2f,0x5c,0x10,0x6e,0x17,0x2e,0x0e,0x77,0x0e,0x77,0x0d,
|
|
0x1f,0x19,0xee,0x15,0xee,0x13,0xfe,0x3f,0xf7,0x97,0x1c,0xa6,0x10,0x18,0x1e,0x12,
|
|
0x1e,0x11,0xae,0x0f,0xbf,0x2d,0xfc,0xee,0xf0,0xd1,0xe1,0x63,0xc3,0x1f,0x0b,0x7f,
|
|
0x32,0x7c,0x62,0xf8,0xd4,0xf0,0x99,0xe1,0xcf,0x85,0x2f,0x08,0x7f,0x25,0x9c,0x09,
|
|
0x4f,0x09,0x5f,0x1a,0x9e,0x15,0xbe,0x26,0x7c,0x63,0x78,0x7e,0x78,0x51,0xf8,0xf6,
|
|
0xf0,0x5f,0x3b,0x47,0xbf,0x3e,0x3e,0x6e,0xde,0xff,0xf3,0xdf,0x3e,0xfd,0x73,0xfe,
|
|
0xfe,0xeb,0xd6,0x7f,0xd3,0xf0,0x7b,0x7e,0x17,0xed,0xe7,0xf3,0x87,0x1f,0xff,0xc6,
|
|
0xee,0xef,0xff,0x94,0x86,0xef,0x0f,0x6f,0x0a,0x3f,0x1a,0xfe,0x4e,0x78,0x77,0xf8,
|
|
0x95,0xf0,0xdf,0xf6,0xf7,0x2c,0xbf,0xfc,0x57,0x2d,0xff,0xc9,0x0f,0x45,0x0c,0x8e,
|
|
0x10,0x47,0xc8,0x22,0x7c,0x23,0xc2,0x23,0xfe,0xfa,0xdf,0x02,0xfa,0x57,0xe1,0x3f,
|
|
0xf5,0x3b,0x89,0x7f,0xbc,0x4e,0xbf,0xf1,0x7f,0x97,0x6d,0xfd,0x46,0xb6,0x0e,0xeb,
|
|
0x43,0x3b,0x2e,0x66,0xeb,0xb0,0xe9,0x40,0x1d,0xf6,0x9b,0x87,0x5b,0xeb,0xf4,0x1b,
|
|
0x6d,0xc0,0x8f,0x75,0xfa,0x8d,0xff,0xf3,0xbe,0xee,0x37,0xde,0xf0,0xb5,0xa9,0x3f,
|
|
0x37,0xd7,0xf9,0x69,0x7f,0x7e,0xff,0xd8,0xb9,0x59,0xe7,0x46,0x9d,0x7e,0xe3,0x08,
|
|
0x1a,0xf8,0xc6,0xe6,0xcf,0xd1,0xf9,0xbb,0xce,0xdf,0x75,0xfe,0x53,0x75,0xee,0x88,
|
|
0xb8,0x3b,0x82,0x1d,0xbb,0xbf,0xfe,0xdf,0x62,0x74,0xbc,0x1f,0xff,0xb7,0x98,0x7b,
|
|
0x23,0x7e,0xbd,0xce,0x98,0x9f,0xd4,0xb9,0x3f,0xc2,0x1f,0xe5,0x22,0xb0,0x7d,0x2f,
|
|
0x8e,0xff,0xad,0xf9,0x7f,0x4b,0x73,0x3e,0x02,0x3b,0x96,0x6e,0x35,0x77,0xfa,0xb3,
|
|
0xf7,0xfd,0x7b,0x2b,0xb9,0x5b,0xaf,0xba,0xfb,0x7f,0x56,0xf7,0xc6,0xfc,0xe2,0xe7,
|
|
0xff,0x3f,0xc8,0xf4,0xdf,0x83,0x6e,0xfd,0xbf,0x83,0x46,0x72,0xff,0x35,0x68,0xc4,
|
|
0xc8,0xb7,0xad,0x2a,0x78,0xd5,0xbc,0xcf,0xac,0x36,0x5a,0xed,0xb5,0xba,0x75,0x0b,
|
|
0x6c,0x7d,0xde,0x8f,0xea,0xb2,0xff,0x75,0x68,0x26,0xea,0x95,0xf1,0xde,0xe4,0xad,
|
|
0xb6,0xea,0x70,0xcf,0xb5,0xfa,0x2d,0xf3,0x9f,0x87,0x22,0x1e,0x8f,0x18,0x1f,0x31,
|
|
0x29,0xe2,0xd9,0x88,0x59,0x11,0xf3,0x22,0x16,0x46,0x2c,0x8a,0x58,0x1c,0x91,0x1a,
|
|
0x91,0x11,0xb1,0x22,0x62,0x6d,0x44,0x76,0x44,0x41,0xc4,0x96,0x88,0x1d,0x11,0xbb,
|
|
0x23,0x2a,0x23,0xaa,0x23,0x1a,0x22,0x5e,0x8f,0x68,0x8d,0x38,0x1a,0xd1,0x11,0x71,
|
|
0x3a,0xe2,0xbd,0x88,0xb3,0x11,0x5d,0x11,0x17,0x23,0x2e,0x47,0x7c,0x19,0xf1,0xed,
|
|
0x1f,0x9a,0xc1,0xb1,0xef,0x18,0x2f,0x6b,0xbe,0xd1,0xf4,0x1b,0x83,0xb4,0x16,0xda,
|
|
0x2f,0x34,0x43,0xb5,0xc1,0xdc,0xbb,0x3d,0xf6,0x7d,0x9e,0x95,0xd6,0x49,0xeb,0xaa,
|
|
0x1d,0xa2,0x95,0x69,0xfb,0x35,0x7c,0x2d,0xfb,0xe6,0xf1,0x2b,0xcd,0x35,0x8d,0x9d,
|
|
0x56,0xa2,0x75,0xd1,0xf6,0x47,0x2c,0xf2,0xb1,0x88,0xb4,0x8a,0xec,0x37,0xb2,0xf5,
|
|
0xfb,0x8d,0xfe,0xdc,0xbb,0x9e,0x2f,0xd8,0x77,0xb5,0xb7,0xaa,0x6f,0x1c,0xa8,0x8f,
|
|
0xd9,0x0a,0xb6,0x5c,0x7e,0xf4,0x66,0xe8,0xf2,0xf5,0xb7,0xa5,0xa6,0xfa,0x78,0x02,
|
|
0x03,0x53,0xfd,0x7e,0xe3,0x40,0x7d,0xf6,0xf8,0xcd,0xf5,0x17,0xf9,0xf4,0x1b,0x7f,
|
|
0xae,0x6f,0xb2,0xbf,0xdf,0xf8,0xaf,0xf4,0x4d,0xf6,0xe3,0xb9,0x8e,0xda,0x03,0xfd,
|
|
0x67,0xdf,0x57,0x0e,0xf4,0x9f,0xd5,0xff,0xd5,0xfe,0x5f,0xb7,0xfe,0xe7,0xfe,0xfb,
|
|
0xf7,0xea,0xf3,0x23,0x87,0x44,0xda,0x45,0x0e,0x8d,0x94,0x44,0x3a,0x45,0xba,0x44,
|
|
0xba,0x46,0xca,0x22,0x3d,0x22,0x6f,0x9c,0x9f,0xdf,0xf3,0x77,0x3e,0x8a,0x48,0x6b,
|
|
0x3c,0x21,0x4a,0x65,0x7e,0x91,0xbf,0x6f,0xcd,0x14,0x18,0xb9,0x44,0xa6,0x8d,0x0c,
|
|
0x8d,0x0c,0x8f,0x8c,0x8e,0xfc,0x5d,0x7f,0x9b,0x12,0x19,0x1f,0x79,0x47,0xe4,0x9f,
|
|
0xb3,0x92,0xb8,0x3b,0xf2,0xaf,0x5d,0x85,0xdc,0x1b,0x39,0x36,0x72,0x9a,0xcb,0x2f,
|
|
0x1f,0x1f,0x22,0x7e,0x22,0x72,0x7c,0xe4,0xc4,0x48,0x2f,0xd1,0x94,0xc8,0xe9,0x91,
|
|
0xee,0x4e,0xb3,0x23,0xe7,0x45,0x2e,0x88,0x2c,0xf1,0x7a,0x39,0xf2,0xb5,0xc8,0xc4,
|
|
0xc8,0xd4,0xc8,0xa5,0x91,0x99,0x91,0xd9,0xe2,0x55,0x91,0xeb,0x22,0xb3,0x23,0xf3,
|
|
0x23,0x37,0x47,0x6e,0x8b,0xb4,0x17,0x91,0xd3,0xce,0xc8,0x02,0xa9,0xad,0x53,0x91,
|
|
0x74,0x77,0xe4,0xcb,0x92,0x8a,0xc8,0xfd,0x91,0xb5,0x91,0x8d,0x91,0xaf,0x47,0x8e,
|
|
0x93,0x6a,0xc4,0x87,0x22,0x8f,0x44,0x1e,0x8b,0x3c,0x11,0x39,0xd0,0xfe,0xe9,0xc8,
|
|
0xb3,0x91,0x17,0x23,0xbf,0x8c,0xec,0x8f,0x14,0x44,0x89,0xa3,0x5c,0xa3,0xbc,0xa2,
|
|
0x7e,0xac,0x1f,0x18,0x15,0x1c,0xf5,0x5b,0xd7,0xcf,0x7f,0xf5,0xfa,0xfb,0xf7,0x7c,
|
|
0x6e,0x7d,0xcf,0xbf,0xa1,0x1f,0x16,0x15,0x15,0x65,0x88,0xba,0x2d,0xea,0xee,0x28,
|
|
0x99,0xea,0xbe,0xa8,0x07,0xa2,0x1e,0x8e,0x7a,0x3c,0x4a,0xae,0x7a,0x32,0x6a,0x42,
|
|
0xd4,0x33,0x51,0x4a,0xd5,0xf4,0xa8,0xd9,0x51,0xf3,0xa2,0x16,0x44,0xbd,0x12,0x95,
|
|
0x10,0x95,0x18,0x99,0x14,0x95,0x1e,0xb5,0x2c,0x6a,0x45,0xd4,0x9a,0x28,0x2b,0xf5,
|
|
0x86,0xa8,0xd1,0xa2,0xbc,0xa8,0xc2,0xa8,0xad,0x51,0x3b,0xa2,0x8e,0x44,0x96,0x46,
|
|
0x95,0x47,0x49,0xd5,0xec,0x6f,0x79,0xb8,0xaa,0xf7,0x45,0xd5,0x44,0x8d,0x55,0x34,
|
|
0x44,0x69,0x55,0xff,0x8c,0x3a,0x18,0xd5,0x16,0xf5,0x26,0x17,0x3a,0xa2,0x4e,0x47,
|
|
0xbd,0x1b,0xf5,0x61,0xd4,0xf9,0xa8,0x9e,0xa8,0x4b,0x51,0x97,0xa3,0xae,0x44,0x5d,
|
|
0x8d,0xba,0x16,0x65,0x8c,0xe2,0x45,0xf3,0xa3,0x6d,0xa2,0x85,0xd1,0x92,0x68,0x67,
|
|
0x04,0x4f,0xf5,0xf0,0x68,0x59,0xb4,0x3c,0x5a,0x19,0x1d,0xa9,0xf2,0x89,0x0e,0x88,
|
|
0xd6,0x46,0xe7,0x28,0x75,0xd1,0x91,0xd1,0xfa,0xe8,0xf8,0xe8,0x3b,0xa3,0x47,0x45,
|
|
0x8f,0x89,0x1e,0x1b,0xfd,0x68,0xf4,0x3f,0xa2,0x9f,0x8e,0x9e,0x1c,0x3d,0x25,0xf2,
|
|
0xd9,0xe8,0x99,0xd1,0x73,0xa3,0x5f,0x88,0x7e,0x39,0xfa,0xb5,0xe8,0xc4,0xe8,0xd4,
|
|
0xe8,0xa5,0xd1,0x99,0xd1,0xab,0xa2,0xd7,0x45,0x67,0x23,0xe4,0x47,0x17,0x45,0x17,
|
|
0x47,0xc7,0x2b,0x4a,0xa2,0xcb,0xa2,0xf7,0x46,0x57,0x47,0xd7,0x47,0xef,0x17,0x35,
|
|
0x47,0x1f,0x88,0x6e,0x14,0x1d,0x8e,0x3e,0x1a,0x7d,0x3c,0xfa,0x54,0xf4,0x3b,0xd1,
|
|
0x1f,0x46,0x9f,0x8f,0xee,0x8e,0xbe,0x18,0xfd,0x69,0xf4,0x17,0xd1,0x5f,0x47,0x7f,
|
|
0x17,0xdd,0x1f,0x6d,0x19,0x33,0x28,0x66,0x48,0x8c,0x30,0x46,0x12,0xe3,0x1c,0x33,
|
|
0x3c,0x66,0xbe,0xa7,0x2c,0xa6,0x5b,0xe4,0x19,0xe3,0x19,0xa3,0x8e,0xf1,0x43,0x08,
|
|
0x8a,0x09,0x89,0x89,0x88,0xd1,0xc7,0xc4,0xc7,0xdc,0x19,0x33,0x2a,0x66,0x4c,0xcc,
|
|
0xd8,0x98,0x47,0x63,0xc6,0xc5,0x3c,0x15,0x33,0x29,0x66,0x8c,0x6a,0x6a,0xcc,0xcc,
|
|
0x98,0xb9,0x31,0xcf,0xc7,0x3c,0xa4,0x7e,0x3e,0xe6,0xc5,0x98,0x47,0x55,0x8b,0x62,
|
|
0x98,0x98,0xe4,0x98,0xf4,0x98,0x71,0x2a,0xbe,0xe7,0xb2,0x98,0x15,0x31,0x6b,0x62,
|
|
0x36,0xc4,0xe4,0xc6,0x6c,0x8a,0xd9,0x12,0xb3,0x23,0xa6,0x34,0xa6,0x3c,0x66,0x5f,
|
|
0x4c,0x4d,0x4c,0x43,0xcc,0xeb,0x31,0x87,0x62,0x8e,0xc4,0x1c,0x8b,0x39,0x11,0x73,
|
|
0x3a,0xe6,0xdd,0x98,0x0f,0x63,0xce,0xc7,0x3c,0xa5,0xea,0x8e,0xb9,0x18,0x73,0x39,
|
|
0xe6,0x4a,0xcc,0xd5,0x98,0x6b,0x31,0x53,0x55,0xc6,0x18,0x9e,0x9e,0xaf,0xb7,0xd1,
|
|
0x0b,0xf5,0x12,0xbd,0xb3,0x7e,0xb8,0x9e,0xfd,0x5d,0x14,0x99,0x5e,0xae,0x57,0xea,
|
|
0x7d,0xf4,0x81,0xfa,0x60,0x7d,0x98,0x3e,0x4a,0x3f,0x43,0x65,0xd0,0xdf,0xae,0xbf,
|
|
0x5b,0x7f,0x9f,0x5e,0xe6,0xfd,0x80,0xfe,0x61,0xfd,0xe3,0xfa,0x27,0xf5,0x13,0xf4,
|
|
0x53,0xf4,0xd3,0xf5,0xb3,0xf5,0xf3,0xf4,0x0b,0xf5,0xaf,0xe8,0x13,0xf4,0x49,0xfa,
|
|
0x34,0x45,0x9a,0x3e,0x43,0xbf,0x42,0xbf,0x56,0x9f,0xad,0xcf,0xd7,0x17,0xe9,0x8b,
|
|
0xf5,0x25,0xfa,0x32,0x7d,0xa5,0x7e,0x8e,0xaa,0xd3,0xab,0x4a,0x5f,0xa7,0x6f,0xd2,
|
|
0xb7,0xe8,0x0f,0xeb,0x8f,0xea,0x8f,0xeb,0x4f,0xea,0x19,0xf5,0xdb,0xfa,0xf7,0xf5,
|
|
0xe7,0xf4,0x5d,0xfa,0x3e,0xfd,0xa7,0xfa,0x2b,0xfa,0xab,0xfa,0x64,0xf5,0x35,0xbd,
|
|
0x51,0xcf,0x33,0xf0,0x0d,0x36,0x06,0xa1,0x41,0x62,0x90,0x1a,0x5c,0x0d,0x23,0x0d,
|
|
0x0a,0x83,0xb7,0x61,0x99,0xda,0xdf,0xa0,0x31,0xe8,0x0c,0x91,0x06,0xbd,0xe1,0x36,
|
|
0xc3,0xdd,0x86,0xfb,0x0c,0x0f,0x18,0x1e,0x36,0x3c,0x8e,0xf0,0xa4,0x61,0x82,0x61,
|
|
0x8d,0xfa,0x19,0xc3,0x34,0xc3,0x2c,0xc3,0x73,0x86,0x17,0x0c,0x2f,0x1b,0x5e,0x33,
|
|
0x8c,0x51,0x24,0x19,0xd2,0x0d,0xcb,0x0c,0x2b,0x0d,0xeb,0x0c,0x39,0x86,0x02,0xc3,
|
|
0x2e,0x75,0x91,0x61,0xbb,0xa1,0xd4,0x50,0x61,0xa8,0x32,0xd4,0x21,0xec,0x51,0x2b,
|
|
0xbd,0x9b,0x0c,0x2d,0x86,0x56,0xc3,0x1b,0x86,0xe3,0x86,0x3a,0xcf,0x6a,0xf5,0x49,
|
|
0xc3,0xdb,0x86,0xf5,0xaa,0x0f,0x0c,0xe7,0x0d,0x97,0x94,0x3d,0x86,0x4b,0x86,0x22,
|
|
0xd5,0x65,0xc3,0x15,0xc3,0x55,0xc3,0xf7,0x08,0x16,0xb1,0xd6,0xb1,0x83,0x63,0xed,
|
|
0x63,0xc5,0xb1,0x4e,0xb1,0xc3,0x62,0x65,0xb1,0xf2,0x58,0x65,0xac,0x4f,0x6c,0x40,
|
|
0xac,0x36,0x36,0x2c,0x36,0x2a,0xd6,0x10,0x7b,0x5b,0xec,0x5d,0xb1,0xf7,0xc6,0xde,
|
|
0x1f,0xfb,0x70,0xec,0x13,0xb1,0xe3,0x63,0x27,0xc5,0x4e,0x8d,0x9d,0x19,0x3b,0x37,
|
|
0xb6,0x4e,0xf5,0x7c,0xec,0x4b,0xb1,0xaf,0xc5,0x26,0xc6,0xa6,0xc5,0x66,0xc4,0xae,
|
|
0x88,0x5d,0x13,0xbb,0x21,0x36,0x37,0x76,0x53,0xec,0x96,0xd8,0xed,0xb1,0xa5,0xb1,
|
|
0x15,0xb1,0x55,0xb1,0xea,0x98,0xfa,0xd8,0xe6,0xd8,0x03,0xb1,0x87,0x63,0x8f,0xc6,
|
|
0x1e,0x8f,0x3d,0x19,0xfb,0x76,0xec,0xfb,0xb1,0x67,0x63,0x3f,0x8a,0xed,0x8d,0x5d,
|
|
0xad,0xf8,0x24,0xf6,0xf3,0xd8,0xaf,0x62,0xbf,0x8d,0xfd,0x21,0xd6,0x22,0xae,0x55,
|
|
0x65,0x1d,0x37,0x38,0xce,0x2e,0x4e,0x14,0xe7,0x18,0x37,0x2c,0x4e,0x16,0xe7,0x19,
|
|
0xa7,0x8a,0xf3,0x8d,0x0b,0x8c,0x0b,0x8e,0x0b,0x8f,0x8b,0x8e,0x8b,0x8b,0xbb,0x23,
|
|
0xee,0x9e,0xb8,0x31,0x71,0x0f,0xc5,0x3d,0x16,0x57,0xec,0xf9,0x8f,0xb8,0xa7,0xe3,
|
|
0x26,0xc7,0x3d,0x1b,0x37,0x33,0x6e,0x6e,0xdc,0x49,0xf5,0xf3,0x71,0x2f,0xc6,0x2d,
|
|
0x8a,0x63,0xe2,0x92,0xe3,0xd2,0xe3,0x96,0xc5,0xad,0x88,0x1b,0x2d,0x59,0x13,0xb7,
|
|
0x31,0x2e,0x2f,0xae,0x30,0x6e,0x6b,0xdc,0x8e,0xb8,0xd2,0xb8,0x8a,0xb8,0xaa,0xb8,
|
|
0xba,0xb8,0xa6,0xb8,0x5e,0xf5,0xc7,0xea,0xe9,0x92,0x96,0xb8,0xc3,0x71,0x47,0xe3,
|
|
0x8e,0xc7,0x9d,0x8c,0x7b,0x3b,0xee,0x83,0xb8,0xf3,0x71,0xdd,0x71,0x17,0xe3,0x3e,
|
|
0x8d,0xbb,0x12,0xf7,0x99,0xfa,0x6a,0xdc,0xf7,0x71,0x16,0xf1,0xd6,0xf1,0x83,0xe3,
|
|
0xed,0xe2,0xc5,0xf1,0x4e,0xf1,0xc3,0xe2,0xdd,0xe2,0x3d,0xe2,0xbd,0xe2,0xbd,0xe3,
|
|
0xfd,0xe3,0xb5,0xf1,0xba,0xf8,0xc8,0x78,0x7d,0xfc,0x6d,0xf1,0x77,0xc5,0xdf,0x1b,
|
|
0x7f,0x7f,0xfc,0x43,0xf1,0x8f,0xc7,0x8f,0x8f,0x9f,0x18,0x3f,0x25,0x7e,0x7a,0xfc,
|
|
0x9c,0xf8,0xf9,0xf1,0x02,0x6f,0x81,0xf7,0x8b,0xf1,0x8b,0xe2,0x17,0xc7,0xa7,0xc4,
|
|
0x2f,0x89,0x5f,0x1e,0xbf,0x32,0x7e,0x6d,0xfc,0xc6,0xf8,0xbc,0x78,0x5b,0xef,0xcd,
|
|
0xf1,0xdb,0xe2,0x77,0xc6,0xef,0x8e,0xaf,0x88,0xdf,0x1f,0x5f,0x17,0xdf,0x14,0x7f,
|
|
0x20,0xbe,0x2d,0xde,0xdb,0xe1,0x58,0x7c,0x84,0xc3,0x89,0xf8,0xd3,0xf1,0xef,0xc6,
|
|
0x7f,0x18,0x3f,0xda,0xe1,0x7c,0xfc,0x9f,0xf1,0xfb,0x47,0x3f,0x7a,0x1b,0xc7,0xe6,
|
|
0xd2,0x64,0xd4,0x6c,0x34,0x5e,0x36,0xef,0x39,0xc3,0xc5,0x7a,0xf3,0x56,0xcf,0xcd,
|
|
0x77,0x36,0x1e,0xfd,0x68,0xaf,0xde,0x98,0x80,0x78,0x8c,0x91,0xfb,0xbf,0x42,0xcc,
|
|
0xf5,0x52,0xd7,0xd8,0xff,0x20,0x50,0xf0,0xad,0xd1,0xf8,0xc3,0xc1,0x2b,0x9f,0x36,
|
|
0x61,0xeb,0x87,0x4f,0xae,0x34,0x45,0x5a,0x50,0xbb,0x91,0xd7,0xff,0x29,0xb7,0xff,
|
|
0x93,0x2b,0x1f,0xb7,0x46,0x9f,0x96,0xb6,0x1a,0x5b,0x5a,0xa3,0x17,0xb3,0xda,0x7c,
|
|
0xe3,0x99,0x1f,0xb0,0xdf,0x78,0xe5,0x4c,0xf4,0xd3,0xba,0x76,0xb6,0x2d,0x6e,0xfb,
|
|
0x32,0xbb,0x3d,0xb7,0xdd,0x68,0x4f,0xdc,0x36,0x6b,0xdc,0x0f,0x9f,0x19,0xdb,0x91,
|
|
0x7e,0x6a,0x4c,0xf8,0x1e,0x4a,0x01,0x09,0xc9,0x4f,0x19,0x9b,0x8d,0xae,0xac,0x5d,
|
|
0x42,0xae,0x5f,0x67,0x8c,0x7c,0x2e,0x8d,0x4e,0x88,0xe6,0x2a,0x70,0x31,0xbb,0x91,
|
|
0x60,0xb6,0x2e,0xda,0x78,0x53,0x1f,0x64,0x6c,0xa7,0xcc,0x33,0x69,0xd9,0xcd,0xaf,
|
|
0x5d,0xd1,0x39,0x18,0x91,0x40,0x6c,0xb3,0xc6,0x33,0xec,0xff,0x85,0x41,0x6f,0x79,
|
|
0xa6,0xb2,0xc6,0xeb,0xff,0x47,0x49,0xcf,0xee,0x4f,0x30,0x0a,0x8d,0xc2,0xcf,0xb9,
|
|
0x4d,0x99,0xc9,0x3f,0x42,0xae,0xd5,0x56,0x73,0xa1,0x76,0x73,0xca,0x1a,0x50,0xc0,
|
|
0xb5,0xa1,0x37,0x7b,0x4f,0xc8,0xd9,0x7b,0xd3,0x47,0xf8,0x99,0x39,0xf3,0x8d,0xf1,
|
|
0xc2,0x4d,0xe7,0x07,0x8a,0x26,0xcf,0x9b,0xfe,0xcb,0x34,0x4e,0x03,0xdd,0xdc,0x74,
|
|
0x93,0x3b,0xd7,0x3c,0x25,0x98,0x3f,0xd7,0x8d,0xe3,0xde,0x51,0xdf,0xf8,0x70,0xd6,
|
|
0x9a,0x7b,0x99,0x70,0xf3,0xfb,0x58,0xe1,0xf5,0xf1,0x60,0x4a,0x65,0x46,0x9e,0xbe,
|
|
0xd9,0xdc,0x57,0xa3,0x90,0xe1,0xf6,0x34,0x19,0x5b,0xcc,0x7d,0x30,0xd5,0xd6,0x1b,
|
|
0xaf,0x98,0xfe,0x83,0x00,0x7d,0xc3,0x6e,0xbf,0xf6,0xda,0x6b,0x74,0x43,0xd9,0x54,
|
|
0x57,0xc8,0xfe,0xa7,0xe5,0x6f,0x06,0x14,0xcc,0x6f,0x81,0x2f,0x73,0x8d,0x54,0xa1,
|
|
0x8c,0xfe,0xa6,0x71,0xc8,0x4f,0xe3,0x92,0x2c,0xf6,0xa0,0xcc,0xe2,0xc6,0xfb,0x62,
|
|
0xfd,0x0d,0x8b,0xb9,0xbe,0x73,0x7f,0x01,0x2c,0x3c,0x7b,0xfd,0x1c,0xb0,0x71,0x93,
|
|
0xc9,0xe5,0xfa,0x1b,0xb5,0xe8,0x46,0xc7,0xb8,0x5e,0x63,0xbf,0x9e,0x1b,0x3e,0x4d,
|
|
0x2b,0xcd,0xc5,0xb9,0x4e,0x30,0xc6,0x81,0x37,0xd3,0xba,0x6f,0x4c,0xe2,0xc6,0x24,
|
|
0x93,0x77,0xaf,0xdb,0x85,0xf3,0xf1,0x3d,0x97,0x99,0xf3,0xd9,0x65,0xb8,0x52,0x9f,
|
|
0x86,0x91,0x61,0x71,0xf3,0x1b,0x6e,0xae,0xa1,0x6f,0x06,0xbc,0xa9,0xef,0x37,0x99,
|
|
0xcc,0x9a,0xc5,0x73,0xa3,0x7e,0x1c,0xb7,0xb8,0xf9,0xed,0x37,0xff,0x7b,0xb3,0x7d,
|
|
0xf0,0xef,0x8f,0xde,0x8c,0x9b,0x3c,0x17,0xc9,0xa3,0xef,0x4d,0x35,0xbe,0xbf,0x7e,
|
|
0x96,0x07,0xac,0xe1,0xce,0x11,0xeb,0x77,0xf6,0x90,0x7e,0xe0,0x62,0x3b,0xc3,0x27,
|
|
0x6e,0xb4,0xf2,0xae,0x5f,0xba,0x74,0xe3,0xec,0xb2,0xef,0x37,0x4d,0x57,0xa3,0xb9,
|
|
0x19,0x7c,0x12,0x1a,0xe0,0x80,0x81,0xff,0x47,0xc4,0x37,0xf2,0x4c,0xd7,0xe9,0x27,
|
|
0xd7,0x0a,0xc2,0x17,0x9f,0x6d,0x97,0xa1,0xfc,0x28,0xce,0x4f,0xc6,0xad,0x57,0x9b,
|
|
0x2c,0x06,0x99,0x94,0x2f,0xb3,0x75,0x59,0x9b,0x6f,0xf4,0x43,0xcf,0xb6,0xcc,0x43,
|
|
0x34,0xe0,0x27,0xee,0xca,0x10,0x9a,0x8e,0xf7,0xb0,0x67,0x29,0xe1,0xc7,0x6f,0xfd,
|
|
0xcd,0x7f,0xb9,0xcd,0x67,0x12,0xbe,0x98,0xc3,0xb6,0xff,0x6d,0x02,0x5d,0x37,0x89,
|
|
0xcc,0x2e,0xfe,0x5e,0x66,0xd2,0x31,0xde,0xf8,0xef,0x14,0x37,0x19,0xce,0x1d,0x33,
|
|
0xb5,0xc7,0x63,0xb5,0x7f,0x30,0x5d,0x52,0x37,0xc6,0x34,0x1a,0xe9,0xc7,0x35,0xc0,
|
|
0x75,0x37,0x61,0x2f,0x6b,0x6f,0x13,0x5b,0x26,0xe1,0xda,0x80,0x77,0x84,0x03,0x6d,
|
|
0x99,0xae,0x6f,0xae,0x81,0x56,0xd3,0x10,0x1e,0xf8,0x98,0xaf,0x2f,0x23,0xcf,0xe4,
|
|
0xdf,0x04,0x19,0x09,0x6f,0xf9,0xfd,0x05,0x9f,0x06,0x46,0x80,0xf9,0xaa,0x32,0x19,
|
|
0xd3,0x72,0xbd,0x40,0x02,0xa7,0xa9,0xd7,0x63,0x1e,0x68,0xbc,0x06,0x93,0xce,0x1a,
|
|
0xaf,0x8f,0x35,0x53,0x8b,0xc6,0x34,0x73,0x49,0xe6,0xc6,0x37,0x25,0x32,0x4a,0x20,
|
|
0xf3,0x65,0xcb,0x18,0x6f,0xb8,0x10,0x9f,0xcb,0x73,0x4c,0xaa,0x56,0xc8,0x2b,0xe9,
|
|
0xb3,0xeb,0x57,0xcd,0xc0,0xb5,0x21,0xfc,0xde,0x74,0x7d,0x58,0xd0,0xcd,0xf7,0xee,
|
|
0x84,0x7e,0x73,0x6b,0x66,0x5d,0xf3,0x15,0x69,0xea,0xbf,0x90,0xbe,0xe9,0x37,0xfd,
|
|
0xaf,0xe7,0x84,0xb3,0xac,0x07,0x98,0x9b,0x7a,0x29,0x43,0x0b,0x2d,0x37,0x8f,0xce,
|
|
0xeb,0xbd,0x4f,0xa2,0x1f,0xdf,0x81,0xd2,0x4c,0x63,0xd7,0x34,0x9a,0x13,0xe6,0x18,
|
|
0x13,0x0a,0xcc,0x66,0xc3,0xdb,0x2d,0x37,0xff,0x9f,0x16,0xd3,0x47,0x36,0x90,0x33,
|
|
0x9b,0xc5,0x33,0xd9,0x94,0x30,0x30,0x2f,0x37,0xed,0x6e,0x36,0x95,0xf9,0x1c,0x76,
|
|
0x98,0xee,0xcf,0x42,0x0b,0x1a,0x18,0x41,0xec,0x79,0xbd,0x7e,0x8d,0xe3,0x0e,0xca,
|
|
0x33,0x5f,0x61,0xdc,0x1e,0x0c,0xcb,0x81,0xbb,0x6e,0xc2,0x39,0xdc,0x6b,0xd9,0xab,
|
|
0xd5,0x78,0xf5,0xfa,0xed,0xef,0xc6,0x77,0x6a,0x37,0xee,0xe1,0x34,0x81,0x26,0xd2,
|
|
0x24,0x9a,0x4c,0xcf,0xd0,0x14,0x9a,0x4a,0xcf,0xd2,0x34,0x9a,0x4e,0x33,0x68,0x26,
|
|
0xcd,0xa2,0xd9,0x34,0x87,0xe6,0xd2,0x73,0x34,0x8f,0xe6,0xd3,0xf3,0xf4,0x02,0x2d,
|
|
0xa0,0x85,0xf4,0x22,0xbd,0x44,0x2f,0x93,0x3b,0xb9,0x1f,0x4d,0x07,0xc9,0xa4,0xc1,
|
|
0xd2,0xd1,0xfd,0xe8,0x62,0x3a,0x56,0x8f,0xa4,0x18,0x2b,0xc9,0xa0,0xf3,0x8b,0x93,
|
|
0x83,0xb9,0x18,0x87,0xb8,0x7c,0xcb,0x26,0x6a,0x29,0xa4,0x96,0xcd,0xd4,0x52,0x44,
|
|
0x2d,0x5b,0xa8,0x65,0x2b,0xb5,0x6c,0xa3,0x96,0x62,0x6a,0xd9,0x4e,0x2d,0x3b,0xa8,
|
|
0x65,0x27,0xb5,0x94,0x50,0xcb,0x2e,0x6a,0x29,0xa5,0x96,0xdd,0xd4,0x52,0x46,0x2d,
|
|
0x7b,0xa8,0xa5,0x9c,0x5a,0x2a,0xa8,0xa5,0x92,0x5a,0xf6,0x52,0xcb,0x3e,0x6a,0xd9,
|
|
0x4f,0x2d,0xd5,0xd4,0x52,0x43,0x2d,0xb5,0xd4,0x52,0x47,0x2d,0xf5,0xd4,0xd2,0x40,
|
|
0x2d,0x8d,0x74,0x60,0x31,0x1d,0x48,0xa2,0x03,0x29,0x74,0x20,0x8d,0x0e,0x2c,0xa1,
|
|
0x03,0x19,0x74,0x60,0x39,0x1d,0xc8,0xa2,0x03,0x2b,0xe9,0xc0,0x6a,0x3a,0xb0,0x96,
|
|
0x0e,0xac,0xa7,0x03,0x1b,0xe9,0x40,0x0e,0x1d,0xc8,0xa3,0x03,0x05,0x74,0xa0,0x90,
|
|
0x0e,0x14,0xd1,0x81,0xad,0x74,0xa0,0x98,0x0e,0xec,0xa0,0x03,0x25,0x74,0xa0,0x94,
|
|
0x0e,0x94,0xd1,0xb4,0xa3,0x69,0x34,0x6d,0x3a,0x1d,0xd8,0x47,0x07,0xaa,0xe8,0x40,
|
|
0x2d,0x1d,0xa8,0xa7,0x03,0x8d,0x34,0xf3,0xf5,0x2a,0x3a,0x98,0x48,0x07,0x93,0xe9,
|
|
0x60,0x2a,0x1d,0x4c,0xa7,0x23,0xf5,0xb3,0xe9,0x60,0x06,0x1d,0x5c,0x4e,0x07,0xb3,
|
|
0xe8,0xe0,0x4a,0x3a,0xb8,0x9a,0x0e,0xae,0xa5,0x83,0xeb,0xe9,0xe0,0x46,0x3a,0x98,
|
|
0x43,0x07,0xf3,0xe8,0x60,0x01,0x1d,0x2c,0xa4,0x83,0x45,0x74,0x70,0x2b,0x1d,0x2c,
|
|
0xa6,0x83,0x3b,0xe8,0x60,0x09,0x1d,0x2c,0xa5,0x83,0x65,0x74,0xb0,0x9c,0x0e,0x56,
|
|
0xd2,0xc1,0x7d,0x74,0xb0,0x8a,0x5a,0x9a,0xe8,0x60,0x2d,0x1d,0xac,0xa7,0x83,0x8d,
|
|
0xd4,0xb6,0x9a,0x0e,0x25,0xd1,0xa1,0x14,0x6a,0x5b,0x43,0x87,0xd2,0xa9,0x6d,0x1d,
|
|
0xb5,0xad,0xa7,0x43,0xcb,0xa8,0x35,0x8f,0xda,0x36,0x52,0x5b,0x0e,0x1d,0x5a,0x45,
|
|
0x6d,0x9b,0xa8,0xad,0x88,0xda,0x76,0x50,0xdb,0x76,0x3a,0x84,0x9d,0x65,0xd4,0x56,
|
|
0x41,0x6d,0xfb,0xe8,0x50,0x21,0x1d,0x2a,0xa2,0x43,0x5b,0xe9,0x08,0x43,0x87,0xb6,
|
|
0xd3,0x11,0xb4,0x53,0x4a,0x47,0xd2,0xe9,0xd0,0x1e,0x3a,0xb2,0x94,0x8e,0x64,0xd0,
|
|
0xa1,0xbd,0x74,0x68,0x3f,0x1d,0x59,0x45,0x87,0x6a,0xe8,0x50,0x03,0x4d,0x86,0xde,
|
|
0xcc,0xe9,0x34,0x7b,0x3a,0xb5,0x66,0x52,0xeb,0x0a,0x6a,0x5d,0x45,0xad,0x6b,0xa8,
|
|
0x75,0x1d,0xb5,0x6e,0xa0,0xd6,0x6c,0x6a,0xcd,0xa5,0xd6,0x02,0x6a,0x2d,0xa4,0xd6,
|
|
0x22,0x6a,0xdd,0x4a,0xad,0xc5,0xd4,0xba,0x83,0x5a,0x4b,0xa8,0xb5,0x94,0x5a,0xcb,
|
|
0x68,0xf2,0xcb,0xd4,0x0a,0xc9,0xb5,0x74,0xa8,0x89,0x5a,0x6b,0xa8,0xb5,0x8e,0x5a,
|
|
0x1b,0xa8,0xb5,0x89,0x0e,0x2f,0xa6,0xc3,0x49,0x74,0x38,0x85,0x0e,0xa7,0xd1,0xe1,
|
|
0x25,0x74,0x38,0x83,0x0e,0x2f,0xa7,0xc3,0x59,0x74,0x78,0x25,0x1d,0x5e,0x4d,0x87,
|
|
0xd7,0xd2,0xe1,0xf5,0x74,0x78,0x23,0x1d,0xce,0xa1,0xc3,0x79,0x74,0xb8,0x80,0x0e,
|
|
0xe5,0xd3,0xe1,0x22,0x3a,0xbc,0x95,0x0e,0x17,0xd3,0xe1,0x1d,0x74,0xb8,0x84,0x0e,
|
|
0x97,0xd2,0xe1,0x32,0x3a,0x5c,0x4e,0x87,0x2b,0xe9,0x7c,0x39,0x0e,0xd4,0xd3,0xa1,
|
|
0x6c,0xe4,0xb6,0x51,0x5b,0x22,0x1d,0x62,0xe8,0xc8,0x12,0x3a,0xb2,0x8c,0xda,0xd2,
|
|
0xa8,0x6d,0x09,0xb5,0x65,0x50,0xdb,0x72,0x6a,0xcb,0xa2,0x36,0x1c,0xad,0xa1,0xb6,
|
|
0x3a,0x3a,0xb2,0x18,0x03,0x2f,0x15,0xa4,0x81,0xa5,0x60,0x3b,0x48,0x02,0x19,0x74,
|
|
0x64,0x2d,0x1d,0x65,0x08,0x83,0xf3,0xe8,0x6a,0x3a,0x9a,0xce,0x0e,0xd2,0x1a,0x7a,
|
|
0xb3,0x9c,0xde,0xac,0xa4,0x23,0xc8,0x54,0x91,0x3b,0xb6,0x23,0xa9,0xbd,0x92,0x1d,
|
|
0xcc,0xec,0xd1,0x5d,0x84,0x33,0x7e,0xac,0x94,0x8e,0xed,0xa6,0x63,0x65,0xd4,0xbe,
|
|
0x8c,0xda,0x97,0x53,0x7b,0x26,0x1d,0x2b,0xa7,0x63,0x15,0x74,0xac,0x92,0x8e,0xed,
|
|
0xa5,0x63,0xfb,0xe8,0xd8,0x7e,0x3a,0x86,0x62,0xd5,0x74,0xac,0x96,0x8e,0xd5,0xd1,
|
|
0xb1,0x06,0x3a,0xd6,0x48,0xc7,0x9a,0xa8,0x9d,0xa1,0xf6,0xc5,0xd4,0x9e,0x44,0xed,
|
|
0xc9,0xd4,0x9e,0x42,0xed,0xa9,0xd4,0x9e,0x46,0xed,0xe9,0xd4,0xbe,0x84,0xda,0x97,
|
|
0x52,0x7b,0x06,0xb5,0xaf,0xa7,0xf6,0x8d,0xd4,0x9e,0x43,0xed,0x79,0xd4,0x5e,0x40,
|
|
0xed,0x85,0xd4,0x5e,0x44,0xed,0x5b,0xa9,0xbd,0x98,0xda,0x77,0x50,0x7b,0x09,0xb5,
|
|
0x97,0x52,0x3b,0x74,0xab,0xa9,0xbd,0x8e,0xde,0xc4,0x4f,0x3d,0xbd,0xd9,0x40,0x1d,
|
|
0x2b,0xa8,0x63,0x25,0x75,0xac,0xa2,0x8e,0xd5,0xd4,0xb1,0x86,0x3a,0xd6,0x52,0xc7,
|
|
0x3a,0xea,0x58,0x4f,0x1d,0x1b,0xa8,0x63,0x23,0x75,0x64,0x53,0x47,0x0e,0x75,0xe4,
|
|
0x52,0x47,0x1e,0x75,0xe4,0x53,0x47,0x01,0x1d,0xdf,0x43,0xc7,0xcb,0xe9,0x78,0x05,
|
|
0x1d,0xaf,0xa4,0xe3,0x7b,0xe9,0xf8,0x3e,0x3a,0xbe,0x9f,0x8e,0x57,0xd1,0xf1,0x6a,
|
|
0x3a,0x5e,0x43,0xc7,0x6b,0xe9,0x78,0x1d,0x1d,0xaf,0xa7,0xe3,0x0d,0x74,0xbc,0x91,
|
|
0x8e,0x37,0x51,0x07,0x43,0x1d,0x8b,0xa9,0x23,0x91,0x3a,0x92,0xa8,0x23,0x99,0x3a,
|
|
0x52,0xa8,0x23,0x95,0x3a,0xd2,0xa8,0x23,0x9d,0x3a,0x96,0x50,0xc7,0x52,0xea,0xc8,
|
|
0xa0,0x8e,0x65,0xd4,0xb1,0x9c,0x3a,0x32,0xa9,0x23,0x8b,0x3a,0x0a,0xa9,0xa3,0x88,
|
|
0x3a,0xb6,0x52,0x47,0x31,0x75,0xec,0xa0,0x8e,0x12,0xea,0x28,0xa5,0x8e,0x32,0xea,
|
|
0x28,0xa7,0x8e,0x4a,0xea,0xd8,0x47,0x1d,0x55,0xd4,0x51,0x43,0x1d,0x75,0xd4,0x01,
|
|
0xe3,0x9b,0xe8,0xc4,0x62,0x3a,0x91,0x41,0x27,0x96,0xd3,0x89,0x2c,0x3a,0xb1,0x92,
|
|
0x4e,0xac,0xa6,0x13,0x6b,0xe9,0xc4,0x7a,0x3a,0xb1,0x91,0x4e,0xe4,0xd0,0x89,0x3c,
|
|
0x3a,0x51,0x40,0x27,0x0a,0xe9,0x44,0x11,0x9d,0xd8,0x4a,0x27,0x8a,0xe9,0xc4,0x0e,
|
|
0x3a,0x51,0x42,0x27,0x4a,0xe9,0x44,0x19,0x9d,0x28,0xa7,0x13,0x95,0x74,0x62,0x1f,
|
|
0x9d,0xa8,0xa2,0x13,0x35,0x74,0xa2,0x8e,0x4e,0x34,0xd0,0x89,0x26,0xea,0xcc,0xa2,
|
|
0xce,0x44,0xea,0x4c,0xa6,0xce,0x54,0xea,0x4c,0xa7,0xce,0xa5,0xd4,0xb9,0x8c,0x3a,
|
|
0x33,0xa9,0x73,0x25,0x75,0xae,0xa6,0xce,0xb5,0xd4,0xb9,0x9e,0x3a,0x37,0x52,0x67,
|
|
0x0e,0x75,0xe6,0x51,0x67,0x01,0x75,0x16,0x52,0x67,0x11,0x75,0x6e,0xa5,0xce,0x62,
|
|
0xea,0xdc,0x41,0x9d,0x25,0xd4,0x59,0x4a,0x9d,0x65,0xd4,0x59,0x4e,0x9d,0x95,0xd4,
|
|
0xb9,0x8f,0x3a,0xab,0xa8,0xb3,0x86,0x3a,0xeb,0xa8,0xb3,0x81,0x3a,0x9b,0xe8,0xe4,
|
|
0x62,0x3a,0x99,0x44,0x27,0x53,0xe8,0x64,0x1a,0x9d,0x5c,0x42,0x27,0x33,0xe8,0xe4,
|
|
0x72,0x3a,0x99,0x45,0x27,0x57,0xd2,0xc9,0xd5,0x74,0x72,0x2d,0x9d,0x5c,0x4f,0x27,
|
|
0x37,0xd2,0xc9,0x1c,0x3a,0x99,0x47,0x27,0x0b,0xe8,0x64,0x21,0x9d,0x2c,0xa2,0x93,
|
|
0x5b,0xe9,0x64,0x31,0x9d,0xdc,0x41,0x27,0x4b,0xe8,0x64,0x29,0x9d,0x2c,0xa3,0x53,
|
|
0x85,0x74,0x6a,0x33,0x9d,0x2a,0xa2,0x53,0x5b,0xe8,0xd4,0x56,0x3a,0xb5,0x8d,0x4e,
|
|
0x15,0xd3,0xa9,0xed,0x74,0x6a,0x07,0x9d,0xda,0x49,0xa7,0x4a,0xe8,0xd4,0x2e,0x3a,
|
|
0x55,0x4a,0xa7,0x76,0xd3,0x29,0x14,0xde,0x43,0xa7,0xca,0xe9,0x54,0x05,0x9d,0xaa,
|
|
0xa4,0x53,0x7b,0xe9,0xd4,0x3e,0x3a,0xb5,0x9f,0x4e,0x55,0xd1,0xa9,0x6a,0x3a,0x55,
|
|
0x43,0xa7,0x6a,0xe9,0x54,0x1d,0x9d,0xaa,0xa7,0x53,0x0d,0x74,0xaa,0x91,0x4e,0x35,
|
|
0xd1,0x69,0x86,0x4e,0x2f,0xa6,0xd3,0x89,0x74,0x3a,0x89,0x4e,0x27,0xd3,0xe9,0x14,
|
|
0x3a,0x9d,0x0a,0x15,0xec,0x78,0xbb,0xf8,0x9d,0xbd,0xf4,0x4e,0x3a,0xa2,0xf7,0xd2,
|
|
0xd8,0xdc,0x52,0x44,0x67,0xb7,0xac,0x3d,0xbb,0xa5,0x1e,0xc9,0x3a,0x53,0xb2,0xde,
|
|
0x94,0xe4,0x9a,0x92,0x42,0x53,0xb2,0xd9,0x94,0x94,0x98,0x92,0x32,0x2e,0xd9,0x56,
|
|
0x78,0x76,0x1b,0x9b,0x6c,0x36,0x25,0x65,0x5c,0xb2,0xbd,0xe2,0xec,0x76,0x36,0xa9,
|
|
0x36,0x25,0xeb,0x4c,0xc9,0x7a,0x53,0x92,0x6b,0x4a,0x4a,0xb8,0x64,0x57,0xe1,0xd9,
|
|
0x5d,0x6c,0xb2,0x99,0x4b,0x6a,0x96,0x9f,0xad,0xae,0xa0,0xb3,0x75,0xcb,0xcf,0xd6,
|
|
0x22,0xa9,0x2d,0x39,0x5b,0xbb,0xd1,0x94,0x14,0xd2,0xd9,0xfa,0x0c,0x3a,0xdb,0x90,
|
|
0x78,0xb6,0xb1,0x0a,0xc9,0x32,0x53,0xb2,0xd2,0x94,0xac,0x33,0x25,0x39,0xa6,0x84,
|
|
0x39,0xdb,0xb8,0x0f,0x49,0xf9,0xd9,0x86,0x0a,0x53,0x82,0xce,0x35,0x56,0x9c,0x6d,
|
|
0x64,0xb8,0x04,0x3b,0xb8,0x5c,0xe5,0x40,0x62,0xde,0x31,0xb0,0x7f,0x15,0xd7,0x48,
|
|
0x63,0xae,0x29,0x29,0x34,0x25,0xdb,0x4c,0x49,0x89,0x29,0x59,0xc1,0x0a,0x9c,0xdf,
|
|
0xcb,0x80,0xc5,0x20,0x11,0x24,0x81,0x64,0x90,0x02,0x52,0x41,0x1a,0x48,0x07,0x4b,
|
|
0xc0,0x52,0x90,0x01,0x96,0x81,0xe5,0x20,0x13,0x64,0x81,0x15,0x60,0x25,0x58,0x05,
|
|
0x56,0x83,0x35,0x60,0x2d,0x58,0x07,0xd6,0x83,0x0d,0x60,0x23,0xc0,0xad,0x6e,0x6f,
|
|
0x0e,0xc8,0x05,0x79,0x20,0x1f,0x14,0x80,0x4d,0xa0,0x10,0x6c,0x06,0x45,0x60,0x0b,
|
|
0xd8,0x0a,0x8a,0x41,0x29,0x9d,0x4b,0xca,0xa5,0x73,0x59,0x7b,0x40,0x39,0xa8,0x00,
|
|
0x95,0x60,0x2f,0xd8,0x47,0x17,0x37,0x66,0xd0,0xb9,0x8a,0xa5,0x28,0xb3,0x02,0xac,
|
|
0x04,0xab,0xc0,0x6a,0xb0,0x06,0xac,0x05,0xeb,0xc0,0x7a,0xb0,0x01,0x6c,0x04,0xd9,
|
|
0x20,0x07,0xe4,0x81,0x7c,0x50,0x00,0x36,0x81,0x42,0xb0,0x19,0x14,0x81,0x2d,0x60,
|
|
0x2b,0xd8,0x06,0x8a,0xc1,0x76,0xb0,0x03,0xec,0x04,0x25,0x60,0x17,0x60,0xed,0xda,
|
|
0x0d,0xca,0x00,0x6c,0x4b,0x82,0x6d,0x49,0xb0,0x2d,0x09,0xb6,0x25,0xc1,0xb6,0xa4,
|
|
0x7d,0x60,0x3f,0xa8,0x02,0xd5,0xa0,0x06,0xd4,0x82,0x06,0xd0,0x08,0x9a,0xa8,0x6d,
|
|
0x05,0xb5,0xc1,0x62,0x78,0xbd,0x0d,0x1d,0x84,0xb3,0xce,0xc1,0x59,0xe7,0xe0,0x98,
|
|
0x73,0xe8,0x7c,0x1b,0x9e,0x85,0x6b,0xa9,0xad,0x80,0xda,0x0a,0xa9,0x0d,0x9b,0x90,
|
|
0xde,0x87,0x27,0x00,0x1e,0x95,0x10,0xde,0x9f,0x42,0x47,0x70,0xa4,0x9c,0xda,0xf6,
|
|
0x50,0x5b,0x25,0xb5,0xed,0xa5,0xb6,0x6a,0x3a,0x82,0x27,0x08,0x8c,0x83,0x73,0x8f,
|
|
0xac,0xa0,0x23,0x68,0xb8,0x7a,0x31,0x48,0x02,0x29,0x20,0x0d,0x2c,0x01,0x70,0x57,
|
|
0xf5,0x72,0x90,0x05,0xd8,0x32,0x70,0x55,0x35,0xdc,0x54,0x0d,0xe5,0x6a,0xb8,0xa7,
|
|
0x1a,0xae,0xa9,0x86,0x05,0xd5,0x70,0x4b,0x35,0x5c,0x52,0x0d,0x77,0x54,0xc3,0x15,
|
|
0xd5,0x70,0x43,0x35,0x5c,0x50,0x0d,0x85,0x6a,0x58,0x50,0x8d,0x6e,0x57,0xa3,0xcb,
|
|
0xd5,0xe8,0x6e,0x35,0xba,0x5a,0x8d,0x6e,0x56,0xa3,0x8b,0xd5,0x75,0x00,0x5d,0xac,
|
|
0x6e,0xa2,0x73,0x35,0xd0,0xaf,0x81,0x7e,0x0d,0xf4,0x6b,0xa0,0x5f,0x03,0xfd,0x1a,
|
|
0xe8,0xd7,0x40,0xbf,0x06,0xfa,0x35,0xd0,0xaf,0x81,0x7e,0x0d,0xf4,0x6b,0xa0,0x5f,
|
|
0x03,0xfd,0x1a,0xe8,0xd7,0x40,0xbf,0x06,0xfa,0x35,0xd0,0xaf,0x81,0x7e,0x0d,0xf4,
|
|
0x6b,0xa0,0x5f,0x03,0xfd,0x1a,0xe8,0xd7,0x40,0xbf,0x06,0xfa,0x35,0xd0,0xaf,0x81,
|
|
0x7e,0x0d,0xf4,0x6b,0xa0,0x5f,0x03,0xfd,0x1a,0xe8,0xd7,0x40,0xbf,0x06,0xfa,0xb5,
|
|
0xd0,0xaf,0x85,0x7e,0x2d,0xf4,0x6b,0xa1,0x5f,0x0b,0xfd,0x5a,0xe8,0xd7,0x42,0xbf,
|
|
0x16,0xfa,0xb5,0xd0,0xaf,0x85,0x7e,0xed,0x5a,0x9a,0x70,0xa4,0x91,0x5a,0x20,0x89,
|
|
0x8b,0xf3,0x5c,0x2d,0x24,0x6b,0x21,0x59,0x0b,0xc9,0x5a,0x48,0xd6,0x42,0xb2,0x16,
|
|
0x92,0xb5,0x90,0xac,0x85,0x64,0x2d,0x24,0x6b,0x21,0x59,0x0b,0xc9,0x5a,0x48,0xd6,
|
|
0x42,0xb2,0x16,0x92,0xb5,0x90,0xac,0x83,0x64,0x1d,0x24,0xeb,0x20,0x59,0x07,0xc9,
|
|
0x3a,0x48,0xd6,0x41,0xb2,0x0e,0x92,0x75,0x90,0xac,0x83,0x64,0x1d,0x24,0xeb,0xd0,
|
|
0xe5,0x3a,0x74,0xb9,0x0e,0x5d,0xae,0x43,0x97,0xeb,0xd0,0xe5,0x3a,0xe8,0xd7,0x41,
|
|
0xbf,0x0e,0xfa,0x75,0xd0,0xaf,0x83,0x7e,0x1d,0xf4,0xeb,0xa0,0x5f,0x07,0xfd,0x3a,
|
|
0xe8,0xd7,0x41,0xbf,0x0e,0xfa,0x75,0xd0,0xaf,0x83,0x7e,0x1d,0xf4,0xeb,0xa0,0x5f,
|
|
0x07,0xfd,0x3a,0xe8,0xd7,0x33,0x00,0x36,0xd4,0x27,0x02,0xd8,0x51,0x9f,0x0c,0x60,
|
|
0x4b,0x7d,0x2a,0x80,0x3d,0xf5,0xb8,0x4a,0xea,0x61,0x43,0x3d,0xae,0x92,0x7a,0xd8,
|
|
0x51,0x8f,0xab,0xa4,0x1e,0xb6,0xd4,0xe3,0x0a,0xa8,0x87,0x76,0x3d,0xae,0x80,0x7a,
|
|
0xe8,0xd7,0xe3,0x0a,0xa8,0x87,0x0d,0xf5,0xb8,0x02,0xea,0x61,0x47,0x3d,0x46,0x78,
|
|
0x3d,0xb4,0xeb,0x31,0xc2,0xeb,0xa1,0x5f,0x8f,0x11,0x5e,0x0f,0x1b,0xea,0x31,0xc2,
|
|
0xeb,0x61,0x47,0x03,0x74,0x1b,0xa0,0xdb,0x00,0xdd,0x06,0xe8,0x36,0x40,0xb7,0x01,
|
|
0xba,0x0d,0xd0,0x6a,0x80,0x4e,0x03,0x34,0x1a,0xd0,0xdf,0x06,0xe8,0x34,0x40,0xa7,
|
|
0x01,0x3a,0x0d,0xd0,0x69,0x80,0x4e,0x03,0x74,0x1a,0xa0,0xd3,0xc0,0xea,0x30,0x98,
|
|
0xa7,0xa0,0x07,0x5c,0x9c,0xc8,0xc5,0x49,0x5c,0x9c,0xcc,0xc5,0x29,0x5c,0x9c,0xca,
|
|
0xc5,0x69,0x5c,0xbc,0x89,0x8b,0x0b,0xb9,0x78,0x33,0x17,0x17,0x71,0xf1,0x16,0x2e,
|
|
0xde,0xca,0xc5,0xdb,0xb8,0xb8,0x98,0x8d,0x1b,0xb8,0xf2,0x0d,0x5c,0xf9,0x06,0xae,
|
|
0x7c,0x03,0x57,0xbe,0x81,0x2b,0xdf,0xc0,0x95,0x6f,0xe0,0xca,0x37,0x98,0xca,0xef,
|
|
0x41,0x7c,0xac,0x9c,0x8d,0x76,0xb1,0xdb,0x8d,0xfb,0xb9,0x18,0xde,0x68,0x2c,0x67,
|
|
0x8f,0x62,0x3a,0xb5,0x9a,0xdc,0xdf,0x4c,0x64,0xa7,0x55,0x6f,0xb2,0x7d,0xdf,0xcb,
|
|
0x16,0xad,0x62,0xa3,0xdd,0x6c,0xc9,0x26,0xce,0x56,0xdc,0xbd,0x71,0x84,0x2d,0x8b,
|
|
0x39,0x1a,0x1b,0xb3,0xf3,0xb8,0xd5,0x28,0x7f,0x0c,0xa7,0xa3,0x89,0x85,0x75,0xd3,
|
|
0x7e,0xec,0x5c,0xc3,0x15,0x58,0xc3,0x15,0x58,0xc3,0x16,0x80,0x52,0x13,0x7c,0xd6,
|
|
0xc4,0xfa,0x0c,0x77,0x8f,0xa6,0xad,0xdc,0x04,0x8e,0xa1,0xa7,0xb1,0x5d,0x8f,0xb6,
|
|
0xdb,0x97,0xb0,0x51,0x26,0xa7,0xc5,0xd9,0xd6,0x50,0xcd,0x1e,0x61,0xab,0xd3,0x79,
|
|
0x66,0x05,0x52,0x4c,0x34,0x99,0x0a,0xfc,0x98,0x13,0x53,0x6e,0x1f,0x7e,0xcc,0x09,
|
|
0x9b,0x1b,0x39,0x12,0x05,0x53,0x88,0x5d,0xc2,0x8e,0xa4,0x91,0xfa,0x1b,0x45,0xd9,
|
|
0xd2,0x81,0x14,0x4c,0x21,0x14,0x4a,0x3a,0x0a,0xa3,0x70,0xf2,0xa1,0xf3,0xe9,0xab,
|
|
0x28,0x9a,0x54,0xa4,0xa6,0x79,0xf3,0x69,0x42,0xc0,0x24,0x30,0x9f,0x5e,0xdf,0x33,
|
|
0x89,0x26,0x05,0xcc,0x01,0x2f,0x20,0x3f,0x85,0x66,0xcf,0xa1,0xf9,0xb3,0xe8,0xf9,
|
|
0x67,0x66,0xd2,0xf3,0xb3,0xe8,0x7c,0x4a,0x26,0xbd,0xb5,0x82,0xde,0x5a,0x49,0x6f,
|
|
0xad,0xa2,0xb7,0x56,0xd3,0x94,0x09,0x2f,0xa2,0x95,0x95,0xdc,0xca,0x49,0xc7,0xc5,
|
|
0xe1,0x5c,0x1c,0x14,0xc8,0x25,0x5a,0xd2,0x70,0x31,0x9b,0x0f,0xe1,0xf2,0x21,0xdc,
|
|
0xf2,0x2a,0x84,0x82,0xb9,0x98,0xdd,0x1f,0x4a,0x21,0x5c,0xcc,0xe6,0xc3,0xb8,0xa3,
|
|
0x61,0xdc,0x9e,0x30,0xd2,0x71,0x31,0xbb,0x9f,0xa6,0x4d,0xc3,0x0f,0x58,0x40,0x0b,
|
|
0xa6,0xe1,0x87,0x03,0x9b,0x2f,0xd2,0x8b,0xd3,0xf0,0x33,0x8d,0xce,0xa7,0x26,0x53,
|
|
0x20,0x27,0x75,0x3e,0xbd,0x04,0x3f,0xe6,0xc4,0x94,0xdb,0x8d,0x1f,0x73,0xc2,0xe6,
|
|
0x2e,0x30,0xe9,0x60,0x09,0xb1,0x36,0x62,0xe5,0xa7,0xa1,0x20,0x18,0x88,0xc5,0x1f,
|
|
0xcc,0x81,0x15,0xe8,0x05,0x34,0xc3,0x49,0x13,0x48,0xaa,0x20,0x35,0xa9,0x34,0x40,
|
|
0x0b,0x82,0x41,0x08,0x08,0x05,0x3a,0x10,0x06,0xc2,0x41,0x50,0x20,0x1b,0xb1,0x25,
|
|
0x83,0xd8,0xa2,0x41,0x6c,0xd9,0x20,0xb6,0x70,0x10,0x5b,0x3a,0x88,0x2d,0x1e,0xc4,
|
|
0x96,0x0f,0x62,0x2b,0x04,0xb1,0x35,0x34,0x6c,0x8d,0x09,0x60,0x22,0x98,0x04,0x26,
|
|
0x83,0x67,0xc0,0x14,0x30,0x15,0x3c,0x0b,0xa6,0x81,0xe9,0x60,0x06,0x98,0x09,0x66,
|
|
0x81,0xd9,0x60,0x0e,0x98,0x0b,0x9e,0x03,0xf3,0xc0,0x7c,0xf0,0x3c,0x78,0x01,0x2c,
|
|
0x00,0x0b,0xc1,0x8b,0xe0,0x25,0xf0,0xb2,0xfa,0x86,0x1b,0x58,0x4f,0x44,0x44,0x44,
|
|
0x53,0x34,0xfb,0x13,0x4d,0xe7,0x4b,0xf2,0x8e,0x56,0xd3,0xf9,0x3d,0x7b,0x40,0x39,
|
|
0xc0,0x48,0xda,0x83,0xe1,0xb5,0x67,0x2f,0xc0,0x70,0xda,0xb3,0x1f,0x54,0x01,0xb6,
|
|
0x4c,0x0d,0xa8,0x05,0x75,0xa0,0x1e,0x34,0x80,0x46,0xd0,0x84,0xd5,0x0e,0xa6,0x1b,
|
|
0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,
|
|
0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,
|
|
0x51,0x8e,0xe9,0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,
|
|
0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0x86,
|
|
0x7a,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0xa6,
|
|
0x1b,0xe5,0xec,0xca,0x0a,0xd3,0x8d,0x72,0x4c,0x37,0xca,0x31,0xdd,0x28,0xc7,0x74,
|
|
0xa3,0x1c,0xd3,0x8d,0x72,0x3c,0x51,0x71,0x4f,0xdd,0xd7,0x40,0x6d,0xb0,0xaa,0x7c,
|
|
0x3b,0xd8,0x09,0x76,0x01,0x76,0x55,0xb6,0x9f,0x0e,0xe3,0xd9,0x0c,0x1b,0x2b,0x60,
|
|
0x63,0x05,0xec,0xab,0x80,0x6d,0x15,0xb0,0xab,0x02,0x36,0x55,0xc0,0x9e,0x0a,0xd8,
|
|
0x52,0x01,0x3b,0x2a,0x60,0x43,0x05,0xf4,0x2b,0xa0,0x5d,0x01,0xdd,0x0a,0x68,0x56,
|
|
0x40,0xaf,0x02,0x5a,0x15,0xd0,0xa9,0xc0,0x94,0xa6,0x02,0xd3,0x99,0x0a,0x4c,0x65,
|
|
0x2a,0x30,0x95,0xa9,0xd8,0x01,0x30,0xb4,0x2a,0x4a,0x41,0x19,0x80,0x0f,0x2b,0xa0,
|
|
0x58,0x01,0xdf,0x55,0xc0,0x6f,0x15,0xf0,0x59,0x05,0xfc,0x55,0x01,0xab,0x2a,0xe0,
|
|
0xa7,0x4a,0xe8,0x57,0x42,0xbf,0x12,0xfa,0x95,0xd0,0xaf,0x84,0x7e,0x25,0xf4,0x2b,
|
|
0xa1,0x5f,0x09,0xfd,0x4a,0xe8,0x57,0x42,0xbf,0x12,0xfa,0x95,0xd0,0xaf,0x84,0x7e,
|
|
0x25,0xf4,0x2b,0xa1,0x5f,0x09,0xfd,0x4a,0xe8,0x57,0x42,0xbf,0x12,0x3d,0xab,0xc4,
|
|
0x58,0xae,0x84,0xd6,0xbe,0x42,0xea,0x2e,0x5b,0x4e,0x7d,0x8d,0x05,0xf4,0x51,0x35,
|
|
0x03,0xb6,0x83,0xfd,0xa0,0x89,0x3e,0xc2,0xf3,0xf7,0x23,0x3c,0x2b,0x3f,0xaa,0x5d,
|
|
0x06,0x36,0x81,0x5a,0xea,0x4a,0x6e,0xa2,0xae,0x94,0xad,0xa0,0x84,0xba,0x52,0x13,
|
|
0xc1,0x3a,0x80,0x7c,0xda,0x26,0xb0,0x8f,0xba,0xd2,0x19,0xea,0x5a,0x9a,0x43,0x5d,
|
|
0x19,0x35,0xd4,0xb5,0x6c,0x2d,0xc8,0x06,0xd5,0xd4,0xb5,0x7c,0x31,0xc8,0x05,0x3b,
|
|
0xa8,0x2b,0x13,0xf5,0x32,0xf7,0x53,0x57,0x56,0x3a,0x28,0xa2,0xae,0x9c,0xf5,0xd4,
|
|
0x95,0x5b,0x40,0x5d,0x45,0x68,0x67,0x0b,0x8e,0x6d,0x59,0x0a,0x50,0x77,0x4b,0x31,
|
|
0x75,0x6d,0xad,0xa4,0xae,0xd2,0x15,0xd4,0xb5,0x1b,0xed,0x96,0xa1,0x9d,0x3d,0x59,
|
|
0x60,0x33,0x40,0xbe,0x7c,0x37,0x28,0xa7,0xae,0x2a,0xe8,0x55,0xc1,0xa6,0x2a,0x36,
|
|
0xdf,0x48,0x5d,0x35,0x15,0x00,0xb6,0xe2,0x99,0xdf,0x55,0xb7,0x17,0x60,0x1f,0x66,
|
|
0xd8,0x5d,0x78,0xc0,0x75,0x35,0xa0,0x2d,0x3c,0x70,0xba,0x1a,0xd0,0x6e,0x53,0x12,
|
|
0x75,0xa7,0xa7,0x83,0xfd,0xd4,0xbd,0x24,0x83,0xba,0xd7,0x94,0x81,0xbd,0xd4,0xbd,
|
|
0x2e,0x0d,0xac,0x07,0x5b,0x40,0x0d,0x75,0xaf,0xdf,0x04,0xb6,0x52,0x77,0xce,0x1e,
|
|
0xea,0xce,0x45,0xf9,0xdc,0xed,0xd4,0xbd,0x0b,0xfb,0x4a,0x37,0x03,0x1c,0xdf,0x5d,
|
|
0x09,0x1f,0xa2,0x7e,0xd9,0x1a,0x90,0x43,0xdd,0xb0,0xb1,0x7b,0x0f,0xf2,0xb8,0x0e,
|
|
0x7a,0x16,0x97,0x50,0x4f,0xfa,0x4e,0xb0,0x1f,0xd4,0x81,0x26,0xea,0x59,0x92,0x06,
|
|
0x36,0x82,0x1c,0xea,0x59,0xba,0x8b,0x7a,0x32,0x93,0xc1,0x12,0xea,0x59,0x9d,0x0b,
|
|
0xb6,0x51,0xcf,0x9a,0x0d,0xa0,0x00,0x6c,0x07,0x7b,0xa8,0x67,0x5d,0x06,0x58,0x45,
|
|
0x3d,0x1b,0xd1,0xc6,0xc6,0x06,0xea,0xc9,0xde,0x0d,0xd0,0x4e,0x0e,0xd2,0x02,0xb4,
|
|
0x51,0xb0,0x19,0x54,0x52,0xcf,0x96,0x5a,0xea,0xd9,0x56,0x0d,0x1a,0xa9,0x67,0x07,
|
|
0xb4,0x4b,0x50,0xaf,0xa4,0x86,0x7a,0x30,0x8a,0x7b,0x2a,0xb1,0x1f,0x0f,0xe7,0x1e,
|
|
0x3c,0x80,0x7b,0x1a,0x97,0x82,0x06,0xea,0x65,0x16,0x83,0x65,0x60,0x15,0xa8,0xa4,
|
|
0xde,0xc5,0x4d,0xd4,0x9b,0xb8,0x84,0x7a,0xd3,0x8a,0xc0,0x4e,0x80,0x7d,0x69,0xf5,
|
|
0xd4,0x9b,0x8e,0x32,0xe9,0x39,0xa0,0x80,0x7a,0x97,0xec,0x06,0x15,0xa0,0x9a,0x7a,
|
|
0x37,0x2e,0x07,0x25,0xd4,0x5b,0xc8,0x00,0x94,0x29,0x44,0xbd,0xad,0x8d,0xd4,0xbb,
|
|
0x2d,0x83,0x7a,0x8b,0xd1,0xe6,0x76,0xec,0xc7,0xf5,0xdf,0x8b,0xeb,0xb8,0x17,0xd7,
|
|
0x63,0x6f,0x39,0xea,0xe0,0x5a,0xe8,0xdd,0xb7,0x05,0xec,0xa1,0xde,0xfd,0x68,0x1f,
|
|
0x93,0xa9,0xde,0xba,0xa5,0xd4,0xdb,0x88,0xf6,0xf1,0x18,0xed,0xc5,0xf2,0xa3,0x2f,
|
|
0x71,0x25,0xf5,0xa5,0x2c,0xa1,0xbe,0xb4,0x54,0xb0,0x0c,0x60,0x7b,0x6d,0x15,0xf5,
|
|
0xad,0x63,0xa8,0x6f,0x43,0x2e,0xf5,0x65,0xef,0x07,0x35,0xd4,0x97,0xb3,0x9d,0xfa,
|
|
0xf2,0x70,0x2c,0x2f,0x1f,0x6c,0x06,0x3b,0xa8,0xaf,0x20,0x03,0x94,0x82,0x4a,0xea,
|
|
0xdb,0xb4,0x98,0xfa,0x36,0xa3,0x4c,0x51,0x0e,0x28,0xa0,0xbe,0x6d,0xeb,0xc0,0x46,
|
|
0xb0,0x8b,0xfa,0x76,0x62,0x7f,0xc9,0x06,0x80,0xfd,0xbb,0xb6,0x82,0x32,0x50,0x01,
|
|
0xea,0xa9,0xaf,0x34,0x9b,0xfa,0x2a,0xb1,0x0f,0xf3,0xc8,0x3e,0x8c,0xa1,0x3e,0x4c,
|
|
0xfe,0xfa,0x30,0xa9,0xeb,0xc3,0x44,0xae,0x0f,0x13,0xb7,0x3e,0x4c,0xda,0xfa,0x30,
|
|
0xd1,0xea,0xc3,0x24,0xab,0xaf,0x3e,0x13,0xac,0x06,0x9b,0x00,0xca,0x34,0x2c,0x05,
|
|
0xab,0x70,0x3d,0xb1,0xd7,0x14,0x6c,0x6d,0xdc,0x44,0xfe,0x78,0x4e,0xac,0xc2,0xc8,
|
|
0x4f,0x06,0x29,0xe4,0x7e,0x21,0x71,0x23,0x1b,0x65,0xd3,0x85,0xc4,0xf4,0x0b,0x89,
|
|
0x4b,0x91,0x54,0x5e,0x48,0x4a,0xa7,0x73,0xc9,0x98,0x32,0x25,0x63,0xca,0x94,0x8a,
|
|
0x99,0x7d,0x32,0xa6,0x0e,0xa9,0x58,0x54,0xa4,0x62,0x9a,0x97,0x8c,0xe9,0x53,0x32,
|
|
0xa6,0x4f,0xc9,0x98,0x3e,0xa5,0xe2,0xf1,0x9f,0x8a,0x89,0x46,0x2a,0x26,0x10,0xa9,
|
|
0x98,0x76,0xa5,0x62,0xda,0x95,0x8a,0x69,0x57,0x32,0x16,0x31,0xc9,0x98,0xd2,0x25,
|
|
0x63,0x4a,0x97,0xcc,0xb6,0x85,0xe9,0x41,0x32,0xa6,0x9a,0xc9,0x58,0x08,0x25,0x63,
|
|
0xba,0x99,0xbc,0x0c,0x60,0xca,0x99,0x9c,0x09,0x30,0xed,0x4c,0xc6,0x1c,0x23,0x19,
|
|
0x73,0x8c,0x64,0x4c,0xfb,0x52,0x50,0x36,0x05,0xd3,0xaf,0x14,0x4c,0xbf,0x52,0x30,
|
|
0xfd,0xc2,0xd5,0x7d,0x2e,0x05,0xd3,0xaf,0x14,0x4c,0xbf,0x52,0xb0,0xd0,0x49,0xc1,
|
|
0x94,0x33,0x05,0x36,0xe1,0x8a,0x3f,0x97,0x02,0x9b,0x52,0x60,0x53,0x0a,0x16,0x3a,
|
|
0x29,0x98,0x7e,0xa6,0xc0,0x9e,0x14,0xd8,0x93,0x02,0x7b,0x52,0x60,0x4f,0x0a,0xec,
|
|
0x49,0x61,0xed,0xc1,0x34,0x32,0x19,0x53,0xbc,0x34,0xd8,0x93,0x06,0x7b,0x70,0x16,
|
|
0xcf,0xa5,0x41,0x3b,0x0d,0x53,0xbf,0x34,0x4c,0xfb,0xd2,0x30,0xcd,0x4d,0xc6,0x1a,
|
|
0x27,0x0d,0xd3,0xdc,0x34,0x4c,0x73,0x93,0x91,0x26,0x63,0xf1,0x95,0x8c,0xa9,0x4d,
|
|
0x32,0x6c,0x49,0x86,0x2d,0xc9,0xd0,0x4f,0x86,0x76,0x32,0x74,0x93,0xa1,0x9b,0xcc,
|
|
0xfa,0x02,0xba,0xc9,0xd0,0x4d,0x86,0x5e,0x32,0xa6,0x9a,0x29,0xf0,0x59,0x0a,0x34,
|
|
0x52,0xd8,0xf6,0x61,0x47,0x1a,0x6b,0x07,0xda,0x4f,0xc1,0xe2,0x2e,0x05,0x1a,0x78,
|
|
0x9e,0x9f,0x4b,0x65,0xfd,0x06,0x1b,0x52,0xd1,0xdf,0x54,0xf4,0x37,0x15,0xb6,0xa5,
|
|
0x42,0x2b,0xb5,0x10,0x77,0xb9,0x25,0xb8,0xfb,0xe4,0x20,0x5d,0x0a,0x4a,0x01,0xae,
|
|
0x98,0x35,0x15,0x48,0x71,0xe7,0xc3,0x6a,0xa9,0x6b,0x0b,0xee,0x56,0xb9,0x7b,0x48,
|
|
0x85,0x93,0xa3,0x66,0xe3,0x44,0x2e,0x4e,0xe2,0xe2,0x14,0x2e,0x4e,0xe5,0xe2,0x34,
|
|
0x2e,0x5e,0xc2,0xc5,0x19,0x5c,0xbc,0x8c,0x8b,0x33,0xb9,0x38,0x8b,0x8b,0x57,0x70,
|
|
0xf1,0x4a,0x2e,0x5e,0x85,0xf8,0xe2,0x1e,0xb6,0xcd,0x4b,0x89,0x1b,0xd8,0x38,0x63,
|
|
0x0b,0x1b,0xe7,0xd5,0xb3,0x71,0x71,0x3a,0x1b,0xef,0x59,0x83,0xf8,0xe3,0xc4,0x5d,
|
|
0x6c,0xbc,0x36,0x99,0x8d,0xf3,0xd9,0x16,0x3e,0xde,0xb3,0x9d,0x8d,0x6b,0xf6,0x22,
|
|
0xfe,0x24,0x89,0x6d,0xe1,0x93,0x65,0xac,0xd6,0x27,0x6b,0xd9,0x76,0x3e,0x2e,0x62,
|
|
0x5b,0xf8,0x78,0xc3,0x96,0x8f,0x37,0x25,0x9b,0x32,0x9f,0xe4,0xb0,0x19,0xdc,0xda,
|
|
0xd9,0xb8,0x76,0x19,0x97,0x67,0xed,0x44,0xb7,0xb9,0x3d,0xac,0x4a,0x57,0x4a,0x29,
|
|
0xb7,0x3f,0x89,0xcb,0x97,0xb0,0xf9,0x9a,0x3c,0x36,0xbf,0x7c,0x31,0x62,0xdc,0xf2,
|
|
0x10,0xe3,0x46,0xc6,0xe6,0xf7,0xec,0xe5,0xf6,0xb0,0x36,0xe0,0xb2,0x64,0xcb,0xe4,
|
|
0x16,0xb0,0x7b,0xd6,0x6f,0x65,0xe3,0x4d,0x3b,0xb9,0xa3,0x6c,0xfb,0x3d,0x5b,0x1a,
|
|
0xd9,0xa3,0x2b,0x96,0xb3,0xf9,0x25,0x35,0x88,0x7b,0x2b,0x0a,0xd9,0xfc,0x56,0xae,
|
|
0xe5,0xa5,0x6c,0x3b,0x1f,0xd5,0x15,0xb1,0xf9,0x95,0xac,0xcd,0x5d,0xa5,0xdb,0xd8,
|
|
0xa3,0x39,0xec,0x9e,0x8f,0xea,0x59,0xdd,0xde,0xca,0x34,0xce,0x86,0x35,0x5c,0x2d,
|
|
0xce,0xc2,0x7a,0x56,0x11,0xb7,0x26,0x2e,0xae,0x54,0x53,0xd7,0x5a,0x3c,0x0d,0x6a,
|
|
0xea,0xa9,0x67,0x77,0x16,0xcd,0x7d,0xfe,0x19,0xd2,0x04,0x91,0x46,0x43,0x1a,0xcc,
|
|
0x17,0x83,0x49,0x83,0x99,0x62,0x28,0x69,0x74,0xa4,0x09,0x23,0x4d,0x38,0x69,0x03,
|
|
0x49,0x1b,0x44,0x5a,0x0d,0x69,0xb5,0xa4,0x0d,0x26,0x6d,0x08,0xc1,0xff,0x04,0xef,
|
|
0x13,0x7c,0x4f,0xf0,0x3c,0xc1,0xef,0x04,0xaf,0x13,0x7c,0x4e,0xf0,0x38,0xc1,0xdf,
|
|
0x04,0x6f,0x13,0x7c,0x4d,0xf0,0x34,0xc1,0xcf,0x04,0x2f,0x63,0x5f,0xf5,0xc5,0xca,
|
|
0x4d,0x04,0x57,0x7f,0x9c,0x87,0xad,0xec,0x3d,0x78,0x30,0xae,0xc1,0x03,0x91,0x1d,
|
|
0x3e,0x49,0x78,0x68,0xe6,0x11,0xfc,0x80,0x87,0x04,0x6e,0xe8,0x5b,0xf0,0xe0,0x59,
|
|
0xb1,0x1c,0x37,0xfa,0x1a,0xdc,0xf8,0x0a,0x09,0x7d,0xc7,0xc3,0x11,0x37,0xe6,0x62,
|
|
0xf6,0x06,0x8f,0x1b,0xda,0x62,0x0c,0xaf,0xe4,0x9d,0xb8,0x2d,0xe0,0xc1,0x52,0x89,
|
|
0x1b,0xd2,0x26,0x3c,0x6c,0xb1,0x1a,0xeb,0x4a,0xdd,0x88,0x07,0x0b,0x1e,0x8c,0x55,
|
|
0xdb,0xf0,0x80,0xc4,0x83,0x6a,0x59,0x1d,0x1e,0x80,0x78,0x48,0x96,0xe2,0xe1,0x90,
|
|
0x53,0x84,0x32,0xb8,0x71,0x63,0x02,0x00,0xdf,0x60,0x88,0xe6,0x92,0x36,0x94,0xb4,
|
|
0x3a,0xd2,0x62,0xda,0x1b,0x4e,0xc1,0x98,0x9d,0x07,0x51,0xb0,0x86,0x82,0xb5,0x14,
|
|
0x1c,0x4c,0xc1,0x98,0x23,0x87,0x52,0xb0,0x8e,0x82,0xc3,0x28,0x38,0x9c,0x42,0x30,
|
|
0x59,0x65,0x1f,0x61,0x1a,0x36,0xd2,0xb2,0x51,0x30,0x1b,0x85,0xb0,0x51,0x28,0x1b,
|
|
0xe9,0xd8,0x28,0x8c,0x8d,0xc2,0xd9,0x28,0x28,0x90,0x8b,0xb9,0x3a,0x41,0x5c,0xa5,
|
|
0x67,0xa7,0xd2,0x33,0xf3,0xc0,0x02,0x9a,0xf9,0xfc,0x64,0xdc,0xbb,0x36,0x83,0x2d,
|
|
0x60,0x1b,0xd8,0x0e,0x76,0x82,0x12,0x50,0x0a,0xca,0x40,0x39,0x7b,0x7f,0x03,0xfb,
|
|
0x40,0x15,0xa8,0x01,0x75,0xa0,0x01,0x34,0xd1,0x85,0xa4,0xc5,0x20,0x19,0xa4,0x12,
|
|
0x7b,0x13,0xbc,0x90,0x84,0xfb,0x61,0x52,0x06,0x58,0x06,0x96,0x83,0x4c,0x90,0x05,
|
|
0x56,0x81,0xb5,0x60,0x03,0xc8,0x01,0xf9,0xa0,0x00,0x6c,0x02,0x85,0x00,0x76,0x24,
|
|
0xc1,0x8e,0x24,0xd8,0x91,0x04,0x3b,0x92,0x76,0x00,0xd8,0x92,0x04,0x5b,0x92,0x76,
|
|
0x01,0xd8,0x93,0x04,0x7b,0x92,0xf6,0x00,0xd8,0x94,0x84,0x8b,0xbc,0x6e,0x4b,0xd7,
|
|
0xaa,0x65,0x6c,0x17,0x2e,0x24,0xad,0xbc,0x90,0x54,0xcf,0xe9,0xb3,0x1b,0x25,0x50,
|
|
0xba,0x90,0x58,0x68,0xda,0xc0,0xbd,0x39,0xdb,0xd4,0xcb,0xcd,0x5c,0x19,0xb6,0x6f,
|
|
0x5b,0x60,0x22,0x7b,0x24,0x71,0x8f,0x69,0xa3,0x92,0xeb,0x46,0xe2,0xb6,0x0b,0x89,
|
|
0x3b,0xb0,0xc1,0x3a,0x02,0xfd,0x44,0xf7,0xb9,0x0a,0x4b,0xb8,0x6d,0xe4,0x12,0xd1,
|
|
0x6e,0x3d,0xeb,0x21,0xae,0x6a,0x8d,0x29,0x57,0xcf,0xf5,0x00,0x87,0xd8,0x76,0x38,
|
|
0xdf,0xc1,0xf4,0x0b,0x49,0x49,0x26,0x63,0xb0,0x51,0x8a,0xdd,0xa6,0x7a,0xbb,0xb8,
|
|
0x8d,0x4a,0x53,0xae,0x92,0xf3,0x40,0xe2,0x6e,0x6c,0x70,0x09,0x6b,0x10,0x5b,0x08,
|
|
0x25,0xb6,0x5e,0xaf,0xb1,0x9b,0xeb,0x0b,0x73,0xfd,0x48,0xa9,0x39,0x81,0xe1,0x9c,
|
|
0xca,0xa6,0x81,0xed,0xa4,0x42,0x53,0xff,0x4d,0xdd,0x33,0xed,0x2a,0xbb,0x6e,0xc5,
|
|
0x8d,0xc2,0xe6,0x1c,0x57,0x92,0x35,0xa4,0x8c,0x15,0x48,0xac,0xe7,0x8c,0x2f,0x35,
|
|
0x6d,0x97,0x72,0x2d,0x2d,0x67,0xcf,0x3c,0xd7,0xe9,0x1a,0xd3,0xf3,0xad,0x84,0x3b,
|
|
0xb3,0x6c,0x0e,0x47,0xf3,0xd8,0xf1,0xc0,0x56,0xe2,0x1a,0xe0,0x36,0x38,0x1f,0x5e,
|
|
0x77,0x47,0x15,0xd7,0x05,0xb3,0x83,0xeb,0xae,0x3b,0xd8,0x94,0x63,0x47,0x09,0x33,
|
|
0xd0,0x76,0x52,0x1a,0x37,0xac,0x92,0x96,0x98,0xce,0xb4,0xc9,0xae,0xa4,0xa5,0xa6,
|
|
0x71,0x93,0x39,0xd0,0x85,0xa4,0x2c,0xce,0x44,0x76,0x9c,0x71,0x67,0xfa,0xa6,0x96,
|
|
0x4c,0x67,0x9e,0x3d,0xb2,0x82,0xcb,0xed,0x32,0x35,0xb4,0x86,0x3d,0xdf,0x38,0x89,
|
|
0x66,0x9f,0xb0,0xdb,0x65,0xd7,0x73,0xac,0xc4,0x6a,0xd3,0x16,0x3b,0x50,0x06,0xce,
|
|
0xd8,0x12,0xd3,0x76,0xd1,0xc0,0x58,0x4a,0x5a,0xc7,0xee,0x46,0x67,0x12,0x8b,0x07,
|
|
0x0a,0x27,0x99,0x06,0x48,0xd2,0x06,0xb6,0xb9,0xc4,0xa6,0x81,0x11,0xc5,0x0e,0xb1,
|
|
0x06,0x2e,0x61,0xcf,0xe3,0x2a,0xae,0x00,0xeb,0xb2,0x64,0xd3,0x3e,0xd3,0x70,0x61,
|
|
0x73,0x30,0xbd,0x1a,0xb9,0x8d,0x5c,0x8e,0xbd,0x7c,0xf2,0x06,0x06,0x20,0xab,0x97,
|
|
0xcb,0x55,0x62,0x73,0x39,0x26,0x99,0x3c,0xee,0xd0,0x12,0xd3,0x0e,0xb3,0x94,0x29,
|
|
0xc7,0x1e,0xcd,0x1f,0x38,0x05,0xa5,0x03,0x1b,0x5c,0x81,0x7c,0xae,0x33,0x59,0xa6,
|
|
0x5c,0x09,0x77,0x15,0xb3,0xb9,0x4a,0xee,0xb4,0x14,0x9b,0xaa,0x16,0x0c,0x9c,0x6b,
|
|
0xd3,0x06,0x77,0xa5,0x15,0x70,0x27,0x6d,0xc5,0x75,0xa1,0x42,0x6e,0x6c,0x72,0xc9,
|
|
0xf5,0x13,0x73,0xf3,0x38,0x4b,0xda,0x32,0x70,0x7d,0x98,0x73,0xec,0xbe,0x6d,0xa6,
|
|
0x8b,0x8e,0xb8,0xb6,0x92,0xae,0x17,0xdd,0x69,0xba,0xa0,0x4b,0x58,0xf7,0xb3,0xa3,
|
|
0x99,0xcd,0xd5,0x73,0x0e,0xe6,0xae,0x6f,0xd3,0x6d,0xc0,0x74,0x59,0x60,0x4e,0x55,
|
|
0x61,0x6a,0x61,0x60,0x04,0x07,0xf6,0xc0,0x7d,0x41,0x6c,0xa4,0x61,0x23,0x2d,0x1b,
|
|
0x05,0xb3,0x51,0x08,0x1b,0x85,0xb2,0x91,0x8e,0x8d,0xc2,0xd8,0x28,0x9c,0x2b,0x6c,
|
|
0xaa,0xc2,0xd5,0x09,0xe2,0x2a,0x05,0x71,0xb5,0x82,0xb8,0x6a,0x41,0x5c,0xbd,0x20,
|
|
0xae,0x62,0x10,0x57,0x33,0x88,0xab,0x1a,0xc4,0xd5,0xd5,0x70,0x75,0x35,0x26,0x3d,
|
|
0xae,0xae,0x86,0xab,0xab,0xe1,0xea,0x3e,0x3b,0x77,0x02,0x4d,0x9e,0x40,0x13,0x5e,
|
|
0xa0,0x89,0x13,0xe6,0xd1,0x9c,0x05,0x34,0x77,0x12,0x4d,0x9e,0x85,0x1f,0x0d,0xd0,
|
|
0xd2,0xb4,0x17,0xf0,0x3c,0xab,0xec,0x4e,0x5f,0x41,0xdd,0x1b,0x4a,0xd9,0xbb,0x13,
|
|
0xd6,0x40,0xec,0x93,0xa0,0x7b,0x43,0x66,0x37,0x56,0x82,0x78,0xb0,0x74,0xd5,0x67,
|
|
0x7d,0x54,0x9f,0xcd,0x3e,0x59,0xd0,0xd2,0xec,0x09,0x74,0xac,0x7e,0x02,0xcd,0x9a,
|
|
0x40,0x33,0xf0,0x33,0x91,0x66,0x4d,0xa4,0xa9,0x13,0x69,0xd2,0x84,0x99,0x34,0x83,
|
|
0x8d,0xe6,0x4e,0xa1,0xd9,0x53,0x50,0x82,0x65,0x2a,0xcd,0x9a,0x4a,0x33,0xa6,0xd2,
|
|
0xb3,0x2f,0xd3,0x0c,0x30,0x0b,0x4c,0x05,0xcf,0x83,0x63,0xf5,0x33,0x69,0xd6,0x4c,
|
|
0x9a,0x8c,0x5a,0x33,0x69,0xca,0x2c,0x9a,0x3d,0x0b,0xbb,0x66,0xd1,0xac,0x59,0x34,
|
|
0x69,0x16,0xcd,0x60,0x33,0x1a,0xe4,0x34,0x84,0x9f,0x19,0x6c,0x02,0x3b,0x27,0x01,
|
|
0xfc,0xcc,0x60,0x93,0xf3,0xe9,0x6b,0xe7,0x9b,0x62,0x1c,0x87,0x51,0xb3,0xc0,0x54,
|
|
0x30,0x6f,0xc2,0x64,0x16,0xee,0xb0,0x39,0xd5,0xd0,0xdc,0xf9,0x34,0x7b,0x3e,0x9a,
|
|
0x47,0x8d,0xf9,0x34,0x77,0x01,0xcd,0x5e,0x80,0x8d,0x05,0x34,0x6b,0x01,0xcd,0x80,
|
|
0x2f,0x16,0xd2,0xec,0x85,0xd8,0x5e,0x48,0xb3,0x16,0xd2,0x0c,0xfc,0xb4,0x2f,0xa1,
|
|
0x59,0x60,0xe2,0x73,0x34,0x69,0x12,0x4d,0x9a,0x4c,0x93,0xd0,0x08,0xfa,0x30,0x19,
|
|
0xdd,0x7c,0x89,0x9e,0x9d,0x00,0x6f,0xd2,0xb4,0xd9,0x34,0x63,0x06,0xcd,0x78,0x9e,
|
|
0x66,0xce,0xa2,0x99,0xb3,0x69,0xe6,0x9c,0xa9,0x34,0xf3,0x45,0x9a,0x35,0x0d,0x5d,
|
|
0x9a,0x03,0x0f,0x3c,0x4b,0x73,0xe7,0xce,0xa2,0xb9,0xf3,0x68,0x3e,0x7e,0x16,0xd0,
|
|
0xc2,0x89,0xb4,0x00,0x6d,0xcc,0xa2,0x09,0x5c,0x1c,0xc4,0x2e,0xeb,0x34,0x6c,0xa4,
|
|
0x65,0xa3,0x60,0x36,0x0a,0x61,0xa3,0x50,0x36,0xd2,0xb1,0x51,0x18,0x1b,0x85,0xb3,
|
|
0x11,0x9e,0x85,0x6c,0xcc,0xd5,0x09,0xe2,0x2a,0x05,0x71,0xb5,0x82,0xb8,0x6a,0x41,
|
|
0x5c,0xbd,0x20,0xae,0x62,0x10,0x57,0x33,0x88,0xab,0x1a,0xc4,0xd5,0xd5,0x70,0x75,
|
|
0x35,0x26,0x3d,0xae,0xae,0x86,0xab,0xab,0xe1,0xea,0x6a,0xb8,0xba,0x1a,0xae,0xae,
|
|
0x86,0xab,0xab,0xe1,0xea,0x6a,0xb8,0xba,0x5a,0xae,0xae,0x96,0xab,0x3b,0x15,0x67,
|
|
0xf5,0xe2,0xc6,0xc5,0x20,0x09,0xa4,0x80,0x34,0xb0,0x04,0x2c,0x07,0x59,0x60,0x25,
|
|
0x58,0x0d,0xd6,0x82,0xf5,0x60,0x23,0xc8,0x01,0x79,0xa0,0x00,0x14,0x82,0x22,0xb0,
|
|
0x15,0x14,0x83,0x1d,0xa0,0x04,0x94,0xd2,0xc5,0x6c,0xb4,0x9b,0x8d,0x76,0xb3,0xd1,
|
|
0x6e,0x36,0xda,0xcd,0x46,0xbb,0xd9,0x19,0x00,0x6d,0x67,0xa3,0xed,0x6c,0xb4,0x9d,
|
|
0x8d,0xb6,0xb3,0xd1,0x76,0x36,0xda,0xce,0x46,0xdb,0xd9,0x68,0x3b,0x17,0xed,0xe5,
|
|
0xa2,0xbd,0x5c,0xb4,0x97,0x8b,0xf6,0x72,0xd1,0x5e,0x2e,0xda,0xcb,0x2d,0x03,0x95,
|
|
0x60,0x1f,0xa8,0x02,0x35,0xa0,0x0e,0x34,0x80,0x26,0xba,0x98,0x07,0xbd,0x3c,0xe8,
|
|
0xe5,0x41,0x2f,0x0f,0x7a,0x79,0xd0,0xcb,0x83,0x5e,0x1e,0xf4,0xf2,0xa0,0x87,0xa5,
|
|
0xdd,0xc5,0x3c,0xe8,0xe5,0x41,0x2f,0x0f,0x7a,0x79,0xd0,0xcb,0x83,0x5e,0x1e,0xfa,
|
|
0x92,0x87,0xbe,0xe4,0xa1,0x2f,0x79,0xd0,0xce,0x83,0x76,0x1e,0xb4,0xb1,0xfc,0xbb,
|
|
0x98,0x07,0xed,0x3c,0x68,0xe7,0x41,0x3b,0xaf,0x16,0xd4,0xd3,0xb9,0x7d,0xd0,0xcd,
|
|
0x83,0x5e,0x3e,0xf4,0xf2,0xa1,0x97,0x0f,0xbd,0x7c,0xe8,0xe5,0x2f,0x03,0xd0,0xc8,
|
|
0x87,0x46,0x3e,0xda,0xcf,0x47,0xfb,0xf9,0x68,0x3f,0x1f,0xed,0xe7,0xa3,0xfd,0x7c,
|
|
0xb4,0x9f,0x8f,0xf6,0xf3,0xd1,0x7e,0x3e,0xda,0xcf,0xdf,0x41,0x6d,0xbb,0xe8,0x48,
|
|
0x3e,0x1d,0x41,0xe5,0x52,0xb6,0x12,0x3a,0x96,0x8f,0x8e,0xe5,0x43,0x20,0x1f,0x1d,
|
|
0xcb,0x47,0xc7,0xf2,0x21,0x54,0x00,0xa1,0x02,0x56,0x08,0x2b,0x8d,0xfd,0x99,0xc8,
|
|
0xa7,0x83,0xa5,0xd4,0xb6,0x05,0x09,0xfa,0x56,0x80,0xbe,0x15,0x40,0xb7,0x00,0x4d,
|
|
0x14,0xa0,0x6f,0x05,0xd0,0x2e,0x80,0x36,0x96,0xf2,0x87,0x20,0x5f,0xb0,0x9f,0x2e,
|
|
0xee,0x42,0xab,0xa5,0xab,0xe8,0x08,0x96,0x6c,0x99,0x58,0x12,0x65,0x62,0x89,0x96,
|
|
0x89,0x65,0x51,0x26,0x96,0x45,0x99,0x58,0xa2,0x65,0x62,0x89,0x96,0x89,0x25,0x5a,
|
|
0x26,0x96,0x48,0x99,0x58,0xa2,0x65,0x62,0x99,0x94,0x89,0x25,0x5a,0x26,0x96,0x4a,
|
|
0x99,0x58,0x2a,0x65,0x62,0xa9,0x94,0x89,0xa5,0x52,0x26,0x96,0x4a,0x99,0x58,0xa2,
|
|
0x65,0x62,0x69,0x94,0x89,0xa5,0x51,0x26,0x96,0x68,0x99,0x58,0xa2,0x65,0x62,0x89,
|
|
0x96,0x89,0xe5,0x53,0x66,0x15,0xa8,0x06,0x35,0xa0,0x16,0xd4,0x01,0x78,0x2c,0xb3,
|
|
0x01,0x34,0x82,0x26,0x3a,0x97,0x85,0x25,0x56,0x16,0x96,0xa5,0x59,0x58,0x92,0x66,
|
|
0x61,0x29,0x9a,0x85,0x25,0x55,0x16,0x96,0x54,0x59,0x58,0x6e,0x66,0x61,0xe9,0x95,
|
|
0x85,0xa5,0x55,0x16,0x96,0x9a,0x59,0x58,0x6a,0x66,0x61,0xa9,0x99,0x85,0xa5,0x58,
|
|
0x16,0xec,0xce,0xc2,0x72,0x2f,0x0b,0x4b,0xcd,0x2c,0x2c,0x35,0xb3,0xb0,0xf4,0xca,
|
|
0xc2,0xd2,0x2b,0x0b,0xcb,0xbf,0x2c,0x38,0x25,0x0b,0x4b,0xc3,0xac,0x75,0x00,0x4b,
|
|
0xb5,0x2c,0x2c,0xd5,0xb2,0xb0,0x54,0xcb,0xc2,0x12,0x36,0x2b,0x07,0xb0,0xdf,0xed,
|
|
0x61,0x39,0x98,0x85,0x25,0x5a,0x16,0x96,0x86,0x59,0xe8,0x7f,0x16,0xfa,0x9f,0x85,
|
|
0xfe,0x67,0xa1,0xff,0x59,0xe8,0x7f,0x16,0xfa,0x9f,0x85,0xfe,0x67,0xa1,0xff,0x59,
|
|
0xe8,0x7f,0x16,0xfa,0x9f,0x85,0xfe,0x67,0xa1,0xff,0x59,0xe8,0x7f,0x16,0xfa,0x9f,
|
|
0x85,0xfe,0x67,0x95,0x51,0x6f,0x79,0x3a,0x75,0xe7,0xec,0xc5,0x7c,0x19,0x29,0x16,
|
|
0xee,0x1f,0x55,0x57,0x60,0x4e,0xbd,0x95,0xba,0xb6,0x62,0x9e,0xbd,0x0e,0x73,0xe8,
|
|
0xad,0xd8,0x9f,0xc6,0xbe,0x58,0xd9,0x41,0x3d,0x8d,0x29,0xd4,0xbb,0xa1,0x89,0x7a,
|
|
0xf3,0x6b,0xa9,0xb7,0xa8,0x9a,0xfa,0x12,0xb3,0xa8,0x7b,0x7b,0x22,0x75,0xef,0xcd,
|
|
0xa1,0x9e,0xa4,0x8d,0xd4,0x03,0x9b,0x7a,0x57,0x60,0xd1,0x8f,0xe5,0x70,0x5f,0x71,
|
|
0x39,0xe6,0xfd,0x89,0x98,0x83,0xef,0xa3,0xee,0x5d,0xc9,0xd4,0xc3,0xbe,0x20,0xd9,
|
|
0x50,0x4a,0x7d,0xd5,0xf9,0xd4,0xb5,0x0f,0xf7,0xef,0xa6,0x12,0xea,0x5d,0xbf,0x9c,
|
|
0x7a,0xb7,0x6e,0xa1,0xee,0x0c,0xf6,0xa5,0xca,0x06,0xea,0xdd,0x54,0x40,0x5d,0x75,
|
|
0x4b,0xb1,0x36,0x58,0x4f,0xdd,0xfb,0x76,0x52,0x4f,0x46,0x3d,0xf5,0x61,0xa6,0xf2,
|
|
0x51,0x63,0x2a,0xe6,0xfc,0x55,0xd4,0x95,0x91,0x4f,0xdd,0xab,0x93,0xa9,0xbb,0x64,
|
|
0x35,0xda,0x5b,0x81,0xb9,0x7e,0x31,0xda,0x4c,0xa5,0xde,0x8d,0xb9,0xd4,0x5b,0x55,
|
|
0x46,0x7d,0xb9,0x15,0xd4,0x57,0x8a,0xb4,0xaa,0x96,0x7a,0x36,0x2f,0xc3,0x7a,0xa2,
|
|
0x89,0x7a,0xf6,0x6f,0xa2,0x5e,0xf8,0xbf,0x6f,0x59,0x32,0xf5,0x96,0xac,0xa3,0xae,
|
|
0x22,0x68,0xd4,0xc3,0x9e,0x72,0xec,0x5f,0xdc,0x88,0xb5,0xc7,0x66,0xea,0x29,0x5a,
|
|
0x8a,0xfe,0x27,0x52,0x5f,0x0e,0x34,0x8a,0x36,0x50,0x57,0xf9,0x66,0xf4,0x6b,0x35,
|
|
0x75,0x57,0x65,0x53,0x77,0x7d,0x16,0xf5,0xec,0x2d,0xa3,0x9e,0x6a,0xac,0x47,0x36,
|
|
0x66,0xc0,0x86,0x55,0xd4,0x9b,0x88,0x34,0x2d,0x17,0x40,0x63,0x7b,0x2e,0x34,0x1a,
|
|
0xa1,0x51,0x8e,0xe3,0xfb,0xa8,0x77,0x37,0x83,0xfe,0x64,0x41,0xab,0x11,0xbe,0xac,
|
|
0xa1,0xae,0xb2,0x62,0xea,0x66,0x56,0x51,0x4f,0x66,0x1a,0xf5,0xac,0xdd,0x83,0xb5,
|
|
0xca,0x7a,0xe8,0xd5,0xa1,0x4f,0x4d,0xd4,0xd5,0xb8,0x03,0x65,0x96,0x63,0x6d,0xb3,
|
|
0x8c,0xba,0xd7,0x56,0x43,0x67,0x33,0x7c,0x9f,0x44,0x5d,0x85,0xf9,0xd4,0x93,0x8b,
|
|
0x35,0xcc,0x4a,0xf8,0x65,0x27,0xd6,0x4a,0xbb,0x6b,0xa9,0xbb,0x02,0xe7,0x21,0x03,
|
|
0x3a,0x19,0x5b,0xa9,0x1b,0x63,0xbe,0x67,0xed,0x56,0xf8,0x77,0x37,0xd6,0x55,0x58,
|
|
0x23,0xa5,0x2d,0xa1,0xee,0xcd,0x8b,0xa9,0xa7,0x12,0xfe,0x58,0x82,0x73,0x5a,0xb2,
|
|
0x8a,0xfa,0xd2,0xb0,0xf4,0xcb,0xd8,0x47,0x5d,0x2b,0x71,0x0e,0xea,0x76,0x51,0xf7,
|
|
0xfa,0x14,0xf8,0x1c,0xfd,0xdd,0x82,0x73,0xb3,0x0e,0xe7,0x61,0x07,0xd2,0xda,0xf5,
|
|
0xd4,0x57,0x97,0x89,0xf3,0x9f,0x8a,0xf5,0x54,0x15,0xf5,0x36,0x40,0x1f,0xab,0xb9,
|
|
0xee,0x54,0x9c,0x9f,0x74,0xf4,0x63,0x15,0xdb,0xff,0x22,0xea,0x49,0xc1,0x5a,0x6d,
|
|
0x15,0x28,0x5e,0x4a,0x3d,0x55,0x18,0x2b,0x8b,0xa1,0x51,0xbf,0x8d,0x7a,0x57,0xef,
|
|
0xa6,0x3e,0xa6,0x88,0xfa,0x96,0x2f,0xa5,0xae,0x74,0xac,0xbf,0x96,0x62,0x4d,0xb6,
|
|
0xaa,0x01,0x63,0x21,0x1d,0xe3,0x83,0xd5,0x5d,0x42,0x5d,0x4d,0x38,0xff,0xcb,0xf1,
|
|
0x68,0xde,0xbd,0x9b,0x7a,0xf6,0x40,0x1f,0xe3,0x01,0x2b,0x0b,0xea,0xca,0x81,0x6f,
|
|
0xf6,0xa3,0x5f,0x0c,0xfc,0x87,0x6b,0xaf,0x67,0x25,0x3b,0xbe,0xb2,0xd1,0x76,0x2a,
|
|
0xf5,0xa5,0xef,0xc5,0xb9,0xd8,0x4f,0x7d,0x79,0xe9,0x58,0xf3,0x6d,0x80,0xaf,0x32,
|
|
0xa8,0x67,0x1b,0xb4,0x52,0xb1,0x3f,0xbb,0x9a,0xba,0xb1,0xa2,0xf9,0xa8,0x16,0x63,
|
|
0x22,0x29,0x1b,0xfe,0x85,0x0f,0xf6,0x34,0x51,0xf7,0x3a,0x8c,0xbf,0xb4,0x4c,0x8c,
|
|
0xd3,0x44,0xd8,0x85,0x71,0xb3,0xb8,0x9e,0xba,0xb3,0x51,0x7f,0x03,0x8e,0x2f,0x85,
|
|
0x7f,0xf2,0x60,0x43,0x41,0x25,0xc6,0xd5,0x62,0xea,0xae,0x85,0xe6,0x0a,0xf4,0x67,
|
|
0x2d,0xea,0x14,0x96,0xc0,0xef,0x2b,0xa8,0x0f,0x3e,0xef,0x4e,0x87,0xc6,0xc6,0x6a,
|
|
0xea,0x62,0x4a,0xa8,0x6b,0x2f,0xd6,0x98,0x55,0x3b,0xd1,0x4f,0xac,0x3f,0xa1,0xdf,
|
|
0x9d,0x82,0x71,0xb7,0x09,0xfe,0xca,0x86,0x6e,0x3a,0x7c,0xbe,0x02,0xfe,0x2d,0xc7,
|
|
0xb9,0xd8,0x80,0x71,0x92,0x07,0x1f,0x6e,0xde,0x8e,0xf3,0xb8,0x15,0xed,0xa6,0x52,
|
|
0xcf,0x7a,0x8c,0xa9,0x06,0xac,0x69,0x8b,0x30,0x0e,0x8a,0x0a,0xd1,0x17,0xf8,0x75,
|
|
0x19,0x6c,0x64,0x5f,0x10,0xaf,0xc8,0x83,0x9d,0x18,0xbb,0xab,0x30,0xde,0xd7,0xd7,
|
|
0xfe,0x3f,0xf6,0xde,0x06,0xa8,0xa9,0x6b,0xed,0xfb,0x5e,0x51,0x50,0xa2,0x50,0x82,
|
|
0x82,0x82,0x82,0x05,0x25,0x0a,0x96,0x40,0x52,0x93,0x96,0x20,0xb4,0xa0,0xa0,0x04,
|
|
0x12,0xbe,0xa3,0x44,0x41,0xa1,0x05,0x4c,0x20,0x91,0x04,0x12,0x20,0x90,0x40,0x02,
|
|
0x49,0x48,0x42,0x62,0x49,0x05,0x0a,0x2d,0xb4,0xa0,0xa0,0x60,0xc1,0x8a,0x10,0x05,
|
|
0x0b,0x56,0xee,0x91,0xe7,0x96,0x3e,0x32,0x23,0x33,0x72,0x17,0x5a,0x79,0x47,0x4e,
|
|
0x09,0xc2,0x3d,0xf2,0x0e,0xcc,0xc8,0x8c,0xcc,0xc8,0xcc,0xbb,0x56,0xd8,0xf6,0xf5,
|
|
0x9c,0xe7,0x9c,0xfb,0x7c,0xf5,0x9c,0xe7,0x7c,0x90,0x5f,0xd7,0x7f,0xed,0xf5,0xb1,
|
|
0xf7,0x5e,0xeb,0xba,0xae,0xb5,0xf6,0x8e,0x61,0xa6,0xf0,0x7a,0xd0,0x7e,0xdd,0xf0,
|
|
0xba,0x77,0xbe,0x02,0xb3,0x70,0x97,0x9d,0xbd,0x5d,0x05,0xd7,0x42,0x3b,0x78,0xd6,
|
|
0x09,0x7d,0x7c,0x13,0xc6,0x4d,0x95,0x02,0x3c,0x2b,0x6f,0x00,0x73,0x5d,0xd0,0x0e,
|
|
0xdf,0x2a,0xc0,0x9c,0xe1,0x16,0xbc,0x3f,0xbc,0x8e,0x16,0xae,0xcd,0x3b,0x57,0x60,
|
|
0x4c,0xc0,0xb5,0xd0,0x03,0xe3,0xfa,0x3a,0xf4,0x6f,0x2f,0x9c,0xc3,0xe7,0xd0,0x3f,
|
|
0xe8,0x1f,0xda,0xe0,0x13,0xcf,0xf2,0xed,0x45,0x18,0x1f,0x0a,0x60,0xf9,0x0c,0xa6,
|
|
0x16,0xe8,0xcb,0x86,0x5e,0x18,0x2b,0x30,0xb6,0x0c,0x70,0x6d,0x7d,0x01,0x7d,0xd9,
|
|
0x3a,0x00,0xd7,0x08,0x2c,0xb7,0xc1,0x71,0x5f,0xf9,0x04,0xda,0xbb,0x0e,0xde,0x13,
|
|
0xc6,0x58,0x3d,0x8c,0xf1,0xaf,0xe1,0xfa,0x56,0xc0,0x54,0x01,0xd7,0xf3,0x65,0xb8,
|
|
0xa6,0x2e,0x43,0x9b,0xb6,0xc2,0xef,0xe0,0xb7,0xa0,0x0f,0xe0,0x77,0xab,0xf9,0xcf,
|
|
0x6f,0x43,0xbf,0x40,0xdb,0x56,0x5c,0x85,0xf7,0x80,0xf7,0x82,0x6b,0xd8,0x52,0x05,
|
|
0xfd,0x6a,0x44,0xfb,0x06,0xfc,0x1e,0x0f,0xd7,0xa5,0xa5,0xa1,0x1d,0xde,0x17,0xde,
|
|
0x1b,0xda,0xc6,0xd2,0x0d,0xd7,0x79,0x79,0x0d,0xb4,0x23,0xb4,0x93,0x06,0xda,0xab,
|
|
0xf2,0x26,0x8c,0x79,0xb8,0x7f,0x40,0x5b,0xcd,0xc2,0x27,0xe7,0xec,0x25,0x38,0x7e,
|
|
0xf3,0x6d,0x30,0xdb,0x87,0x62,0x0e,0xda,0x4f,0x0d,0xe3,0x45,0x0b,0x7d,0x53,0x0d,
|
|
0x8f,0x2f,0x99,0xe0,0x18,0xa1,0xbf,0xe0,0x5e,0xf4,0xac,0x0d,0xda,0xae,0x0d,0x8e,
|
|
0xf3,0x8a,0x11,0x26,0xe8,0xef,0x0e,0x68,0x9f,0x6b,0x30,0xf6,0xbf,0x81,0x79,0x1f,
|
|
0xec,0xd3,0x0f,0x8f,0x07,0x6f,0x82,0x39,0x05,0xdc,0xab,0x2a,0xbb,0xe0,0x7a,0x80,
|
|
0x7e,0x30,0x7d,0x06,0xe6,0x5a,0xab,0xc1,0xdc,0x95,0x3a,0x30,0xd7,0x09,0xd7,0x55,
|
|
0x27,0xac,0xeb,0xb9,0x08,0xe6,0x7a,0x61,0x9c,0xde,0x85,0x71,0xf6,0x05,0xf4,0xc1,
|
|
0x57,0xdf,0xc1,0x58,0x83,0x31,0xa2,0x34,0x83,0xc5,0xd6,0xaa,0xeb,0x60,0x4e,0x0b,
|
|
0x0d,0xde,0x77,0x05,0x6e,0x3c,0x70,0x11,0xc1,0x41,0xcf,0xdc,0x85,0x13,0x51,0xab,
|
|
0x61,0x19,0xe6,0x55,0xd0,0xf8,0x55,0xd0,0x09,0xb5,0xb5,0x70,0xb2,0x0d,0xd0,0xc0,
|
|
0xd0,0xc1,0x97,0x7a,0xe0,0x66,0xa9,0x82,0xa9,0x06,0x58,0x3a,0x60,0xb9,0x13,0x4e,
|
|
0xfa,0xdb,0x4f,0x61,0x82,0xed,0x83,0x30,0x60,0xee,0x76,0xc1,0xc0,0xad,0x87,0x06,
|
|
0x80,0x93,0x57,0xc1,0xc5,0xac,0x6e,0x86,0x01,0x07,0x17,0x1b,0x7c,0x60,0xcc,0x56,
|
|
0x37,0x82,0x59,0xd3,0xa7,0xd0,0x20,0x75,0x70,0xf3,0xfb,0x02,0x06,0x14,0xcc,0xbf,
|
|
0x85,0xf9,0xb7,0x30,0xf0,0x15,0xd0,0x41,0xf0,0xf1,0xfa,0x4c,0x6b,0x06,0xcf,0xf4,
|
|
0x70,0x23,0x32,0x75,0x83,0x67,0x35,0x30,0xc8,0x6a,0xbe,0x05,0xcf,0xea,0x61,0x30,
|
|
0xd5,0x7f,0x05,0x9d,0x09,0x37,0x60,0xb8,0x89,0x3f,0x6b,0x82,0x4e,0x6d,0x82,0x86,
|
|
0xb8,0x0c,0x37,0xa6,0x6b,0xb0,0x5f,0x37,0xec,0x63,0x86,0x6d,0x03,0xd0,0xa9,0x46,
|
|
0xe8,0x54,0xb4,0xe1,0x37,0xc1,0xc9,0xb7,0x41,0x23,0x5c,0x81,0x1b,0xe7,0x35,0xb8,
|
|
0x99,0x7f,0x0d,0x03,0xee,0x6b,0x68,0xa8,0xeb,0x70,0x13,0x1c,0x80,0x0e,0x57,0xc2,
|
|
0x4d,0x54,0xd3,0x00,0xe6,0x75,0xd0,0x30,0x0d,0xd0,0xe9,0xf0,0xb1,0x3b,0xdf,0x5c,
|
|
0x05,0xe6,0x3b,0x3f,0x05,0x8b,0x97,0x5a,0xf4,0x48,0x54,0x60,0xf1,0x32,0x7c,0x46,
|
|
0xfd,0x7c,0xbd,0x09,0xcc,0x28,0xa0,0x99,0x14,0xfd,0x60,0xb1,0x4d,0xa7,0x83,0xd2,
|
|
0x53,0x0d,0x16,0xaf,0xc2,0xb0,0x9b,0x1f,0xac,0x00,0xf3,0x77,0x2f,0x80,0xac,0x2c,
|
|
0x90,0xc5,0x03,0x59,0xf0,0xbd,0x19,0x65,0x30,0xcf,0x17,0x83,0xf1,0x5e,0xf4,0xc7,
|
|
0x4b,0xbd,0xe8,0x8f,0x9e,0x7a,0xd1,0xdf,0x39,0xdd,0x5d,0x2b,0x76,0x81,0x1f,0x1a,
|
|
0xfe,0xab,0x17,0xfc,0x70,0xf3,0xbf,0x6e,0x83,0x1f,0x2e,0x81,0x1f,0x6a,0xc0,0x0f,
|
|
0x5f,0x80,0x1f,0x1a,0xc1,0x0f,0x4d,0xe0,0x87,0x76,0xf0,0xc3,0x35,0xf0,0x43,0xc7,
|
|
0x0f,0x4a,0x24,0xe5,0x50,0xfe,0x6b,0xc0,0x7a,0x0c,0x33,0x58,0xaa,0x46,0x67,0x54,
|
|
0xff,0x57,0x1f,0x92,0x01,0xf0,0x83,0x09,0xc9,0xa7,0x48,0x2e,0x22,0xa9,0x41,0x52,
|
|
0x8b,0xa4,0x0e,0x49,0x3d,0x92,0x06,0x24,0x9f,0x23,0xf9,0x02,0x49,0x23,0x92,0x2f,
|
|
0x91,0x34,0x23,0x69,0x41,0x72,0x19,0x49,0x2b,0x92,0x2b,0x48,0xae,0x22,0x69,0x47,
|
|
0xd2,0x81,0xe4,0xda,0xda,0x45,0xfb,0xd1,0xdd,0xbe,0x43,0x57,0xf9,0x0e,0x75,0x86,
|
|
0x52,0x0d,0x47,0x3c,0xd9,0x0d,0x26,0xbf,0x05,0x93,0x77,0xc1,0x8f,0x0a,0x30,0x79,
|
|
0x07,0x4c,0x7e,0x07,0x26,0xfb,0xc1,0x8f,0xad,0xe0,0xc7,0x2b,0xe0,0x47,0x15,0xf8,
|
|
0xb1,0x02,0xfc,0xa8,0x01,0x3f,0x56,0x82,0x1f,0x8d,0xe0,0x47,0x03,0xf8,0xf1,0x02,
|
|
0xf8,0x51,0x0b,0x7e,0xac,0x07,0x3f,0x9a,0xc0,0x8f,0x1d,0xe0,0xc7,0x6f,0xc0,0x8f,
|
|
0x3d,0xe0,0xc7,0x6e,0xf0,0xe3,0x1d,0xf0,0xe3,0xb7,0xe0,0x27,0x05,0xf8,0x49,0x09,
|
|
0x7e,0xbc,0x0b,0x7e,0xfa,0x14,0xfc,0x74,0x11,0xfc,0xd8,0x05,0x7e,0xaa,0x04,0x3f,
|
|
0x69,0xc0,0x4f,0x5a,0xf0,0x53,0x15,0xf8,0x49,0x0d,0x7e,0xd2,0x81,0x9f,0xaa,0xc1,
|
|
0xa4,0x0e,0x4c,0x5c,0x99,0xb8,0x0a,0xe5,0xa7,0x5a,0x28,0x93,0x5a,0x74,0x54,0x89,
|
|
0x44,0x83,0xc4,0x5a,0xac,0x46,0x0d,0xb0,0xb7,0x01,0x75,0xed,0x44,0xd2,0x85,0x6a,
|
|
0xd4,0x48,0xf4,0x60,0xa2,0x1d,0xd5,0xb5,0xa3,0xba,0xf6,0x89,0xeb,0x50,0x50,0x43,
|
|
0x3b,0xba,0x6e,0x3b,0x6a,0xbd,0x86,0x5a,0xaf,0xa1,0xd6,0x6b,0xa8,0xf5,0x1a,0x6a,
|
|
0xbd,0x86,0x5a,0xaf,0xa1,0xd6,0xaf,0x51,0xeb,0xd7,0xa8,0xee,0x6b,0x54,0xf7,0x35,
|
|
0xaa,0xeb,0x44,0x9d,0x3b,0x51,0x5d,0x17,0x6a,0xed,0x42,0x47,0xd7,0xd1,0xd1,0x75,
|
|
0xd4,0x70,0x1d,0x15,0x7b,0x50,0xb1,0x07,0x15,0x7b,0xd0,0x45,0x7b,0x50,0x9d,0x19,
|
|
0x15,0xcd,0xe8,0xe8,0x16,0x6a,0xbd,0x85,0x8a,0xb7,0x50,0xeb,0x2d,0x54,0x77,0x1b,
|
|
0x15,0x6f,0xa3,0xa3,0x3e,0x24,0xfd,0xa8,0x4b,0x3f,0x3a,0xba,0x83,0x8e,0xee,0xc0,
|
|
0xa3,0x49,0x25,0x3c,0x82,0xd2,0x85,0xe4,0x3a,0x14,0x6b,0x1d,0x1c,0x15,0x14,0x3d,
|
|
0x98,0x2c,0x47,0x0d,0xe5,0xa8,0xae,0x1c,0xd5,0x95,0xa3,0xba,0x0a,0x68,0x38,0x28,
|
|
0x9d,0x48,0xba,0x90,0xc0,0xd3,0x2a,0x26,0x55,0x48,0xd4,0x48,0x74,0x48,0x60,0x3f,
|
|
0x15,0xea,0xa2,0x42,0x5d,0x54,0xa8,0x8b,0x0a,0xb5,0xaa,0x50,0xab,0x0a,0xb5,0xaa,
|
|
0x51,0xab,0x1a,0xb5,0xaa,0x51,0xab,0x1a,0xb5,0xaa,0x51,0xab,0x1a,0xb5,0x6a,0x50,
|
|
0xab,0x06,0xb5,0x6a,0x50,0xab,0x06,0xb5,0x6a,0x50,0xab,0x06,0xb5,0x56,0xa2,0xd6,
|
|
0x4a,0x54,0x57,0x89,0xea,0x2a,0x51,0x9d,0x1e,0xd5,0xe9,0xd1,0x19,0x7a,0x74,0x86,
|
|
0x1e,0xb5,0xea,0x51,0xab,0x1e,0x59,0xf7,0xc6,0xe4,0x0d,0x30,0xd1,0x0d,0x65,0x52,
|
|
0x07,0xc5,0x73,0xd2,0x30,0x69,0x82,0x6a,0xb4,0xea,0x05,0xab,0x7e,0x62,0xd5,0x6a,
|
|
0xab,0x9a,0x50,0xef,0x2b,0x13,0xdd,0x48,0x6e,0x22,0x7f,0x6b,0x90,0x97,0xbb,0x91,
|
|
0xdc,0x44,0x0e,0xd6,0x20,0xb7,0x76,0x23,0xb9,0x89,0x3c,0xaa,0x41,0x1e,0xed,0x46,
|
|
0x72,0x13,0x39,0x53,0x83,0xa6,0x74,0x15,0x8d,0xbc,0x1b,0xc9,0x4d,0x34,0x68,0x0d,
|
|
0x1a,0x56,0x37,0x92,0x9b,0x68,0x44,0x28,0xca,0x90,0x93,0xae,0x4c,0x56,0xa2,0xeb,
|
|
0x55,0xa2,0xab,0x54,0x22,0x67,0x5a,0xed,0x54,0x89,0xce,0xa8,0x44,0xf3,0xba,0x81,
|
|
0x3a,0x57,0xa2,0x8b,0x56,0x22,0x7f,0x43,0xe9,0x45,0xde,0xeb,0x45,0xad,0x0a,0xeb,
|
|
0xc0,0x61,0xf6,0xc9,0x5a,0x86,0x86,0x0e,0x7d,0xad,0x43,0xa2,0x47,0x6e,0xd6,0x21,
|
|
0xd1,0x23,0x37,0xeb,0x90,0xe8,0xd1,0x15,0x74,0x48,0xf4,0xe8,0x0a,0x3a,0x24,0x7a,
|
|
0x14,0x68,0x3a,0x24,0x28,0x02,0xd1,0x51,0x27,0x3a,0xba,0x8e,0x8e,0xae,0xa3,0x23,
|
|
0x33,0x3a,0x32,0xa3,0xa3,0x5b,0xe8,0xe8,0x96,0xf5,0x5c,0x14,0x3b,0xbd,0x28,0xb2,
|
|
0x7a,0xd1,0x1c,0x7a,0xd1,0xd4,0x7b,0x90,0x98,0x91,0xdc,0x42,0x72,0x75,0xb2,0xca,
|
|
0xba,0x06,0xac,0x61,0xbf,0x16,0xd0,0xd7,0xd6,0x42,0xfa,0xda,0x5a,0x28,0x5f,0xb3,
|
|
0xfa,0xdf,0x9a,0x75,0xad,0x65,0xd7,0xad,0xd1,0x8f,0x4a,0x5d,0xd6,0x10,0xb0,0x66,
|
|
0x3a,0x6b,0xbc,0xaf,0x85,0x7d,0xe7,0x5a,0xe0,0x77,0xae,0xcd,0xc1,0xda,0xb3,0x67,
|
|
0xed,0x2a,0x3d,0xd6,0xe8,0x41,0x4b,0x01,0x5b,0x0c,0x56,0x1b,0xad,0xdd,0xaf,0x77,
|
|
0x6d,0x46,0xbd,0x6b,0x77,0xe8,0x5d,0x6b,0xbb,0xb5,0x36,0xeb,0x5b,0x6b,0x63,0xb9,
|
|
0xbd,0x76,0xb1,0xdb,0x6b,0x6d,0xb7,0xd7,0xee,0xde,0xbf,0x36,0xf8,0xfe,0xb5,0xca,
|
|
0xfe,0xb5,0xb1,0xdc,0x59,0x2b,0xdd,0x59,0xeb,0x72,0x67,0x2d,0x5e,0x95,0xd6,0xab,
|
|
0xa0,0x45,0x82,0xad,0x15,0x6b,0x9c,0x5b,0xef,0x6e,0xcd,0xf4,0x6b,0x99,0xce,0xba,
|
|
0x20,0xd6,0x96,0xc4,0xf5,0xb5,0xa5,0x80,0x45,0x7f,0x17,0xb6,0x12,0xac,0x2b,0x60,
|
|
0xed,0x04,0xb5,0x75,0xb6,0x28,0x5b,0xab,0xbc,0xbe,0xd6,0xe5,0xfa,0x5a,0xa9,0x13,
|
|
0x85,0x49,0xe5,0xda,0x0a,0xaa,0x5c,0xbb,0x9f,0x66,0xed,0x74,0xcd,0xda,0x8d,0x34,
|
|
0x6b,0xe7,0x69,0xac,0xc6,0x42,0x8b,0xc7,0xba,0xa4,0xd6,0x86,0xab,0x5f,0x9b,0x43,
|
|
0xfb,0x9a,0x7f,0xaf,0xad,0x99,0xe7,0xda,0x9a,0x59,0xaf,0xbd,0xae,0xbc,0xbe,0xb6,
|
|
0x55,0x59,0xa7,0x79,0x6d,0x6d,0xee,0x9d,0x6b,0xa5,0xce,0x35,0xd3,0x75,0xbe,0x76,
|
|
0x8e,0xb5,0xa7,0x79,0x2d,0x80,0x7a,0xd7,0xb2,0x5b,0xaf,0x27,0xdd,0x69,0xcd,0xd6,
|
|
0xee,0xae,0x5f,0xab,0xd4,0xaf,0x55,0xea,0xd7,0x2a,0xd5,0x6b,0x59,0xf9,0xeb,0x35,
|
|
0xdf,0xb5,0x16,0xb8,0xd6,0x52,0xc5,0x2f,0x1b,0x01,0xb6,0x47,0xbc,0xbe,0xa6,0x7a,
|
|
0xad,0x4d,0xbd,0x36,0x16,0xbd,0x75,0xbf,0xc4,0x6c,0x86,0x32,0xe5,0xda,0x38,0xdb,
|
|
0xd7,0xda,0x7a,0xd6,0xce,0xd3,0xac,0x4d,0xd3,0x3c,0xa9,0x82,0xcf,0x05,0x78,0x3f,
|
|
0x94,0xc1,0x20,0x55,0x59,0x17,0x1b,0x3c,0xa8,0xb0,0x2e,0xef,0x35,0x27,0x4c,0x7c,
|
|
0x63,0xed,0xb8,0xb6,0x4f,0x76,0xc3,0xe0,0xd2,0xc2,0xbd,0x0d,0x96,0x54,0xd6,0xa5,
|
|
0x38,0xa9,0x85,0x35,0x2a,0x6b,0xb8,0x59,0x37,0xb3,0xb5,0xcc,0xf3,0xf5,0xc5,0x3c,
|
|
0x5f,0x77,0xf4,0xfc,0xff,0x3b,0x76,0x4e,0xaa,0x3c,0x91,0x58,0xfb,0xc0,0xdb,0x75,
|
|
0xff,0x64,0x40,0x87,0xc0,0x0f,0xfc,0xac,0x50,0x82,0x20,0xe0,0x05,0x3e,0x84,0x47,
|
|
0x75,0x30,0x7d,0x06,0x7e,0xa3,0x40,0x7f,0x56,0x75,0x11,0x9c,0x05,0x25,0x40,0x0e,
|
|
0x6b,0x6a,0x60,0x82,0x2f,0x0e,0x8a,0x6a,0x98,0x4c,0x30,0xe9,0x61,0xaa,0x82,0xc9,
|
|
0x00,0x93,0x11,0xa6,0x0b,0x30,0x7d,0x02,0x4e,0x83,0x54,0xb0,0x0f,0xec,0x07,0x07,
|
|
0x01,0x09,0x04,0x83,0x0f,0x40,0x0a,0xf0,0x06,0x44,0x10,0x0a,0x77,0xb2,0x2a,0xb4,
|
|
0x33,0x54,0xa1,0x0d,0x0f,0x6d,0x77,0x68,0xb3,0xb3,0x6e,0x1c,0x68,0xbf,0xb3,0x6e,
|
|
0x1d,0x68,0xcb,0xb3,0x6e,0x1e,0x68,0xd7,0x43,0x07,0x68,0xfb,0xfb,0x14,0x1d,0x40,
|
|
0x03,0xb5,0x80,0x89,0x4b,0x60,0xe2,0x32,0x98,0x68,0x05,0x13,0x6d,0x70,0xb3,0x02,
|
|
0xe8,0x89,0xd9,0x0e,0x26,0x3a,0x60,0x50,0xc0,0x3d,0x09,0x58,0x9f,0x53,0x00,0xad,
|
|
0x2b,0x68,0x32,0xb4,0xbf,0x02,0xb4,0x01,0xf6,0xc0,0x40,0x80,0x66,0x81,0x71,0x00,
|
|
0x17,0x13,0x7c,0xf0,0x40,0xdb,0xc1,0xb5,0x02,0x1d,0x03,0x0d,0x0f,0x5d,0x07,0xd0,
|
|
0x93,0x02,0x05,0x27,0xb0,0x5a,0x13,0xac,0xb9,0xf5,0x12,0x92,0xcb,0x48,0xda,0x90,
|
|
0x5c,0x05,0x7b,0xc1,0x01,0x10,0x00,0xce,0x00,0x19,0x28,0x05,0xbf,0xb9,0xa2,0x86,
|
|
0x09,0xfd,0xa2,0x83,0x7e,0xe9,0x41,0x3f,0xa4,0x5c,0x86,0xa9,0x0d,0xa6,0xab,0x30,
|
|
0xa1,0x7f,0xc8,0x85,0xe5,0x0a,0x58,0x86,0xef,0xd6,0x3f,0x57,0x54,0x80,0xb5,0x7f,
|
|
0xd2,0x45,0x3f,0x28,0x34,0x00,0xf4,0xc3,0xf8,0x7f,0x5c,0x02,0xff,0x71,0x19,0xfc,
|
|
0x47,0x27,0xf8,0x8f,0x2b,0xe0,0x3f,0xda,0xc0,0x6f,0xe0,0x29,0xbf,0xa9,0x29,0x07,
|
|
0xbf,0x81,0x5f,0xdb,0x7e,0xa3,0x31,0xc1,0xf4,0x29,0x4c,0x17,0xc1,0x6f,0xea,0x9a,
|
|
0xc1,0x6f,0x3e,0xab,0x02,0x8b,0xd5,0xd5,0xed,0x48,0x3a,0x90,0x5c,0x43,0xf2,0x35,
|
|
0x92,0x4e,0x24,0x5d,0x48,0xae,0x23,0xf9,0x06,0xc9,0x0d,0x24,0xdd,0x48,0x6e,0x22,
|
|
0xe9,0x41,0xd2,0x8b,0xc4,0x8c,0xe4,0x16,0x92,0xdb,0x48,0xfa,0x90,0xf4,0x23,0xb9,
|
|
0x83,0xe4,0x5b,0x24,0x03,0x48,0x06,0x91,0xdc,0x45,0xf2,0x1d,0x14,0x93,0x02,0x89,
|
|
0x12,0x49,0x39,0x92,0x0a,0x24,0x2a,0x24,0x6a,0x24,0x1a,0x24,0x95,0x48,0xb4,0x48,
|
|
0x74,0x48,0xf4,0x48,0xd0,0x98,0x4d,0x06,0x24,0x46,0x24,0x17,0x90,0x7c,0x02,0xe5,
|
|
0x62,0x3d,0x92,0x06,0x24,0x9f,0x23,0xf9,0x02,0x49,0x23,0x92,0x26,0x24,0x5f,0x22,
|
|
0xf9,0x0a,0x49,0x33,0x92,0x16,0x24,0x97,0x90,0x5c,0x46,0xd2,0x8a,0xa4,0x0d,0xc9,
|
|
0x15,0x24,0x57,0x91,0x20,0xbb,0x5c,0x44,0x76,0xb9,0x88,0xec,0x72,0x11,0xd9,0xe5,
|
|
0x22,0xb2,0xcb,0x45,0x64,0x97,0x8b,0xc8,0x2e,0x17,0x91,0x5d,0x2e,0x22,0xbb,0x5c,
|
|
0x44,0x76,0xb9,0x88,0xec,0x72,0x11,0xd9,0xe5,0x22,0xb2,0xcb,0x45,0x64,0x97,0x8b,
|
|
0xc8,0x2e,0x17,0x91,0x5d,0x2e,0x22,0xbb,0x5c,0x44,0x76,0xb9,0x88,0xec,0x72,0x11,
|
|
0xd9,0xa5,0xee,0x33,0x24,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,
|
|
0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,
|
|
0x68,0xe0,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,
|
|
0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,
|
|
0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,
|
|
0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,
|
|
0xb8,0x75,0x68,0xb8,0x75,0xd6,0x91,0x0e,0x80,0xff,0x5d,0x0d,0xfe,0xb7,0x09,0x7c,
|
|
0xdf,0x00,0xbe,0xbf,0x0c,0xfe,0xbb,0xeb,0x0a,0xf8,0xbe,0x0d,0x7c,0xdf,0x0a,0xa6,
|
|
0x6f,0x99,0xc0,0x48,0x3d,0x18,0xf9,0x12,0x7c,0xdf,0x01,0x46,0x2e,0x81,0xef,0xbf,
|
|
0x00,0xdf,0x37,0x82,0x91,0xab,0xe0,0x7b,0x15,0xf8,0xfe,0x1a,0xf8,0x1e,0x0e,0xa1,
|
|
0x69,0x40,0x05,0xfe,0xfb,0xcb,0x0b,0x60,0xe4,0x3a,0x3a,0x56,0x83,0xef,0x2f,0xa0,
|
|
0x5c,0x03,0x46,0x6e,0x81,0x91,0xdb,0x60,0xe4,0x0e,0x2a,0x69,0xc1,0xc8,0x5d,0xf0,
|
|
0x7d,0x3b,0xf8,0xfe,0x0a,0xbc,0x36,0x3c,0xf9,0x2a,0xf8,0x4d,0x77,0x37,0xf8,0xfe,
|
|
0x13,0xf0,0x7d,0x0b,0xf8,0x1e,0x5e,0xb5,0x1e,0xfc,0xa7,0x02,0xfc,0xa7,0x12,0xfc,
|
|
0x67,0x39,0xea,0xad,0x47,0x82,0x0c,0xd3,0x83,0x82,0xa8,0x07,0x05,0x51,0x0f,0x0a,
|
|
0xa2,0x1e,0x14,0x44,0x3d,0x28,0x88,0x7a,0x50,0x10,0xf5,0xa0,0x20,0xea,0x41,0x41,
|
|
0xd4,0x83,0x82,0xa8,0x07,0x05,0x51,0x0f,0x0a,0xa2,0x1e,0x14,0x44,0x3d,0x28,0x88,
|
|
0x7a,0x50,0x10,0xf5,0xa0,0x20,0xea,0x41,0x41,0x84,0xbe,0xa2,0x54,0xf7,0x98,0x90,
|
|
0x7c,0x8a,0xe4,0x22,0x92,0x1a,0x24,0xb5,0x48,0xea,0x90,0x20,0x9f,0xf5,0x20,0x9f,
|
|
0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,
|
|
0x58,0x87,0x86,0x7c,0xd6,0x83,0x7c,0xd6,0x83,0x7c,0xd6,0x83,0x82,0xad,0x07,0x39,
|
|
0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,
|
|
0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,
|
|
0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x05,0x9b,0x19,0x15,
|
|
0xcd,0xa8,0x68,0xb6,0x16,0x91,0x33,0xcd,0xc8,0x99,0x66,0xe4,0x4c,0x33,0x72,0xa6,
|
|
0x19,0x39,0xd3,0x8c,0x9c,0x69,0x46,0xce,0x34,0xa3,0xd8,0x33,0x23,0x8f,0x9a,0xd1,
|
|
0x9a,0x34,0xa3,0x35,0x69,0x46,0x6b,0xd2,0x8c,0xd6,0xe4,0x2d,0x64,0xce,0x5b,0xc8,
|
|
0x9c,0xb7,0x90,0x39,0x6f,0x21,0x73,0xde,0x42,0xe6,0xbc,0x05,0xcd,0x69,0xba,0xac,
|
|
0x40,0xa2,0x44,0x52,0x8e,0xa4,0x02,0x89,0x0a,0x89,0xb5,0x55,0x83,0xa4,0x12,0x89,
|
|
0x16,0x89,0x0e,0x89,0x1e,0x49,0x15,0x12,0x03,0x12,0x23,0x92,0x0b,0x48,0x3e,0x41,
|
|
0x52,0x8d,0xc4,0x84,0xe4,0x53,0x24,0x17,0x91,0xd4,0x20,0xa9,0x45,0x52,0x87,0xe4,
|
|
0x33,0x24,0xf5,0x48,0x1a,0x90,0x7c,0x8e,0xe4,0x0b,0x24,0x8d,0x48,0x9a,0x90,0x7c,
|
|
0x89,0x04,0x1a,0xbb,0xae,0xbf,0x19,0x49,0x0b,0x92,0x4b,0x48,0x2e,0x23,0x69,0x45,
|
|
0xd2,0x86,0xe4,0x0a,0x92,0xab,0x48,0xda,0x91,0x74,0x20,0xb9,0x86,0xe4,0x6b,0x24,
|
|
0x9d,0x48,0xba,0x90,0x5c,0x47,0xf2,0x0d,0x92,0x1b,0x48,0xba,0x91,0xdc,0x44,0xd2,
|
|
0x83,0xa4,0x17,0x89,0x19,0xc9,0x2d,0x24,0xb7,0x91,0xf4,0x21,0xe9,0x47,0x72,0x07,
|
|
0xc9,0xb7,0x48,0x06,0x90,0x0c,0x22,0xb9,0x8b,0x04,0x5a,0xb7,0xee,0x0e,0x6a,0xb8,
|
|
0x83,0x1a,0xee,0xa0,0x86,0x3b,0xa8,0xe1,0x0e,0x6a,0xf8,0x56,0x81,0x44,0x89,0xa4,
|
|
0x1c,0x49,0x05,0x12,0x15,0x12,0x35,0x12,0x0d,0x92,0x4a,0x24,0x5a,0x24,0x3a,0x24,
|
|
0x7a,0x24,0x55,0x48,0x0c,0x48,0x8c,0x48,0x2e,0x20,0xf9,0x04,0x49,0x35,0x12,0x13,
|
|
0x92,0x4f,0x91,0x40,0xc3,0x36,0xa9,0x3f,0x83,0xa9,0x0d,0x1d,0xd4,0xff,0xd6,0x01,
|
|
0x4c,0xd7,0xdf,0x2c,0x7c,0xf3,0x66,0xe1,0xc6,0x9b,0x85,0xee,0x37,0x0b,0xd0,0x20,
|
|
0x4d,0x9a,0x7e,0xec,0x4a,0x9a,0x3b,0xaf,0x0f,0xfa,0xdf,0xb8,0xe4,0x5a,0xed,0xeb,
|
|
0x42,0xff,0x1b,0xd7,0xff,0xa5,0xe5,0x1b,0x70,0xbf,0x1b,0x3c,0xb8,0x0d,0x7e,0xa3,
|
|
0xad,0x84,0x09,0xce,0xfd,0xcb,0xd6,0x4b,0x48,0x2e,0x23,0x69,0x45,0xd2,0x86,0xe4,
|
|
0x0a,0x92,0xab,0x48,0xda,0x91,0x74,0x20,0xb9,0x86,0xe4,0x6b,0x24,0x9d,0x48,0xba,
|
|
0x90,0x5c,0x47,0xf2,0x0d,0x92,0x1b,0x48,0xba,0x91,0xdc,0x44,0xd2,0x83,0xa4,0x17,
|
|
0x89,0x19,0xc9,0x2d,0x24,0xb7,0x91,0xf4,0x21,0xe9,0x47,0x72,0x07,0xc9,0xb7,0x48,
|
|
0x06,0x90,0x0c,0x22,0xb9,0x8b,0x04,0x3a,0xe8,0xcb,0x36,0x05,0x12,0x25,0x12,0x34,
|
|
0xc8,0x36,0xf8,0x60,0xbf,0x0e,0x7e,0x6c,0x01,0x93,0xdf,0x00,0xb2,0x1f,0xa0,0xf8,
|
|
0x81,0x77,0xfd,0xc0,0x21,0x3f,0x40,0xf5,0x03,0x34,0x3f,0xf0,0x9e,0x1f,0x78,0xdf,
|
|
0x0f,0x04,0xfa,0x01,0x3a,0x7a,0xe9,0xa9,0xc9,0x47,0x2f,0x35,0x85,0xc5,0x80,0x5b,
|
|
0x00,0xf2,0x33,0x40,0x7e,0x3e,0x10,0x0a,0x0b,0x40,0xe1,0xc7,0x40,0x00,0xff,0xcb,
|
|
0x00,0x82,0x3c,0x90,0x91,0x0d,0x7e,0x56,0x7e,0xfb,0xb3,0xb2,0xca,0xfa,0x1b,0x7f,
|
|
0x39,0xfa,0x9b,0xcd,0xcf,0x80,0xe5,0x13,0xf4,0x47,0x1c,0x95,0xc0,0xd2,0xfa,0x39,
|
|
0x98,0xbb,0x7a,0x19,0xcc,0xdc,0x69,0x05,0xb3,0xf5,0xcd,0xe0,0x99,0xaa,0x05,0x58,
|
|
0x74,0x46,0x60,0xb9,0x6b,0x00,0x16,0x8d,0x11,0xcc,0xc2,0xad,0xdc,0xa2,0x6d,0x02,
|
|
0xcf,0xcc,0xe5,0x60,0xee,0x66,0x07,0xb0,0x5c,0x86,0x65,0xf8,0xf4,0x9d,0x1d,0xa8,
|
|
0x01,0xb3,0xfa,0x5a,0x30,0x6b,0xac,0x05,0xf3,0x4a,0x3d,0x98,0x35,0x54,0x82,0x59,
|
|
0xdd,0x45,0xf0,0xec,0x8a,0x12,0x3c,0xeb,0x40,0xff,0xd4,0xa8,0x05,0xb3,0x77,0x14,
|
|
0xe0,0x59,0x0d,0xbc,0x9f,0xee,0x26,0xb0,0xc0,0x9d,0x7f,0x5e,0x8d,0xde,0xb2,0x6a,
|
|
0x66,0x1b,0x3b,0xd7,0xde,0xc3,0x6a,0x66,0xfa,0x74,0xaf,0x8f,0xee,0x18,0xb0,0x23,
|
|
0xcb,0xf5,0xd7,0x75,0xcf,0xca,0xfb,0xb1,0x23,0x78,0xe1,0xd7,0x75,0x5f,0x7c,0xf6,
|
|
0xba,0x5f,0x55,0xd3,0xeb,0xd6,0x5a,0x6b,0x9d,0xe5,0x2e,0x9a,0xd5,0x37,0x60,0xa6,
|
|
0x6f,0x10,0xa6,0x3e,0x30,0xd3,0x0f,0xed,0xd9,0xac,0xba,0x04,0x66,0x06,0x9b,0xc1,
|
|
0xcc,0xdd,0x6f,0x81,0x45,0x51,0x0e,0x2c,0x4a,0x38,0x34,0xf8,0x26,0x63,0x41,0xbf,
|
|
0xa1,0x7f,0x0a,0x57,0x76,0x73,0x3d,0xac,0x50,0xa3,0x3f,0x11,0x6a,0x85,0x09,0xfa,
|
|
0xac,0xb9,0xa6,0x11,0xb6,0xf4,0xc3,0x02,0x0c,0x88,0xe6,0xda,0x2a,0x68,0x05,0x78,
|
|
0x5d,0x4d,0x2b,0x98,0xf9,0x16,0x59,0x04,0x06,0x43,0x47,0xe5,0x57,0xd0,0x24,0xf0,
|
|
0xcd,0xe8,0x22,0xca,0xe1,0x75,0x75,0x1a,0x98,0x6e,0x83,0x9f,0x6b,0xd0,0x9f,0xd4,
|
|
0xaa,0x61,0x82,0x65,0xa3,0x0e,0xa6,0xcf,0x61,0x82,0xd3,0x37,0x0e,0xc2,0x04,0xdd,
|
|
0xdc,0xdc,0xde,0x09,0x9e,0x29,0xa1,0xfd,0x3e,0xd1,0xc3,0x04,0x77,0x94,0x66,0xf4,
|
|
0x77,0x44,0x9f,0x7c,0x0d,0x53,0x37,0x34,0x18,0x3c,0x0b,0x8e,0xc8,0x02,0xdf,0x6f,
|
|
0x2c,0xf0,0x9d,0xc4,0x62,0x6a,0x87,0xe5,0x4b,0xc0,0x02,0x9f,0xf0,0x96,0x9a,0x6a,
|
|
0x60,0xa9,0xbd,0x08,0x13,0xec,0x5f,0xa7,0x82,0x09,0x9e,0x03,0x9f,0xac,0x96,0xcf,
|
|
0xe0,0x8c,0x1a,0xeb,0x60,0x82,0x43,0x6c,0x30,0xc1,0xd4,0x0b,0x1d,0x74,0x1d,0x58,
|
|
0xbe,0xba,0x00,0x13,0x3c,0x6e,0x86,0x8e,0xfc,0x12,0x4e,0xa1,0x19,0x3a,0xa0,0x19,
|
|
0xde,0xe3,0x12,0x1c,0x7e,0x0b,0x7c,0x19,0xb1,0x5c,0x86,0x15,0x97,0x6f,0x43,0xef,
|
|
0xc3,0x9b,0xc2,0x25,0x61,0x69,0x83,0xcb,0xa2,0xe5,0x73,0x18,0xfd,0x2d,0x5f,0x5c,
|
|
0x03,0x96,0xab,0x9d,0xc0,0xd2,0xfe,0x05,0x4c,0x57,0xe1,0x71,0x3d,0xb0,0x74,0x5c,
|
|
0x01,0x3f,0x7f,0x71,0x1d,0xa6,0x01,0x60,0xe9,0x84,0x43,0xeb,0x84,0x81,0xdb,0x72,
|
|
0x15,0x1e,0x7c,0x53,0x01,0x13,0xec,0xf0,0x0d,0x5c,0x00,0x2d,0x9d,0xe8,0xe0,0x3b,
|
|
0x60,0xb9,0x01,0xaf,0x39,0x78,0x11,0xfc,0xfc,0xa5,0x12,0x58,0xba,0x9b,0x81,0x05,
|
|
0x3e,0x43,0x2d,0x37,0xe1,0x06,0xd2,0x72,0x1b,0xde,0xd8,0x5c,0x81,0x0e,0xae,0xc0,
|
|
0x03,0x38,0x4c,0x33,0x9c,0x06,0x7c,0x4c,0x58,0x6e,0xc3,0x98,0xbb,0x7d,0x09,0xfc,
|
|
0xdc,0xfc,0x0d,0xcc,0xa1,0xb1,0xfa,0xe0,0xd4,0xa1,0x17,0x2d,0x70,0x0f,0xfd,0xb9,
|
|
0x05,0x8e,0xec,0x92,0x06,0x5a,0xbb,0x05,0x76,0xbc,0x03,0x8d,0x77,0x07,0xce,0xfb,
|
|
0x0e,0x5c,0x61,0xd7,0x2e,0xa0,0x7f,0x13,0x34,0x74,0x83,0x39,0x2d,0xbc,0xd1,0x00,
|
|
0x3c,0x1d,0x3d,0x1c,0x2e,0xeb,0xe1,0x92,0xbb,0x52,0x09,0x2d,0x8f,0x7e,0x4f,0x18,
|
|
0xfc,0x1a,0xd6,0x42,0x9b,0xdd,0x85,0xe5,0xef,0xa0,0x2d,0xbe,0x83,0x76,0xfa,0x0e,
|
|
0x06,0x6f,0xb9,0x12,0xfc,0x0c,0x57,0xe4,0xcf,0xad,0x70,0x97,0xbf,0xf4,0x05,0x8c,
|
|
0x64,0xb8,0x12,0x66,0xd5,0xe8,0xdf,0x45,0x0d,0x30,0xdd,0x01,0xb3,0x9a,0x9b,0x30,
|
|
0xc1,0x15,0xa1,0xf9,0x06,0xcc,0x56,0xa2,0x7f,0x9c,0x47,0x3f,0x4a,0x7c,0x01,0x23,
|
|
0xbc,0x09,0x46,0x7d,0x37,0x98,0xad,0x82,0xe7,0x18,0xe1,0x2e,0x78,0xa9,0x13,0x9e,
|
|
0x60,0x18,0x84,0x15,0x03,0xb0,0xa2,0x1d,0xcc,0x5e,0xa8,0x00,0xb3,0x9f,0xc0,0x9d,
|
|
0xe5,0xd2,0x37,0xb0,0x57,0xf5,0x25,0x58,0x50,0xc3,0x4a,0x38,0x8f,0xf6,0xeb,0x60,
|
|
0xd6,0xd4,0x01,0xd3,0x5d,0x30,0xfb,0x29,0xbc,0x8a,0x09,0x06,0x4c,0x47,0x27,0x98,
|
|
0xad,0x85,0x2e,0xb9,0x0c,0xbf,0x8a,0xcc,0x7e,0x76,0x19,0xcc,0x7e,0xd1,0x07,0x66,
|
|
0x1b,0x74,0xe0,0xe7,0x4e,0xf8,0xae,0x0d,0x0d,0xfd,0xf3,0xd7,0xd0,0x62,0xf0,0x85,
|
|
0xda,0xa2,0x81,0x0b,0xad,0x51,0x01,0x66,0x3f,0x6f,0x04,0x73,0xe5,0x5d,0x60,0xe6,
|
|
0x93,0x06,0x58,0x6e,0x01,0xb3,0x4d,0x70,0x68,0x4d,0x17,0xd1,0x3f,0x88,0x42,0x03,
|
|
0x75,0xe9,0xc0,0xec,0x57,0x70,0xec,0x5f,0xc2,0x3b,0xb6,0x40,0xdb,0x5c,0x36,0x75,
|
|
0x81,0xd9,0x4b,0x17,0xc0,0x6c,0xf3,0x57,0x60,0xb6,0x15,0x0e,0x18,0xee,0x2d,0xb3,
|
|
0x57,0xe0,0x5d,0xae,0x5e,0x03,0xb3,0xd7,0xa0,0xaf,0x2f,0x7f,0x0e,0x0b,0x5f,0x7f,
|
|
0x01,0x7e,0xbe,0x51,0x0f,0x66,0x3b,0xe1,0x73,0xed,0xf2,0xa5,0xab,0x60,0xb6,0x0b,
|
|
0x7e,0x4d,0xea,0x86,0x67,0x75,0x41,0x13,0x5c,0x87,0x67,0x5e,0x87,0x9b,0xd6,0xe5,
|
|
0x6b,0xc8,0x7f,0xbd,0xf0,0x79,0x70,0xf9,0x6b,0x78,0x07,0xd8,0xbc,0x78,0xf9,0x26,
|
|
0x9c,0xf1,0xcd,0xef,0xc0,0x2c,0x7c,0xc3,0x99,0xed,0x86,0xe7,0xf5,0xd6,0xc1,0x04,
|
|
0x27,0x67,0x86,0x93,0x84,0xef,0x03,0xb3,0xe8,0x91,0x7e,0x19,0xfd,0x28,0xd0,0xdb,
|
|
0x0b,0x66,0xfb,0xa0,0x1d,0xe1,0x83,0xef,0xe7,0xde,0x1e,0x30,0x8b,0x1e,0x35,0x97,
|
|
0xe1,0xd3,0x63,0xf6,0x36,0xf4,0xc4,0x20,0xdc,0x53,0x2f,0x0f,0xc2,0x85,0x78,0xf9,
|
|
0x2e,0xbc,0xe7,0x77,0x1a,0xf0,0x4c,0xd1,0x0f,0x13,0x1c,0xd4,0xad,0x3a,0xb8,0x58,
|
|
0xf4,0x30,0x0d,0xc2,0x74,0x1b,0x3c,0x83,0xf3,0x86,0x8b,0xb3,0x0d,0x3c,0x53,0xc3,
|
|
0x0b,0xb7,0xea,0x2e,0x83,0x67,0x1a,0xe8,0xbd,0xd6,0x0b,0xe8,0x6f,0xb8,0xdb,0xc1,
|
|
0x33,0x1d,0xf4,0x46,0x6b,0xbd,0x16,0x3c,0xd3,0xc3,0x4d,0x07,0x6e,0x4c,0x8b,0xad,
|
|
0x8d,0xe8,0x1f,0xd3,0x9b,0x6b,0xc0,0x33,0xe3,0x1d,0xf0,0xec,0x02,0xdc,0xfd,0xee,
|
|
0xa0,0x3f,0xe7,0x86,0xdf,0x6c,0xee,0xf4,0x81,0x67,0xf0,0xd5,0xff,0x99,0xa9,0x11,
|
|
0x3c,0xfb,0x54,0x0d,0x9e,0x5d,0x84,0x5f,0x04,0x07,0xbe,0x80,0x5b,0x15,0xf4,0x5b,
|
|
0xeb,0x8d,0x5b,0xf0,0x00,0xc6,0x77,0xeb,0x4d,0x14,0x5e,0x9a,0xaf,0xc0,0xb3,0x7a,
|
|
0x74,0xe5,0xbb,0x2d,0x48,0x60,0x6c,0xb5,0x29,0x55,0xe0,0xe7,0xef,0x06,0xc0,0x8c,
|
|
0x02,0x3e,0x2c,0xdb,0xe0,0x17,0x23,0x28,0xf0,0x19,0xd0,0xa6,0x6a,0x40,0xd2,0x03,
|
|
0x9e,0x35,0xa2,0xdf,0xcf,0xe0,0x69,0x70,0xdd,0xcd,0x28,0x35,0x60,0xa6,0x1c,0xbe,
|
|
0x67,0xb4,0xa1,0x1f,0x5e,0x5a,0x2e,0x80,0x19,0xf8,0xe5,0x6a,0xb1,0xad,0x1e,0x3e,
|
|
0x6f,0xda,0x3e,0x87,0xaf,0x1a,0x6d,0x5f,0xc0,0xbb,0x5f,0xfd,0x1a,0xcc,0xa8,0xbe,
|
|
0x81,0x9b,0x26,0x9c,0x6b,0x07,0x7c,0xba,0xb6,0xb5,0xc1,0x07,0x44,0xdb,0xb5,0xab,
|
|
0xe0,0xd9,0xd7,0xd7,0xc1,0x0c,0x7a,0x68,0xb5,0x5d,0x87,0x73,0xfc,0x06,0x9a,0xe6,
|
|
0x1b,0x1d,0xac,0x80,0xdb,0x52,0xdb,0x4d,0x38,0x47,0xf8,0x02,0x39,0xa3,0x87,0x1b,
|
|
0x36,0x7c,0xb5,0x7b,0x06,0xdf,0xfb,0x9e,0xf5,0xc2,0x67,0x48,0xdb,0x5d,0xd8,0xcb,
|
|
0x0c,0x77,0x73,0x03,0xdc,0x85,0x6f,0xc3,0x29,0xf6,0x95,0x83,0x67,0xfd,0x6a,0x58,
|
|
0x86,0x0f,0xa7,0x2b,0xd0,0x4c,0x8b,0x57,0x74,0x95,0x60,0xc6,0x08,0xc7,0x7a,0xa5,
|
|
0xaa,0x01,0x3c,0x1b,0x84,0x4f,0xa5,0x2b,0x86,0xbb,0xe0,0xd9,0xdd,0x5a,0xf0,0xec,
|
|
0x3b,0x54,0x40,0xdf,0x6d,0xae,0xd4,0x5c,0x06,0x73,0x4a,0xf8,0xb2,0x73,0x05,0xbe,
|
|
0xef,0xcf,0xc1,0x0d,0x6b,0xf1,0xb2,0xf1,0x2b,0x18,0x74,0xb5,0x30,0xf8,0x6e,0x82,
|
|
0x39,0x55,0x05,0x98,0xa9,0xae,0x82,0xf9,0x5d,0x60,0xb9,0x06,0x6d,0x7c,0xe5,0xcb,
|
|
0xab,0x48,0xe0,0xd1,0xe5,0x0b,0x28,0x16,0x2f,0xc0,0x20,0xd5,0xaa,0xc0,0xdc,0xdd,
|
|
0x2f,0xc1,0x8c,0xe9,0x6b,0x30,0xa7,0x37,0xc1,0x04,0xfb,0xeb,0xd1,0x1f,0x58,0xf6,
|
|
0xc0,0x1c,0x2e,0x59,0x6b,0x3e,0x08,0xe6,0xaa,0xa0,0x29,0xae,0x74,0x0e,0x80,0x39,
|
|
0x43,0x13,0x98,0x33,0xc2,0xdb,0x5e,0xe8,0x82,0xc7,0x28,0x87,0x8d,0x9f,0x5c,0x85,
|
|
0x75,0x17,0x61,0xae,0x87,0xc9,0x00,0x13,0xf4,0xf7,0x15,0xe8,0x9f,0xc5,0x2b,0x70,
|
|
0xe3,0x58,0xbc,0x02,0x5f,0x99,0x67,0x6a,0xe0,0xf5,0xe1,0x77,0xa3,0x39,0xf8,0xad,
|
|
0x68,0xae,0x06,0x1a,0xfa,0x2a,0xea,0x5b,0x0b,0xfd,0x78,0x65,0xa0,0x13,0xcc,0xd4,
|
|
0x36,0xc1,0x04,0x1d,0x77,0xe5,0x2e,0x7c,0x54,0x5f,0xad,0x80,0x06,0xab,0x85,0xfd,
|
|
0x1b,0xaa,0x61,0x82,0x97,0x6e,0xe8,0x00,0x73,0x9f,0xa3,0xa4,0x05,0x73,0x8d,0x17,
|
|
0xc0,0xdc,0x17,0x97,0x60,0x0e,0x27,0xdc,0x04,0xfb,0x7c,0x09,0x1d,0xf7,0xd9,0x67,
|
|
0x60,0xee,0xab,0x16,0x30,0xd7,0xac,0x84,0xc7,0xfd,0x60,0xae,0x05,0x5a,0xe4,0x2a,
|
|
0x3a,0x11,0xbe,0x34,0xce,0xc1,0xb7,0xc2,0x99,0x7a,0x33,0xcc,0xe1,0x2e,0xf2,0x29,
|
|
0x5c,0x21,0x57,0x2f,0xc1,0x40,0xbe,0xda,0x76,0x05,0xcc,0x7c,0x7e,0x17,0xcc,0x7c,
|
|
0x51,0x09,0xe6,0xae,0xa1,0xee,0x37,0xe1,0xf5,0x6e,0xc2,0xeb,0xc1,0xaf,0x10,0x73,
|
|
0xbd,0x5f,0x80,0x39,0xf4,0xb6,0x7c,0x75,0x00,0xbe,0x42,0x34,0x37,0x43,0x0b,0xa1,
|
|
0x9f,0xdb,0x6e,0xc1,0xc9,0xdf,0x86,0x26,0x6e,0x86,0x57,0x9c,0xfb,0x16,0xbe,0x9d,
|
|
0xb6,0x7f,0xf6,0x29,0x92,0x2e,0x30,0x5f,0x5e,0x03,0xe6,0x2b,0xba,0xc1,0xbc,0x0a,
|
|
0xbe,0x69,0xb5,0x37,0x5e,0x87,0x07,0x5f,0x80,0x79,0x6d,0x1f,0x98,0xaf,0xfa,0x0c,
|
|
0xa6,0x7a,0x30,0xaf,0x1b,0x00,0xf3,0x9f,0xf4,0x83,0xf9,0x6a,0x18,0xee,0xed,0xdf,
|
|
0xdc,0x01,0xf3,0x75,0x30,0xe6,0xae,0xc0,0x07,0x32,0xfa,0x86,0xd5,0x0e,0xef,0x35,
|
|
0x73,0xf5,0x0a,0x98,0xff,0x02,0x6e,0xd2,0xb7,0x6e,0x82,0xf9,0x46,0x18,0x7b,0x1d,
|
|
0x68,0xf1,0x74,0x68,0x3f,0x07,0x33,0x1d,0x30,0xb8,0x3a,0xe0,0x33,0xf9,0x2b,0x38,
|
|
0xcc,0x8e,0x6a,0x3d,0x98,0xb9,0x06,0xa3,0xb8,0xe3,0xd3,0x3a,0x30,0xdf,0x0c,0xdf,
|
|
0x7f,0x3a,0xd0,0xe3,0xfa,0x32,0x7c,0x76,0x76,0xf6,0x80,0x79,0xf8,0x42,0x34,0x7f,
|
|
0xe5,0x2a,0x98,0xbf,0x5a,0x0e,0x13,0x9c,0xdd,0x37,0x70,0xf9,0x77,0x74,0xde,0x00,
|
|
0xf3,0xdd,0x0a,0x30,0xdf,0x03,0x9f,0xb6,0xf0,0xfb,0xcd,0x0c,0xfc,0x22,0x31,0x6f,
|
|
0x86,0x81,0x70,0x0d,0xfd,0x66,0xde,0x03,0x17,0xca,0x35,0x15,0xbc,0xd5,0x35,0x2d,
|
|
0xec,0x7b,0x0d,0x46,0xc0,0x8c,0x19,0x5e,0xf9,0xdb,0xbb,0x60,0x1e,0x7e,0x3f,0x9b,
|
|
0x1f,0xf8,0x04,0x26,0xe8,0xad,0x6b,0xf5,0x0a,0x00,0x70,0x1b,0x36,0xda,0xd8,0x6e,
|
|
0xda,0xbc,0xd9,0x0e,0xbf,0x65,0xab,0xbd,0xc3,0x5b,0x8e,0x9b,0x7f,0xf9,0x10,0x36,
|
|
0x3b,0x6d,0xdb,0xee,0xec,0xb2,0x63,0xa7,0xab,0xb5,0xe8,0xb6,0x79,0xd7,0x6e,0x77,
|
|
0x8f,0x3d,0x6f,0x7b,0x7a,0x6d,0xfe,0xbb,0x7f,0xf6,0xee,0x83,0xe2,0xfd,0xab,0x5e,
|
|
0x92,0xb8,0xff,0x80,0x8f,0xef,0xc1,0x77,0xb0,0x92,0xdf,0xeb,0x6a,0x92,0xff,0xe6,
|
|
0x00,0x32,0x05,0x1e,0xbc,0xbb,0xf9,0x9f,0xf3,0x73,0x68,0x33,0x95,0xf6,0xde,0xfb,
|
|
0x81,0xaf,0x8b,0xf4,0x37,0xdb,0x82,0x0e,0x6f,0x0e,0x0e,0xf9,0xe0,0x75,0xe9,0xc3,
|
|
0xcd,0xff,0xc6,0x9f,0xd0,0xb0,0x23,0x9b,0xd7,0x3f,0xeb,0x9f,0xf5,0xcf,0xfa,0x67,
|
|
0xfd,0xb3,0xfe,0x59,0xff,0xac,0x7f,0xd6,0x3f,0xeb,0x9f,0xf5,0xcf,0xfa,0x67,0xfd,
|
|
0xf3,0xef,0xf3,0x01,0x36,0xeb,0xfc,0x55,0xd8,0x02,0xbb,0xdf,0x02,0x0f,0x08,0xc0,
|
|
0x09,0x38,0x63,0xb8,0x00,0x77,0x88,0x07,0xf0,0x02,0x44,0x40,0x02,0x64,0x08,0x05,
|
|
0xd0,0x41,0x08,0x08,0x05,0x61,0x80,0x05,0x38,0x20,0x03,0xc2,0x07,0x62,0x20,0x03,
|
|
0x2a,0x60,0x00,0x35,0x90,0x46,0xd0,0x0a,0x3a,0x41,0x2f,0x18,0x00,0xf7,0xc1,0x43,
|
|
0xf0,0x18,0x3c,0x81,0xcc,0x80,0xe7,0xe0,0x05,0x78,0x05,0x6c,0x70,0xf6,0x56,0x9c,
|
|
0x71,0xee,0x38,0x6f,0x9c,0x1f,0x8e,0x6a,0x25,0x18,0x17,0x8e,0x63,0xe2,0x92,0x70,
|
|
0x29,0xb8,0x0c,0x08,0x1f,0x27,0xc6,0xc9,0x70,0x2a,0x9c,0x01,0x57,0x83,0x6b,0xc4,
|
|
0xb5,0xe2,0x3a,0x21,0xbd,0xb8,0x01,0xdc,0x7d,0xdc,0x43,0xdc,0x63,0xdc,0x13,0x2b,
|
|
0x33,0xb8,0xe7,0xb8,0x17,0xb8,0x57,0x38,0x9b,0x0d,0x36,0x1b,0xec,0x21,0xce,0x1b,
|
|
0xdc,0x37,0x78,0x6f,0xf0,0xdb,0x40,0xdd,0x10,0xbc,0x21,0x7c,0x03,0x73,0x43,0xd2,
|
|
0x86,0x94,0x0d,0x19,0x1b,0xf8,0x1b,0xc4,0x1b,0x64,0x1b,0x54,0x1b,0x0c,0x56,0x6a,
|
|
0x36,0x34,0x6e,0x68,0xdd,0xd0,0xb9,0xa1,0x77,0xc3,0xc0,0x86,0xfb,0x1b,0x1e,0x6e,
|
|
0x78,0xbc,0xe1,0xc9,0x86,0x99,0x0d,0xcf,0x37,0xbc,0xd8,0xf0,0x6a,0x83,0xcd,0x46,
|
|
0xfb,0x8d,0xce,0x1b,0xdd,0x37,0x7a,0x6f,0xf4,0xb3,0x42,0xdd,0x18,0xbc,0x31,0x7c,
|
|
0x23,0x73,0x63,0xd2,0xc6,0x94,0x8d,0x19,0x1b,0xf9,0x1b,0xc5,0x1b,0x25,0x1b,0xe5,
|
|
0x1b,0x55,0x1b,0x0d,0x1b,0x6b,0x36,0x36,0x6e,0x6c,0x85,0x74,0x6e,0xec,0xdd,0x38,
|
|
0xb0,0xf1,0xfe,0xc6,0x87,0x1b,0xc7,0x37,0x4e,0x6d,0x9c,0xb1,0xf2,0x7c,0xe3,0x8b,
|
|
0x8d,0xaf,0x36,0xda,0xd8,0xd8,0xdb,0xb8,0xd8,0xb8,0x5b,0xf1,0xb6,0xf1,0xb3,0xa1,
|
|
0xda,0x04,0xdb,0x84,0xdb,0x30,0xad,0x24,0xd9,0xa4,0xd8,0x64,0xd8,0xf0,0x6d,0xc4,
|
|
0x36,0x32,0x1b,0x95,0x8d,0xc1,0xa6,0xc6,0xa6,0xd1,0xa6,0xd5,0xa6,0xd3,0xa6,0xd7,
|
|
0x66,0xc0,0xe6,0xbe,0xcd,0x43,0x9b,0xc7,0x36,0x4f,0xac,0xcc,0xd8,0x3c,0xb7,0x79,
|
|
0x61,0xf3,0xca,0xc6,0xc6,0xd6,0xde,0xd6,0xd9,0xd6,0xdd,0xd6,0xdb,0xd6,0xcf,0x96,
|
|
0x6a,0x1b,0x6c,0x1b,0x6e,0xcb,0xb4,0x4d,0xb2,0x4d,0xb1,0xcd,0xb0,0xe5,0xdb,0x8a,
|
|
0x6d,0x65,0xb6,0x2a,0x5b,0x83,0x6d,0xad,0x6d,0xfd,0x5f,0x4d,0xb3,0x6d,0xfb,0xff,
|
|
0xc0,0x0d,0xdb,0xbe,0x3f,0x89,0x7e,0xdb,0x61,0xdb,0x31,0xdb,0x29,0x5b,0x8b,0xed,
|
|
0x82,0xed,0xb2,0xed,0xaa,0xad,0xed,0x26,0xfb,0x4d,0xce,0x9b,0xdc,0x37,0x79,0x6f,
|
|
0xf2,0xdb,0x44,0xdd,0x14,0xbc,0x29,0x7c,0x13,0x73,0x53,0xf2,0xa6,0x8c,0x4d,0xc2,
|
|
0x4d,0xb2,0x4d,0xda,0x4d,0x35,0x9b,0x9a,0x37,0x75,0x42,0xfa,0x36,0xdd,0xdf,0xf4,
|
|
0x68,0xd3,0x93,0x4d,0x33,0x9b,0x9e,0x5b,0x79,0xb1,0xe9,0xd5,0x26,0x9b,0xcd,0xf6,
|
|
0x9b,0x9d,0x37,0xbb,0x6f,0xf6,0xd9,0x4c,0xdd,0x1c,0xbc,0x39,0x7c,0x33,0x6b,0x33,
|
|
0x7b,0x73,0xea,0xe6,0x8c,0xcd,0xfc,0xcd,0x62,0x2b,0xb2,0xcd,0xaa,0xcd,0xd5,0x9b,
|
|
0x1b,0x37,0xb7,0x6e,0xee,0xdc,0xdc,0xbb,0x79,0x00,0x72,0x7f,0xf3,0xc3,0xcd,0x8f,
|
|
0x37,0x3f,0xd9,0x3c,0xb3,0xf9,0xf9,0xe6,0x17,0x9b,0x5f,0x6d,0xb6,0xb1,0xb3,0xb7,
|
|
0x73,0xb6,0x73,0xb7,0xf3,0xb6,0xf3,0xb3,0xa3,0xda,0x05,0xdb,0x85,0xdb,0x31,0xed,
|
|
0x92,0xec,0x52,0xec,0x32,0xec,0xf8,0x76,0x62,0x3b,0x99,0x9d,0xca,0xce,0x60,0x57,
|
|
0x63,0xd7,0x68,0xa5,0xd5,0xae,0xf3,0xb7,0xe8,0xb5,0x1b,0xb0,0xbb,0x6f,0xf7,0xd0,
|
|
0x6e,0xc2,0x6e,0xc6,0x6e,0xd1,0xee,0x95,0x9d,0x0d,0xde,0x1e,0xef,0x8a,0xf7,0xc6,
|
|
0xfb,0xe1,0xa9,0xff,0xa6,0xd0,0xf0,0x74,0x7c,0x08,0x3e,0x0c,0x1f,0x81,0x67,0xe0,
|
|
0x59,0xf8,0x78,0x3c,0x1b,0x9f,0xfc,0x57,0xc1,0xc1,0xa7,0xe3,0x79,0x78,0x11,0x5e,
|
|
0x8a,0x57,0xe2,0xb5,0x10,0x1d,0xde,0x88,0x37,0xe1,0x6b,0xf1,0x0d,0xf8,0xc6,0x7f,
|
|
0x5a,0x9a,0xf1,0xad,0x90,0x76,0xfc,0x8d,0xbf,0x31,0xbd,0xbf,0x60,0xc6,0x0f,0x60,
|
|
0xdc,0xfb,0x85,0x21,0xfc,0xf7,0xf8,0x47,0xf8,0x09,0xfc,0x13,0xfc,0x0c,0xfe,0x39,
|
|
0xfe,0x05,0xe4,0x15,0xc4,0x66,0x8b,0xfd,0x16,0xd7,0xbf,0x00,0xcf,0x2d,0x3e,0x5b,
|
|
0xc8,0x5b,0x02,0xb7,0x84,0x6e,0x89,0xdc,0x92,0xf4,0x17,0x90,0xb2,0x25,0x63,0x0b,
|
|
0x7f,0x8b,0x78,0x8b,0x6c,0x8b,0x7c,0x8b,0x72,0x8b,0x7a,0x8b,0x7e,0xcb,0xa7,0x5b,
|
|
0x1a,0xb6,0x34,0x6d,0x69,0xfe,0xb3,0x69,0xd9,0xd2,0xb6,0xa5,0x63,0x4b,0xe7,0x96,
|
|
0xae,0x2d,0xdd,0x5b,0x7a,0xad,0x98,0xb7,0xf4,0xfd,0x0e,0xf7,0xb6,0x3c,0x80,0x3c,
|
|
0xc2,0x98,0xf8,0x85,0xa7,0x5b,0xe6,0xb6,0x2c,0xfe,0x5e,0x5e,0xfe,0x95,0x80,0xad,
|
|
0x7f,0x0e,0x76,0x5b,0x09,0x10,0x57,0x0c,0xcf,0x5f,0xf0,0xd9,0x4a,0xde,0x1a,0xf8,
|
|
0x67,0x12,0xba,0x35,0xf2,0x1f,0x90,0xb8,0xad,0xc9,0xff,0x03,0x69,0x5b,0xb9,0x5b,
|
|
0x85,0x5b,0x8b,0xac,0x28,0xb6,0x6a,0xad,0x54,0x6f,0xad,0xdf,0xda,0xbc,0xb5,0x7d,
|
|
0xeb,0x8d,0xad,0x7d,0x56,0xee,0x6d,0x7d,0xb0,0xf5,0xd1,0xd6,0x89,0xad,0x4f,0xb7,
|
|
0xce,0x59,0x59,0xdc,0xfa,0x72,0x2b,0xb0,0xb7,0xb3,0x27,0xd8,0xbb,0xda,0x7b,0xda,
|
|
0xfb,0xd8,0x93,0xed,0x03,0xed,0x43,0xed,0x23,0xad,0xc4,0xd9,0x27,0xaf,0xf3,0x07,
|
|
0xe1,0xd8,0xa7,0xad,0xf3,0x17,0xc1,0xb5,0x17,0xda,0x17,0xd9,0x2b,0xec,0xb5,0xff,
|
|
0xc0,0xe8,0xec,0x4d,0xf6,0x0d,0xf6,0x2d,0xf6,0xed,0xff,0x60,0xdc,0x80,0xf4,0xfd,
|
|
0x51,0xee,0xfd,0xcd,0x00,0xeb,0x9f,0x7f,0xf3,0xcf,0xdf,0x22,0xaa,0x1e,0xfc,0x0e,
|
|
0x8f,0xac,0x4c,0xfc,0x4a,0x3c,0xb5,0x9f,0xb3,0x5f,0xb4,0x7f,0x69,0x0f,0x1c,0xec,
|
|
0x1c,0x08,0x0e,0xae,0xff,0xa2,0x78,0x3a,0xf8,0xfc,0x11,0xc8,0x0e,0x81,0x90,0xd0,
|
|
0x7f,0x1a,0x22,0xad,0xc4,0xfd,0x2a,0x24,0x3b,0xa4,0x39,0x70,0xad,0x08,0xd7,0xf9,
|
|
0x17,0xa4,0xc8,0x8a,0xc2,0x41,0xfb,0x47,0xa8,0x76,0xa8,0xff,0xbb,0xd2,0xfc,0x77,
|
|
0xa4,0xdd,0xe1,0x86,0x43,0xdf,0xbf,0x2d,0xf7,0xfe,0xcd,0x78,0xf0,0x5b,0x3c,0x72,
|
|
0x98,0x80,0x3c,0x75,0x78,0xfe,0x6f,0xce,0x0b,0x87,0x57,0x0e,0x36,0x6f,0xad,0xf3,
|
|
0x87,0xb0,0x87,0x38,0xbf,0xe5,0xf9,0x96,0xcf,0x3f,0x0d,0xbe,0x6f,0x91,0xff,0xad,
|
|
0xa1,0xbc,0x15,0xf8,0x2b,0x43,0x7f,0x2b,0xec,0xad,0xc8,0xbf,0x29,0x8c,0xb7,0x98,
|
|
0x7f,0x57,0x92,0x7e,0x0f,0x29,0xbf,0x90,0xf1,0x0b,0xfc,0x5f,0x10,0xff,0x41,0x64,
|
|
0xbf,0x07,0x15,0xc4,0xf0,0x56,0xed,0x5b,0xcd,0x6f,0x75,0xbc,0xd5,0xfb,0x3b,0x0c,
|
|
0xfc,0x09,0xdc,0xff,0x3d,0x3c,0xfc,0x85,0xc7,0xbf,0xf0,0xe4,0x17,0x66,0xfe,0x20,
|
|
0xcf,0xff,0x85,0x79,0xb1,0xce,0x3f,0x09,0xcb,0x6f,0xbd,0xfc,0xbd,0x00,0x47,0xe0,
|
|
0x68,0x07,0x21,0x40,0x5c,0x21,0x9e,0x18,0x3e,0xbf,0x3a,0x64,0x48,0xa0,0x95,0x50,
|
|
0xc7,0x48,0x48,0xdc,0x3a,0xff,0x62,0xc4,0x3b,0xb2,0x1d,0x39,0x8e,0x29,0x8e,0xa9,
|
|
0x8e,0xe9,0x8e,0x99,0x8e,0x3c,0x47,0x81,0xa3,0xc8,0x51,0xe2,0x28,0x75,0x94,0x3b,
|
|
0x2a,0x1d,0xd5,0x8e,0x5a,0x47,0x9d,0xa3,0xd1,0xd1,0xe4,0x58,0xeb,0xd8,0xe0,0xd8,
|
|
0xe4,0xd8,0xe2,0xd8,0xe6,0xd8,0xe1,0xd8,0xe5,0xd8,0xed,0x68,0x76,0xec,0x77,0x1c,
|
|
0x74,0x1c,0x72,0x1c,0x76,0x1c,0x71,0x1c,0x75,0x7c,0xe4,0x38,0xe6,0x38,0xee,0x38,
|
|
0xe9,0x38,0xe5,0x38,0xed,0x68,0x71,0x9c,0x77,0x5c,0x70,0x5c,0x72,0x5c,0x76,0x5c,
|
|
0x71,0x5c,0x75,0xc4,0x11,0x6c,0x09,0x78,0x82,0x03,0xc1,0x89,0xe0,0x42,0x70,0x23,
|
|
0x78,0x10,0xbc,0x08,0x44,0x82,0x2f,0x81,0x44,0xa0,0x10,0x68,0x04,0x3a,0x21,0x84,
|
|
0x10,0xfa,0x07,0x09,0x23,0x84,0xff,0x0a,0x44,0x10,0x18,0x04,0x16,0x21,0x9e,0xc0,
|
|
0x26,0x70,0x08,0xa9,0x84,0x74,0x42,0x26,0x81,0x47,0x10,0x10,0x44,0x04,0x09,0x41,
|
|
0x4a,0x90,0x13,0x94,0x04,0x35,0x41,0x47,0x30,0x12,0x4c,0x84,0x5a,0x42,0x03,0xa1,
|
|
0x89,0xd0,0x42,0x68,0x23,0x74,0x10,0xba,0x08,0xdd,0x04,0x33,0xa1,0x9f,0x30,0x48,
|
|
0x18,0x22,0x0c,0x13,0x46,0x08,0xa3,0x84,0x31,0xc2,0x38,0x61,0xe2,0x1f,0x80,0xa7,
|
|
0x84,0x39,0xc2,0x22,0xe1,0x25,0x01,0x38,0xd9,0x39,0x11,0x9c,0x5c,0x9d,0xbc,0x9d,
|
|
0xc8,0x4e,0x81,0x4e,0xa1,0x4e,0x91,0x4e,0x71,0x4e,0xc9,0x4e,0x69,0x4e,0x5c,0x27,
|
|
0xa1,0x53,0x91,0x93,0xc2,0xc9,0xe0,0x54,0xef,0xd4,0xea,0x74,0xc3,0xa9,0xcf,0xe9,
|
|
0x9e,0xd3,0x03,0xa7,0x47,0x4e,0x4f,0x9c,0xe6,0x9c,0x16,0x9d,0x5e,0x3a,0x81,0x6d,
|
|
0x76,0xdb,0x08,0xdb,0x5c,0xb7,0x79,0x6e,0xf3,0xd9,0x46,0xde,0x16,0xb8,0x2d,0x74,
|
|
0x5b,0xe4,0xb6,0xb8,0x6d,0xc9,0xdb,0xd2,0xb6,0x71,0xb7,0x89,0xb7,0x29,0xb6,0x69,
|
|
0xb7,0x55,0x6f,0xab,0xdf,0xd6,0xbc,0xad,0x7d,0xdb,0x8d,0x6d,0x7d,0xdb,0xee,0x6d,
|
|
0x7b,0xb8,0x6d,0x62,0xdb,0xd3,0x6d,0x73,0xdb,0x16,0xb7,0xbd,0xdc,0x06,0xb6,0xdb,
|
|
0x6d,0x27,0x6c,0x77,0xdd,0xee,0xb9,0xdd,0x67,0x3b,0x79,0x7b,0xe0,0xf6,0xd0,0xed,
|
|
0x91,0xdb,0xe3,0xb6,0x27,0x6f,0x4f,0xdb,0xce,0xdd,0x2e,0xde,0xae,0xd8,0x6e,0xd8,
|
|
0x5e,0xbf,0xbd,0x75,0xfb,0x8d,0xed,0x03,0xdb,0x1f,0x6c,0x7f,0xb4,0x7d,0x62,0xfb,
|
|
0xd3,0xed,0x73,0xdb,0x17,0xb7,0xbf,0xdc,0x0e,0x9c,0xed,0x9c,0x9d,0x9d,0x3d,0x9d,
|
|
0x7d,0x9c,0xc9,0xce,0x81,0xce,0xa1,0xce,0x91,0xce,0x71,0xce,0x29,0xce,0x5c,0x67,
|
|
0xb1,0xb3,0xc2,0xd9,0xe0,0x5c,0xef,0xdc,0xec,0xdc,0xee,0x7c,0xc3,0xb9,0xcf,0xf9,
|
|
0x9e,0xf3,0x03,0xe7,0x47,0xce,0x13,0xce,0x4f,0x9d,0xe7,0x9c,0x17,0x9d,0x5f,0x3a,
|
|
0x03,0x17,0x3b,0x17,0x67,0x17,0x4f,0x17,0x3f,0x97,0x40,0x97,0x50,0x97,0x48,0x97,
|
|
0x38,0x97,0x64,0x97,0x34,0x17,0xae,0x8b,0xd0,0xa5,0xc8,0x45,0xe1,0xa2,0x75,0xa9,
|
|
0x76,0xa9,0x77,0x69,0x76,0x69,0x77,0xb9,0xe1,0xd2,0xe7,0x72,0xcf,0xe5,0x81,0xcb,
|
|
0x23,0x97,0x09,0x97,0xa7,0x2e,0x73,0x2e,0x8b,0x2e,0x2f,0x5d,0xc0,0x0e,0xbb,0x1d,
|
|
0x84,0x1d,0xae,0x3b,0x3c,0x77,0xf8,0xee,0x78,0x77,0x47,0xe0,0x2f,0x84,0xee,0x88,
|
|
0xdc,0x11,0xb7,0x23,0x79,0x47,0xc6,0x0e,0xe1,0x0e,0xd9,0x0e,0xed,0x8e,0x9a,0x1d,
|
|
0xcd,0x3b,0x3a,0x77,0xf4,0xed,0xb8,0xbf,0xe3,0xd1,0x8e,0x27,0x3b,0xe6,0x76,0xbc,
|
|
0xd8,0x01,0x76,0xda,0xef,0x74,0xdd,0xe9,0xbd,0x93,0xbc,0x33,0x78,0x67,0xe4,0xce,
|
|
0xb8,0x9d,0xc9,0x3b,0xd3,0x76,0x72,0x77,0x0a,0x77,0x16,0xed,0x54,0xed,0xac,0xde,
|
|
0xd9,0xb8,0xb3,0x7d,0x67,0xef,0xce,0x7b,0x3b,0x1f,0xee,0x9c,0xd8,0x39,0xb3,0x73,
|
|
0x71,0xe7,0xcb,0x9d,0xc0,0xd5,0xce,0x95,0xe0,0xea,0xea,0xea,0xe9,0xea,0xe3,0x4a,
|
|
0x76,0x0d,0x76,0x8d,0x74,0x4d,0x72,0x4d,0x73,0xe5,0xbb,0x16,0xb9,0xaa,0x5c,0xab,
|
|
0x5d,0x1b,0x5d,0xdb,0x5d,0x7b,0x5d,0xef,0xb9,0x3e,0x74,0x9d,0x70,0x9d,0x71,0x5d,
|
|
0x74,0x7d,0xe5,0x6a,0xe7,0xe6,0xec,0xe6,0xe9,0xe6,0xe3,0x46,0x76,0x0b,0x74,0x0b,
|
|
0x75,0x63,0xba,0x25,0xbb,0x65,0xb8,0x09,0xdd,0x64,0x6e,0x5a,0xb7,0x1a,0xb7,0x66,
|
|
0xb7,0x4e,0xb7,0x3e,0xb7,0x7b,0x6e,0x0f,0xdc,0x1e,0xb9,0x4d,0xb8,0x3d,0x75,0x9b,
|
|
0x73,0x5b,0x74,0x7b,0xf9,0x3b,0x80,0x5d,0x76,0xbb,0x9c,0x77,0x79,0xee,0xf2,0xdb,
|
|
0x15,0xb8,0x2b,0x7c,0x57,0xdc,0xae,0xe4,0x5d,0x69,0xbb,0xf8,0xbb,0x8a,0x76,0xa9,
|
|
0x76,0x55,0xef,0x6a,0xdc,0xd5,0xbe,0xeb,0xc6,0xae,0xbe,0x5d,0xf7,0x77,0x3d,0xda,
|
|
0xf5,0x64,0xd7,0x9c,0x95,0xc5,0x5d,0x2f,0x77,0xd9,0xec,0x26,0xec,0x76,0xdf,0xed,
|
|
0x63,0x85,0xbc,0x3b,0x70,0x77,0xf8,0xee,0xb8,0xdd,0x29,0xbb,0xb9,0xbb,0xc5,0xbb,
|
|
0x15,0xbb,0xb5,0xbb,0xab,0x77,0x37,0xee,0x6e,0xdf,0xdd,0xbb,0xfb,0xde,0xee,0x87,
|
|
0xbb,0x27,0x76,0x3f,0xdd,0x3d,0xb7,0xfb,0xc5,0x6e,0xe0,0x6e,0xef,0xee,0xea,0xee,
|
|
0xed,0x4e,0x76,0x0f,0x74,0x0f,0x75,0x67,0xba,0x27,0xbb,0x67,0xb8,0x0b,0xdd,0x65,
|
|
0xee,0x5a,0xf7,0x6a,0xf7,0x7a,0xf7,0x56,0xf7,0x1b,0xee,0x03,0xee,0x0f,0xac,0x3c,
|
|
0x72,0x9f,0x70,0x9f,0x71,0x5f,0x74,0x7f,0xe5,0x6e,0xe7,0x81,0x20,0x78,0xb8,0x7a,
|
|
0x78,0x7b,0x90,0x3d,0x82,0x3d,0x22,0x3d,0x92,0x3c,0xd2,0x20,0x5c,0x88,0x18,0xa2,
|
|
0x80,0x18,0x3c,0x6a,0x3c,0x1a,0x3d,0xda,0x3d,0x7a,0x3d,0xee,0x79,0x3c,0xf4,0x98,
|
|
0xf0,0x98,0xf1,0x78,0xee,0xf1,0xc2,0x03,0xec,0xb1,0xdf,0xe3,0xba,0xc7,0x7b,0x0f,
|
|
0x79,0x4f,0xf0,0x9e,0xf0,0x3d,0xcc,0x3d,0x49,0x7b,0x52,0xf6,0x64,0xec,0xe1,0xef,
|
|
0x11,0xef,0x91,0xed,0x51,0xed,0x31,0xec,0xa9,0xd9,0xd3,0xb8,0xa7,0x75,0x4f,0xa7,
|
|
0x95,0xbe,0x3d,0xf7,0xf7,0x3c,0xde,0x33,0xb3,0xe7,0xc5,0x1e,0x9b,0xb7,0x9d,0xdf,
|
|
0xf6,0x7e,0x9b,0xfc,0x76,0xf0,0xdb,0xcc,0xb7,0x53,0xde,0xe6,0xbf,0x2d,0x7b,0xdb,
|
|
0xf0,0x76,0xe3,0xdb,0xed,0x6f,0xf7,0xbe,0x7d,0xff,0xed,0xc7,0x6f,0xcf,0xbc,0xfd,
|
|
0xe2,0x6d,0x1b,0x4f,0x67,0x4f,0x4f,0x4f,0x3f,0xcf,0x60,0x4f,0xa6,0x67,0x8a,0x27,
|
|
0xdf,0x53,0xe6,0x69,0xf0,0xac,0xf7,0x6c,0xf5,0xec,0xf5,0xbc,0xef,0xf9,0xd8,0x73,
|
|
0xc6,0xf3,0x85,0xa7,0x8d,0x17,0xc1,0xcb,0xdd,0xcb,0xcf,0x2b,0xd8,0x8b,0xe9,0x95,
|
|
0xe2,0xc5,0xf7,0x92,0x79,0xa9,0xbc,0x0c,0x5e,0xf5,0x5e,0xcd,0x5e,0x9d,0x90,0x5e,
|
|
0xaf,0x7b,0x5e,0x0f,0xbc,0x1e,0x79,0x4d,0x78,0x3d,0xf5,0x9a,0xf7,0x5a,0xf4,0x5a,
|
|
0xf6,0x5a,0xf5,0xda,0xb4,0xd7,0x7e,0xaf,0xeb,0x5e,0xcf,0xbd,0x7e,0x10,0xea,0xde,
|
|
0xd0,0xbd,0x91,0x7b,0xe3,0xf6,0x26,0xef,0x4d,0xdb,0x9b,0xbd,0x37,0x6f,0x6f,0xf1,
|
|
0x5e,0xc5,0x5e,0xed,0xde,0xea,0xbd,0x8d,0x7b,0xdb,0xad,0xdc,0xd8,0x3b,0xb0,0xf7,
|
|
0xfe,0xde,0x87,0x7b,0x1f,0xef,0x7d,0xb2,0xf7,0xff,0xd9,0x3b,0xbb,0xf7,0xff,0xdd,
|
|
0xfb,0x62,0xef,0xab,0xbd,0x36,0xfb,0x08,0xfb,0xdc,0xf7,0x79,0xef,0xf3,0xdb,0x47,
|
|
0xdd,0x17,0xba,0x2f,0x72,0x5f,0xdc,0xbe,0xe4,0x7d,0x69,0xfb,0xb2,0xf7,0xe5,0xed,
|
|
0x2b,0xda,0x27,0xb3,0xa2,0xdd,0x57,0xbd,0xaf,0x11,0xd2,0xba,0xef,0xc6,0xbe,0xbe,
|
|
0x7d,0xf7,0xf6,0x3d,0xd8,0xf7,0x68,0xdf,0x8f,0xfb,0xa6,0xf6,0xcd,0xec,0x9b,0x85,
|
|
0xfc,0xf7,0xbe,0x85,0x7d,0x4b,0xfb,0x96,0xf7,0xad,0xec,0x5b,0xdd,0x87,0xf3,0xb6,
|
|
0xf5,0xc6,0x7b,0x3b,0x78,0x13,0xde,0xc0,0xc9,0xdb,0xf9,0x17,0x5c,0xbc,0xdd,0xff,
|
|
0x00,0x1e,0xde,0x5e,0xde,0xbe,0xde,0xd4,0xdf,0x81,0xe6,0x1d,0x68,0x85,0xee,0x1d,
|
|
0xe6,0xcd,0xf4,0x66,0x79,0xb3,0xbd,0xd3,0x30,0xd2,0xbd,0xb9,0xde,0x3c,0x6f,0xe1,
|
|
0xef,0x20,0xf2,0x96,0x7a,0x2b,0xbd,0xb5,0x7f,0x10,0x9d,0x77,0xfd,0x6f,0xd1,0xe0,
|
|
0xdd,0xf8,0x47,0x68,0xf2,0x6e,0xf1,0x6e,0x85,0xb4,0x79,0x77,0x78,0x77,0x79,0x77,
|
|
0x7b,0x9b,0xbd,0xfb,0xbd,0x07,0xbd,0x87,0xbc,0x87,0xbd,0x47,0xbc,0x47,0xbd,0xc7,
|
|
0xbc,0xc7,0xbd,0x27,0xbd,0xa7,0xbc,0xa7,0xbd,0x2d,0xde,0xf3,0xde,0x0b,0xde,0x4b,
|
|
0xde,0xcb,0xde,0x2b,0xde,0xab,0xde,0x38,0xa2,0x2d,0x11,0x4f,0x74,0x20,0x12,0x88,
|
|
0x4e,0x44,0x17,0xa2,0x1b,0xd1,0x83,0xe8,0x45,0x24,0x12,0x7d,0x89,0x24,0x22,0x85,
|
|
0x48,0x23,0xd2,0x89,0x21,0xc4,0x30,0x62,0xf8,0xef,0x25,0x82,0xc8,0xfc,0xa7,0x82,
|
|
0x05,0xe1,0x10,0x33,0x89,0x3c,0xa2,0x90,0x28,0x22,0xca,0x89,0x3a,0xa2,0x81,0x68,
|
|
0x24,0xd6,0x12,0x1b,0x88,0x4d,0xc4,0x16,0x62,0x1b,0xb1,0x83,0xd8,0x45,0xec,0x26,
|
|
0x9a,0x89,0xfd,0xc4,0x01,0xe2,0x20,0x71,0x88,0xf8,0x00,0x32,0x42,0x1c,0x25,0x8e,
|
|
0x11,0xc7,0x89,0x93,0xc4,0x27,0x90,0x29,0xa2,0x85,0xb8,0x44,0x7c,0x49,0x5c,0x21,
|
|
0xbe,0x82,0x80,0xfd,0xb8,0xfd,0x36,0x10,0xbb,0xfd,0x4e,0xfb,0x5d,0xf6,0xbb,0xee,
|
|
0x77,0xdb,0xef,0xb1,0xdf,0x6b,0xbf,0xf7,0x7e,0xe2,0x7e,0xdf,0xfd,0xa4,0xfd,0x94,
|
|
0xfd,0xb4,0xfd,0xf4,0xfd,0x21,0xfb,0x43,0xf7,0x87,0xed,0x67,0xed,0x8f,0xdf,0xcf,
|
|
0xde,0xcf,0xd9,0x9f,0xba,0x3f,0x0d,0x23,0x7d,0x7f,0xe6,0x7e,0xde,0x7e,0xc1,0x7e,
|
|
0xd1,0x7e,0xf1,0x1b,0x48,0xf6,0x2b,0xf7,0x1b,0xf7,0x37,0xed,0xef,0xd8,0x6f,0xde,
|
|
0x3f,0xb4,0x7f,0x74,0xff,0xe4,0x7e,0xcb,0xfe,0xa5,0xfd,0xab,0xfb,0xf1,0x07,0x5c,
|
|
0x0e,0x78,0x1d,0x20,0x1d,0xa0,0x1d,0xa0,0x1f,0x08,0x3b,0xc0,0x3a,0xc0,0x3e,0xc0,
|
|
0x39,0x90,0x7e,0x40,0x70,0x40,0x7e,0x40,0x7d,0x40,0x77,0xc0,0x74,0xa0,0xe9,0x40,
|
|
0xcb,0x81,0xb6,0x03,0x1d,0x07,0xba,0x0e,0x74,0x1f,0xe8,0x3f,0x30,0x7c,0x60,0xf4,
|
|
0xc0,0xd8,0x81,0xc9,0x03,0x96,0x03,0xcb,0x07,0x56,0x0f,0xe0,0x7c,0xf0,0x3e,0x2e,
|
|
0x3e,0x6e,0x3e,0x1e,0x3e,0x5e,0x3e,0xde,0xff,0x07,0x44,0x1f,0xf2,0x1f,0x25,0xd0,
|
|
0x27,0xf4,0x4f,0x22,0xf2,0xaf,0x22,0xce,0x27,0xd9,0x27,0xed,0xef,0x08,0xf7,0x17,
|
|
0x84,0x56,0x8a,0xfe,0x4c,0x14,0x10,0xed,0x2f,0xe8,0x7c,0x4c,0x3e,0x8d,0x3e,0x4d,
|
|
0x3e,0x6d,0x3e,0x37,0xfe,0x28,0x7d,0x56,0xee,0x59,0x79,0x00,0x79,0xf4,0x67,0x31,
|
|
0x01,0x79,0xfa,0x7b,0x99,0xf3,0x59,0xf4,0x79,0xe9,0x03,0x7c,0xed,0xac,0x10,0x7c,
|
|
0x5d,0xad,0x78,0xfa,0xfa,0xfc,0x16,0x64,0xdf,0x40,0x2b,0xa1,0xbe,0x91,0x56,0xe2,
|
|
0x7c,0x93,0x7f,0x15,0xd2,0x7c,0xb9,0xbe,0x42,0xdf,0xa2,0xbf,0x39,0x0a,0x5f,0xad,
|
|
0x6f,0xb5,0x6f,0xfd,0x6f,0xd1,0xec,0xdb,0xee,0x7b,0xc3,0xb7,0xef,0xff,0x1a,0x03,
|
|
0xbe,0xf7,0xd6,0x59,0xe7,0xef,0xc4,0x90,0xef,0xb0,0xef,0x88,0xef,0xa8,0xef,0x98,
|
|
0xef,0xb8,0xef,0xa4,0xef,0x94,0xef,0xb4,0xaf,0xc5,0x77,0xc1,0x77,0xd9,0x77,0xd5,
|
|
0xd7,0xf6,0xa0,0xc3,0x41,0x97,0x83,0x1e,0x07,0x89,0x07,0x49,0x07,0x69,0x07,0x43,
|
|
0x0e,0x32,0x0e,0xb2,0x0f,0xa6,0x1f,0x14,0x1c,0x94,0x1e,0x54,0x1f,0x34,0x1d,0x6c,
|
|
0x3a,0xd8,0x71,0xb0,0xff,0xe0,0xc8,0xc1,0xc9,0x83,0xf3,0x07,0x57,0x0e,0xe2,0xdf,
|
|
0x71,0x7b,0xc7,0xf7,0x1d,0xfa,0x3b,0x8c,0x77,0x38,0xef,0xa4,0xbf,0xc3,0x7b,0x47,
|
|
0xf4,0x8e,0xf4,0x1d,0xe5,0x3b,0xba,0x77,0x4c,0xef,0x34,0xbc,0xd3,0xf2,0x4e,0xd7,
|
|
0x3b,0xfd,0xef,0x0c,0xbf,0x33,0xf6,0xce,0xd4,0x3b,0xf3,0xef,0x2c,0xbf,0x83,0xf3,
|
|
0x73,0xf0,0x73,0xf3,0x23,0xfa,0x51,0xfc,0x42,0xfc,0x18,0x7e,0x6c,0xbf,0x74,0x3f,
|
|
0x81,0x9f,0xd4,0x4f,0xed,0x67,0xf2,0x6b,0xf2,0xeb,0xf0,0x33,0xfb,0x0d,0xf9,0x8d,
|
|
0xfa,0x4d,0xfa,0x59,0xfc,0x96,0xfc,0x56,0xfd,0xf0,0x24,0x17,0x92,0x17,0x89,0x44,
|
|
0xa2,0x93,0x22,0x48,0xf1,0xa4,0x54,0x52,0x3a,0x29,0x93,0xc4,0x23,0x09,0x48,0x22,
|
|
0x92,0x84,0x24,0x25,0xc9,0x49,0x4a,0x92,0x9a,0xa4,0x23,0x19,0x49,0x26,0x52,0x2d,
|
|
0xa9,0x81,0xd4,0x44,0x6a,0x21,0xb5,0x91,0x3a,0x48,0x5d,0xa4,0x6e,0x92,0x99,0xd4,
|
|
0x4f,0x1a,0x24,0x0d,0x91,0x86,0x49,0x23,0xa4,0x51,0xd2,0x18,0x69,0x9c,0x34,0x49,
|
|
0x9a,0x22,0x4d,0x93,0x2c,0xa4,0x79,0xd2,0x02,0x69,0x89,0xb4,0x4c,0x5a,0x21,0xad,
|
|
0x92,0x70,0xfe,0xb6,0xfe,0x78,0x7f,0x07,0x7f,0x27,0x7f,0x17,0x7f,0x37,0x7f,0x0f,
|
|
0x7f,0x2f,0x7f,0xa2,0xbf,0xaf,0x3f,0xc9,0x9f,0xfc,0x2b,0x40,0xf1,0x0f,0xfd,0x97,
|
|
0x22,0xcc,0x9f,0xe5,0xcf,0xf6,0x4f,0xfb,0x17,0x82,0xbb,0xce,0x5f,0x05,0xcf,0x5f,
|
|
0xe0,0x2f,0x5c,0xe7,0x5f,0x1e,0x91,0xbf,0x78,0x9d,0x75,0xfe,0x86,0x48,0xfc,0x8b,
|
|
0xfe,0x29,0x90,0xfa,0xcb,0xfe,0x00,0x72,0x88,0xd2,0x5f,0xed,0xaf,0xf3,0x37,0xfa,
|
|
0x9b,0xfc,0x6b,0xfd,0x1b,0xfc,0x9b,0xfc,0x5b,0xfc,0xdb,0xfc,0x3b,0xfc,0xbb,0xfc,
|
|
0xbb,0xfd,0xcd,0xfe,0xfd,0xfe,0x83,0xfe,0x43,0xfe,0xc3,0xfe,0x23,0xfe,0xa3,0xfe,
|
|
0x63,0xfe,0xe3,0xfe,0x93,0xfe,0x53,0xfe,0xd3,0xfe,0x16,0xff,0x79,0xff,0x05,0xff,
|
|
0x25,0xff,0x65,0xff,0x15,0xff,0x55,0x7f,0x5c,0x80,0x6d,0x00,0x3e,0xc0,0x21,0xc0,
|
|
0x29,0xc0,0x25,0xc0,0x2d,0xc0,0x23,0xc0,0x2b,0x80,0x18,0xe0,0x1b,0x40,0x0a,0xa0,
|
|
0x04,0xd0,0x02,0xe8,0x01,0x21,0x01,0x61,0x01,0x11,0x01,0x8c,0x00,0x56,0x40,0x7c,
|
|
0x00,0x3b,0x80,0x13,0x90,0x1a,0x90,0x1e,0x90,0x19,0xc0,0x0b,0x10,0x04,0x88,0x02,
|
|
0x24,0x01,0xd2,0x00,0x79,0x80,0x32,0x40,0x1d,0xa0,0x0b,0x30,0x06,0x98,0x02,0x6a,
|
|
0x03,0x1a,0x02,0x9a,0x02,0x5a,0x02,0xda,0x02,0x3a,0x02,0xba,0x02,0xba,0x03,0xcc,
|
|
0x01,0xfd,0x01,0x83,0x01,0x43,0x01,0xc3,0x01,0x23,0x01,0xa3,0x01,0x63,0x01,0xe3,
|
|
0x01,0x93,0x01,0x53,0x01,0xd3,0x01,0x96,0x80,0xf9,0x80,0x85,0x80,0xa5,0x80,0xe5,
|
|
0x80,0x95,0x80,0xd5,0x00,0x1c,0xd9,0x96,0x8c,0x27,0x3b,0x90,0x9d,0xc8,0x2e,0x64,
|
|
0x37,0xb2,0x07,0xd9,0x8b,0x4c,0x24,0xfb,0x92,0x49,0x64,0x0a,0x99,0x46,0xa6,0x93,
|
|
0x43,0xc8,0x61,0xe4,0x08,0x32,0x83,0xcc,0x22,0xc7,0x93,0xd9,0x64,0x0e,0x39,0x95,
|
|
0x9c,0x4e,0xce,0x24,0xf3,0xc8,0x02,0xb2,0x88,0x2c,0x21,0x4b,0xc9,0x72,0xb2,0x92,
|
|
0xac,0x26,0xeb,0xc8,0x46,0xb2,0x89,0x5c,0x4b,0x6e,0x20,0x37,0x91,0x5b,0xc8,0x6d,
|
|
0xe4,0x0e,0x72,0x17,0xb9,0x9b,0x6c,0x26,0xf7,0x93,0x07,0xc9,0x43,0xe4,0x61,0xf2,
|
|
0x08,0x79,0x94,0x3c,0x46,0x1e,0x27,0x4f,0x92,0xa7,0xc8,0xd3,0x64,0x0b,0x79,0x9e,
|
|
0xbc,0x40,0x5e,0x22,0x2f,0x93,0x57,0xc8,0xab,0x64,0x1c,0xc5,0x96,0x82,0xa7,0x38,
|
|
0x50,0x9c,0x28,0x2e,0x14,0x37,0x8a,0x07,0xc5,0x8b,0x42,0xa4,0xf8,0x52,0x48,0x14,
|
|
0x0a,0x85,0x46,0xa1,0x53,0x42,0x28,0x61,0x94,0x08,0x0a,0x83,0xc2,0xa2,0xc4,0x53,
|
|
0xd8,0x14,0x0e,0x25,0x95,0x92,0x4e,0xc9,0xa4,0xf0,0x28,0x02,0x8a,0x88,0x22,0xa1,
|
|
0x48,0x29,0x72,0x8a,0x92,0xa2,0xa6,0xe8,0x28,0x46,0x8a,0x89,0x52,0x4b,0x69,0xa0,
|
|
0x34,0x51,0x5a,0x28,0x6d,0x94,0x0e,0x4a,0x17,0xa5,0x9b,0x62,0xa6,0xf4,0x53,0x06,
|
|
0x29,0x43,0x94,0x61,0xca,0x08,0x65,0x94,0x32,0x46,0x79,0xfc,0x37,0x60,0x1c,0x32,
|
|
0xf1,0x77,0x63,0x92,0xf2,0x84,0x32,0x45,0x99,0xa6,0x58,0x28,0x73,0x7f,0x02,0x8b,
|
|
0x90,0x97,0x10,0xf0,0x2e,0x78,0xd7,0x0e,0x42,0x80,0xb8,0x42,0x3c,0x21,0x3e,0x10,
|
|
0x32,0x24,0x10,0x12,0x0a,0x89,0xb4,0x12,0x07,0x49,0x86,0xa4,0xfd,0x16,0xdc,0x77,
|
|
0x85,0x90,0xa2,0x77,0x15,0x10,0xed,0xbb,0xd5,0x90,0xfa,0x77,0x9b,0x21,0xed,0xef,
|
|
0xde,0xf8,0xb3,0xe8,0x7b,0x83,0xfe,0x77,0x87,0xde,0x7d,0x00,0x19,0x7b,0x77,0xe2,
|
|
0x0f,0xf2,0x14,0x32,0x07,0x59,0x84,0xbc,0x84,0x80,0x43,0xe0,0x90,0x1d,0x84,0x00,
|
|
0x71,0x85,0x78,0x42,0x7c,0x20,0x64,0x48,0xa0,0x95,0x50,0x48,0x24,0x24,0xee,0xb7,
|
|
0x48,0x3e,0x94,0x06,0xe1,0x1e,0x12,0x42,0x8a,0x0e,0x29,0x20,0xda,0x43,0xd5,0x90,
|
|
0xfa,0x43,0xcd,0x7f,0x16,0xed,0x56,0x6e,0x1c,0xea,0x3b,0x74,0xef,0xd0,0x03,0x8c,
|
|
0xb1,0x43,0x13,0x7f,0x07,0x26,0x0f,0x4d,0x1d,0x9a,0x3e,0x64,0x39,0x34,0x7f,0x68,
|
|
0xe1,0xd0,0xd2,0xa1,0xe5,0x43,0x2b,0x87,0x56,0x0f,0xe1,0xa8,0xb6,0x54,0x3c,0xd5,
|
|
0x81,0xea,0x44,0x75,0xa1,0xba,0x51,0x3d,0xa8,0x5e,0x54,0x22,0xd5,0x97,0x4a,0xa2,
|
|
0x52,0xa8,0x34,0x2a,0x9d,0x1a,0x42,0x0d,0xa3,0x46,0x50,0x19,0x54,0x16,0x35,0x9e,
|
|
0xca,0xa6,0x72,0xa8,0xa9,0xd4,0x74,0x6a,0x26,0x95,0x47,0x15,0x50,0x45,0x54,0x09,
|
|
0x55,0x4a,0x95,0x53,0x95,0x54,0x35,0x55,0x47,0x35,0x52,0x4d,0xd4,0x5a,0x6a,0x03,
|
|
0xb5,0x89,0xda,0x42,0x6d,0xa3,0x76,0x50,0xbb,0xa8,0xdd,0x54,0x33,0xb5,0x9f,0x3a,
|
|
0x48,0x1d,0xa2,0x0e,0x53,0x47,0xa8,0xa3,0xd4,0x31,0xea,0x38,0x75,0x92,0x3a,0x45,
|
|
0x9d,0xa6,0x5a,0xa8,0xf3,0xd4,0x05,0xea,0x12,0x75,0x99,0xba,0x42,0x5d,0xa5,0xe2,
|
|
0x68,0xb6,0x34,0x3c,0xcd,0x81,0xe6,0x44,0x73,0xa1,0xb9,0xd1,0x3c,0x68,0x5e,0x34,
|
|
0x22,0xcd,0x97,0x46,0xa2,0x51,0x68,0x34,0x1a,0x9d,0x16,0x42,0x0b,0xa3,0x45,0xd0,
|
|
0x18,0x34,0x16,0x2d,0xce,0x4a,0x3c,0x8d,0x4d,0xe3,0xd0,0x52,0x69,0xe9,0xb4,0x4c,
|
|
0x1a,0x8f,0x26,0xa0,0x89,0x68,0x12,0x9a,0x94,0x26,0xa7,0x29,0x69,0x6a,0x9a,0xf6,
|
|
0x9f,0x1c,0x1d,0xa4,0x96,0xd6,0x42,0xeb,0xa2,0xf5,0xd3,0x86,0x69,0x63,0xb4,0x29,
|
|
0xda,0x3c,0x6d,0x99,0x86,0x7b,0xcf,0xe1,0x3d,0xb7,0xf7,0x88,0xef,0x51,0xde,0x0b,
|
|
0x7b,0x2f,0xfe,0xbd,0xf4,0xf7,0x44,0xef,0x29,0xdf,0x33,0xbd,0xd7,0xf2,0x5e,0xf7,
|
|
0x7b,0x43,0xef,0x8d,0xbd,0x37,0xfd,0xde,0xd2,0x7b,0xb8,0xf7,0x9d,0xde,0xf7,0x7a,
|
|
0x3f,0xe4,0xfd,0xa4,0xf7,0xd9,0xef,0xa7,0xbf,0x2f,0x78,0x5f,0xfa,0xbe,0xfa,0x7d,
|
|
0xd3,0xfb,0x4d,0xef,0x77,0xbc,0x6f,0x7e,0x7f,0xe8,0xfd,0xd1,0xf7,0x27,0xdf,0xb7,
|
|
0xbc,0xbf,0xf4,0xfe,0xea,0xfb,0xf8,0x40,0x97,0x40,0xaf,0x40,0x52,0x20,0x3d,0x30,
|
|
0x22,0x30,0x3e,0x30,0x35,0x90,0x17,0x28,0x09,0x54,0x06,0x1a,0x03,0x1b,0x02,0xdb,
|
|
0x02,0xbb,0x03,0x07,0x03,0x47,0x02,0xc7,0x03,0xa7,0x03,0x17,0x02,0x57,0x02,0x6d,
|
|
0xe9,0x78,0xba,0x03,0xdd,0x89,0xee,0xfc,0x3b,0xb8,0xd0,0xbd,0xe8,0xbe,0x74,0x0a,
|
|
0x9d,0x4e,0x0f,0xa3,0x33,0xe8,0xf1,0x74,0x0e,0x3d,0x9d,0xce,0xa3,0x8b,0xe8,0x52,
|
|
0xba,0x92,0xae,0xa3,0x9b,0xe8,0x0d,0xf4,0x26,0x7a,0x0b,0xbd,0x8d,0xde,0x41,0xef,
|
|
0xa2,0x77,0xd3,0xcd,0xf4,0x7e,0xfa,0x20,0x7d,0x88,0x3e,0x4c,0x1f,0xa1,0x8f,0xd2,
|
|
0xc7,0xe8,0x93,0xf4,0x69,0xfa,0x3c,0x7d,0x89,0xbe,0x42,0xc7,0x05,0xe1,0x83,0x9c,
|
|
0x82,0xdc,0x82,0xbc,0x82,0x7c,0x83,0x28,0x41,0xf4,0xa0,0xb0,0x20,0x76,0x50,0x66,
|
|
0x10,0x3f,0x48,0x10,0x24,0x0a,0x92,0x04,0x49,0x83,0xe4,0x41,0xca,0x20,0x75,0x90,
|
|
0x2e,0xc8,0x18,0x64,0x0a,0xaa,0x0d,0x6a,0x08,0x6a,0x0a,0x6a,0x09,0x6a,0x0b,0xea,
|
|
0x08,0xea,0x0a,0xea,0x0e,0x32,0x07,0xf5,0x07,0x0d,0x06,0x0d,0x05,0x0d,0x07,0x8d,
|
|
0x04,0x8d,0x06,0x8d,0x05,0x8d,0x07,0x4d,0x06,0x4d,0x05,0x4d,0x07,0x59,0x82,0xe6,
|
|
0x83,0x16,0x82,0x96,0x82,0x96,0x83,0x56,0x82,0x56,0x83,0x70,0x87,0x6d,0x0f,0xe3,
|
|
0x0f,0x3b,0x1c,0x76,0x3a,0xec,0x72,0xd8,0xed,0xb0,0xc7,0x61,0xaf,0xc3,0xc4,0xc3,
|
|
0xbe,0x87,0x49,0x87,0x29,0x87,0xe9,0x87,0xc3,0x0e,0x33,0x0e,0xc7,0x1f,0xe6,0x1c,
|
|
0x4e,0x3f,0xcc,0x3b,0x2c,0x3a,0x2c,0x3d,0xac,0x3c,0xac,0x3b,0x6c,0x3a,0xdc,0x70,
|
|
0xb8,0xe5,0x70,0xc7,0xe1,0xee,0xc3,0xfd,0x87,0x87,0x0e,0x8f,0x1c,0x1e,0x3b,0x3c,
|
|
0x79,0x78,0xfa,0xf0,0xfc,0xe1,0xa5,0xc3,0xab,0x87,0xf1,0xc1,0x2e,0xc1,0x1e,0xc1,
|
|
0xbe,0xc1,0x94,0xe0,0x90,0xe0,0xb0,0xe0,0x88,0x60,0x46,0x30,0x2b,0x38,0x3e,0x98,
|
|
0x1d,0xcc,0x09,0x4e,0x0d,0x4e,0x0f,0xce,0x0c,0xe6,0x05,0x0b,0x82,0x45,0xc1,0x92,
|
|
0x60,0x69,0xb0,0x3c,0x58,0x19,0xac,0x0e,0xd6,0x05,0x1b,0x83,0x4d,0xc1,0xb5,0xc1,
|
|
0x0d,0xc1,0x4d,0xc1,0x2d,0xc1,0x6d,0xc1,0x1d,0xc1,0x5d,0xc1,0xdd,0xc1,0xe6,0xe0,
|
|
0xfe,0xe0,0xc1,0xe0,0xa1,0xe0,0xe1,0xe0,0x91,0xe0,0xd1,0xe0,0xb1,0xe0,0xf1,0xe0,
|
|
0xc9,0xe0,0xa9,0xe0,0xe9,0x60,0x4b,0xf0,0x7c,0xf0,0x42,0xf0,0x52,0xf0,0x72,0xf0,
|
|
0x4a,0x30,0x2e,0x04,0x17,0xe2,0x12,0x42,0x0c,0xa1,0x87,0x44,0x84,0x70,0x42,0x32,
|
|
0x43,0x44,0x21,0xba,0x90,0x86,0x90,0xb6,0x90,0xee,0x90,0xc1,0x90,0xd1,0x90,0xa9,
|
|
0x90,0x85,0x90,0xd5,0x10,0x87,0x0f,0x3c,0x3e,0x20,0x7d,0x10,0xf1,0x01,0xeb,0x83,
|
|
0xcc,0x0f,0xe4,0x1f,0x98,0x3e,0x68,0xf9,0xa0,0xff,0x83,0xb1,0x0f,0xa6,0x3f,0x58,
|
|
0xf8,0x60,0xe5,0x03,0xfc,0x87,0x6e,0x1f,0x92,0x3e,0x0c,0xfb,0x90,0xf5,0x21,0xe7,
|
|
0x43,0xde,0x87,0x92,0x0f,0x95,0x1f,0xea,0x3e,0x34,0x7d,0xd8,0xf4,0x61,0xc7,0x87,
|
|
0x43,0x1f,0x8e,0x7d,0x68,0xf9,0x70,0xf5,0x43,0x87,0x50,0xb7,0x50,0x62,0x68,0x48,
|
|
0x28,0x2b,0x34,0x33,0x54,0x14,0xaa,0x0e,0x35,0x85,0xb6,0x84,0x76,0x85,0x0e,0x86,
|
|
0x8e,0x85,0x4e,0x87,0x2e,0x87,0xda,0x86,0x39,0x84,0x79,0x85,0x91,0xc2,0xe8,0x61,
|
|
0x8c,0x30,0x76,0x58,0x7a,0x98,0x20,0x4c,0x19,0x66,0x0a,0x6b,0x08,0xeb,0x0e,0x1b,
|
|
0x0c,0x1b,0x0b,0x9b,0x0e,0x5b,0x0a,0x5b,0x0d,0xc3,0x1f,0x71,0x3b,0xe2,0x75,0x84,
|
|
0x72,0x24,0xe2,0x08,0xeb,0x48,0xe6,0x11,0xd1,0x11,0xe9,0x11,0xe5,0x11,0xdd,0x11,
|
|
0xd3,0x91,0x86,0x23,0x2d,0x47,0x3a,0x8e,0x74,0x1f,0xe9,0x3f,0x32,0x74,0x64,0xf4,
|
|
0xc8,0xe4,0x11,0xcb,0x91,0xa5,0x23,0xab,0x47,0xf0,0x47,0x5d,0x8e,0x7a,0x1d,0x25,
|
|
0x1d,0xa5,0x1f,0x8d,0x38,0x1a,0x7f,0x34,0xf5,0x28,0xef,0xa8,0xe4,0xa8,0xf2,0xa8,
|
|
0xee,0xa8,0xe9,0x68,0xd3,0xd1,0xb6,0xa3,0x5d,0x47,0xcd,0x47,0x87,0x8e,0x8e,0x1e,
|
|
0x1d,0x3f,0x3a,0x75,0xd4,0x72,0x74,0xe1,0xe8,0xf2,0x51,0xdb,0x70,0x87,0x70,0x97,
|
|
0x70,0x8f,0x70,0x62,0x38,0x29,0x9c,0x16,0x1e,0x12,0x1e,0x11,0x1e,0x1f,0x9e,0x1e,
|
|
0xce,0x0b,0x17,0x85,0x4b,0xc3,0x95,0xe1,0xba,0x70,0x53,0x78,0x43,0x78,0x5b,0x78,
|
|
0x77,0xf8,0x60,0xf8,0x48,0xf8,0x58,0xf8,0x64,0xf8,0x74,0xf8,0x7c,0xf8,0x52,0xf8,
|
|
0x4a,0x38,0x2e,0x02,0x1f,0xe1,0x14,0xe1,0x16,0x41,0x8c,0xa0,0x44,0xd0,0x23,0x22,
|
|
0x22,0xe2,0x23,0x52,0x23,0x32,0x23,0x44,0x11,0xf2,0x08,0x63,0x44,0x6d,0x44,0x4b,
|
|
0x44,0x57,0x44,0x7f,0xc4,0x70,0xc4,0x64,0xc4,0x52,0xc4,0x4a,0x04,0xee,0x18,0xfe,
|
|
0x98,0xd3,0x31,0xb7,0x63,0x5e,0xc7,0x7c,0x8f,0x51,0x8e,0xd1,0x8f,0x85,0x1d,0x63,
|
|
0x1c,0x8b,0x3f,0xc6,0x39,0x96,0x7e,0x8c,0x77,0x4c,0x74,0x4c,0x7a,0x4c,0x79,0xcc,
|
|
0x74,0xac,0xe1,0x58,0xcb,0xb1,0x8e,0x63,0xfd,0xc7,0x86,0x8f,0x8d,0x1e,0x1b,0x3f,
|
|
0x36,0x75,0xcc,0x72,0x6c,0xe1,0xd8,0xf2,0xb1,0xd5,0x63,0xb6,0xc7,0x1d,0x8e,0xbb,
|
|
0x1c,0xf7,0x3a,0xee,0x7b,0x9c,0x72,0x3c,0xe4,0x38,0xe3,0x78,0xfc,0xf1,0xf4,0xe3,
|
|
0x82,0xe3,0x92,0xe3,0xf2,0xe3,0xea,0xe3,0xc6,0xe3,0x0d,0xc7,0xdb,0x8e,0x77,0x1d,
|
|
0x37,0x1f,0x1f,0x3c,0x3e,0x7c,0x7c,0xf4,0xf8,0xf8,0xf1,0xa9,0xe3,0x96,0xe3,0x0b,
|
|
0xc7,0x57,0x8e,0xdb,0x46,0x3a,0x45,0x7a,0x44,0xfa,0x46,0xd2,0x22,0xc3,0x22,0x59,
|
|
0x91,0x9c,0xc8,0xcc,0x48,0x51,0xa4,0x3c,0x52,0x17,0x59,0x1b,0xd9,0x12,0xd9,0x15,
|
|
0xd9,0x1f,0x39,0x1c,0x39,0x16,0x39,0x15,0x39,0x1f,0xb9,0x1c,0x09,0x18,0xeb,0xfc,
|
|
0x65,0xe0,0x18,0xb6,0x0c,0xbb,0x75,0xfe,0x09,0xc0,0x33,0xec,0xff,0xed,0x71,0x60,
|
|
0x38,0x31,0x5c,0x18,0xae,0x56,0xdc,0x18,0x1e,0x0c,0xcf,0x7f,0x09,0xbc,0x18,0x44,
|
|
0x86,0x2f,0x83,0xc4,0x20,0xff,0x1f,0x50,0x18,0xd4,0x75,0xfe,0x2c,0x02,0x19,0xc1,
|
|
0x8c,0x50,0x46,0x38,0x23,0x92,0xc1,0x64,0xc4,0x31,0x92,0x18,0xc9,0x8c,0x14,0x46,
|
|
0x1a,0x23,0x83,0xc1,0x65,0xf0,0x19,0x42,0x86,0x98,0x51,0xc4,0x90,0x31,0x14,0x0c,
|
|
0x15,0x43,0xcb,0x30,0x30,0xaa,0x19,0x35,0x8c,0x7a,0x46,0x23,0xa3,0x99,0xd1,0xca,
|
|
0x68,0x67,0x74,0x32,0x6e,0x30,0x7a,0x19,0x7d,0x8c,0x01,0xc6,0x3d,0xc6,0x7d,0xc6,
|
|
0x03,0xc6,0x43,0xc6,0x23,0xc6,0x63,0xc6,0x04,0xe3,0x09,0xe3,0x29,0x63,0x86,0x31,
|
|
0xc7,0x78,0xce,0x58,0x64,0xbc,0x60,0xbc,0x64,0xbc,0x62,0x80,0x28,0x9b,0x28,0xbb,
|
|
0x28,0xfb,0x28,0x42,0x94,0x73,0x94,0x6b,0x94,0x7b,0x94,0x67,0x94,0x77,0x94,0x4f,
|
|
0x94,0x5f,0x14,0x39,0x8a,0x1a,0x15,0x18,0x15,0x1c,0x15,0x1a,0x15,0x1e,0x15,0x19,
|
|
0xc5,0x8c,0x8a,0x8b,0x4a,0x8a,0x4a,0x8e,0x4a,0x89,0x4a,0x8b,0xca,0x88,0xe2,0x46,
|
|
0xf1,0xa3,0x84,0x51,0xe2,0xa8,0xa2,0x28,0x59,0x94,0x22,0x4a,0x15,0xa5,0x8d,0x32,
|
|
0x44,0x55,0x47,0xd5,0x44,0xd5,0x47,0x35,0x46,0x35,0x47,0xb5,0x46,0xb5,0x47,0x75,
|
|
0x46,0xdd,0x88,0xea,0x8d,0xea,0x8b,0x1a,0x88,0xba,0x17,0x75,0x3f,0xea,0x41,0xd4,
|
|
0xc3,0xa8,0x47,0x51,0x8f,0xa3,0x26,0xa2,0x9e,0x44,0x3d,0x8d,0x9a,0x89,0x9a,0x8b,
|
|
0x7a,0x1e,0xb5,0x18,0xf5,0x22,0xea,0x65,0xd4,0xab,0x28,0x10,0x6d,0x13,0x6d,0x17,
|
|
0x6d,0x1f,0x4d,0x88,0x76,0x8e,0x76,0x8d,0x76,0x8f,0xf6,0x8c,0xf6,0x8e,0xf6,0x89,
|
|
0xf6,0x8b,0x26,0x47,0x53,0xa3,0x03,0xa3,0x83,0xa3,0x43,0xa3,0xc3,0xa3,0x23,0xa3,
|
|
0x99,0xd1,0x71,0xd1,0x49,0xd1,0xc9,0xd1,0x29,0xd1,0x69,0xd1,0x19,0xd1,0xdc,0x68,
|
|
0x7e,0xb4,0x30,0x5a,0x1c,0x5d,0x14,0x2d,0x8b,0x56,0x44,0xab,0xa2,0xb5,0xd1,0x86,
|
|
0xe8,0xea,0xe8,0x9a,0xe8,0xfa,0xe8,0xc6,0xe8,0xe6,0xe8,0xd6,0xe8,0xf6,0xe8,0xce,
|
|
0xe8,0x1b,0xd1,0xbd,0xd1,0x7d,0xd1,0x03,0xd1,0xf7,0xa2,0xef,0x47,0x3f,0x88,0x7e,
|
|
0x18,0xfd,0x28,0xfa,0x71,0xf4,0x44,0xf4,0x93,0xe8,0xa7,0xd1,0x33,0xd1,0x73,0xd1,
|
|
0xcf,0xa3,0x17,0xa3,0x5f,0x44,0xbf,0x8c,0x7e,0x15,0x0d,0x98,0x36,0x4c,0x3b,0xa6,
|
|
0x3d,0x93,0xc0,0x74,0x66,0xba,0x32,0xdd,0x99,0x9e,0x4c,0x6f,0xa6,0x0f,0xd3,0x8f,
|
|
0x49,0x66,0x52,0x99,0x81,0xcc,0x60,0x66,0x28,0x33,0x9c,0x19,0xc9,0x64,0x32,0xe3,
|
|
0x98,0x49,0xcc,0x64,0x66,0x0a,0x33,0x8d,0x99,0xc1,0xe4,0x32,0xf9,0x4c,0x21,0x53,
|
|
0xcc,0x2c,0x62,0xca,0x98,0x0a,0xa6,0x8a,0xa9,0x65,0x1a,0x98,0xd5,0xcc,0x1a,0x66,
|
|
0x3d,0xb3,0x91,0xd9,0xcc,0x6c,0x65,0xb6,0x33,0x3b,0x99,0x37,0x98,0xbd,0xcc,0x3e,
|
|
0xe6,0x00,0xf3,0x1e,0xf3,0x3e,0xf3,0x01,0xf3,0x21,0xf3,0x11,0xf3,0x31,0x73,0x82,
|
|
0xf9,0x84,0xf9,0x94,0x39,0xc3,0x9c,0x63,0x3e,0x67,0x2e,0x32,0x5f,0x30,0x5f,0x32,
|
|
0x5f,0x31,0x01,0xcb,0x86,0x65,0xc7,0xb2,0x67,0x11,0x58,0xce,0x2c,0x57,0x96,0x3b,
|
|
0xcb,0x93,0xe5,0xcd,0xf2,0x61,0xf9,0xb1,0xc8,0x2c,0xf8,0x85,0x8b,0x15,0xc8,0x0a,
|
|
0x66,0x85,0xb2,0xc2,0x59,0x91,0x2c,0x26,0x2b,0x8e,0x95,0xc4,0x4a,0x66,0xa5,0xb0,
|
|
0xd2,0x58,0x19,0x2c,0x2e,0x8b,0x6f,0x45,0x08,0x11,0x5b,0x29,0x62,0xc9,0x58,0x0a,
|
|
0x96,0x8a,0xa5,0x65,0x19,0x58,0xd5,0xac,0x1a,0x56,0x3d,0xab,0x11,0xd2,0x0c,0x69,
|
|
0xb5,0xd2,0xce,0xea,0xc4,0xb8,0xc1,0xea,0x65,0xf5,0xb1,0x06,0x58,0xf7,0x58,0xf7,
|
|
0x59,0x0f,0x58,0x0f,0x59,0x8f,0x58,0x8f,0x59,0x13,0xac,0x27,0xac,0xa7,0xac,0x19,
|
|
0xd6,0x1c,0xeb,0x39,0x6b,0x91,0xf5,0x82,0xf5,0x92,0xf5,0x8a,0x05,0x62,0x6c,0x62,
|
|
0xec,0x62,0xec,0x63,0x08,0x31,0xce,0x31,0xae,0x31,0xee,0x31,0x9e,0x31,0xde,0x31,
|
|
0x3e,0x31,0x7e,0x31,0xe4,0x18,0x6a,0x4c,0x60,0x4c,0x70,0x4c,0x68,0x4c,0x78,0x4c,
|
|
0x64,0x0c,0x33,0x26,0x2e,0x26,0x29,0x26,0x39,0x26,0x25,0x26,0x2d,0x26,0x23,0x86,
|
|
0x1b,0xc3,0x8f,0x11,0xc6,0x88,0x63,0x8a,0x62,0x64,0x31,0x8a,0x18,0x55,0x8c,0x36,
|
|
0xc6,0x10,0x53,0x1d,0x53,0x13,0x53,0x1f,0xd3,0x18,0xd3,0x1c,0xd3,0x1a,0xd3,0x1e,
|
|
0xd3,0x19,0x73,0x23,0xa6,0x37,0xa6,0x2f,0x66,0xc0,0xca,0xbd,0x98,0xfb,0x31,0x0f,
|
|
0x62,0x1e,0xc6,0x3c,0x8a,0x79,0x1c,0x33,0x11,0xf3,0x24,0xe6,0x69,0xcc,0x4c,0xcc,
|
|
0x5c,0xcc,0xf3,0x98,0xc5,0x98,0x17,0x31,0x2f,0x63,0x5e,0xc5,0x80,0x58,0x9b,0x58,
|
|
0xbb,0x58,0xfb,0x58,0x42,0xac,0x73,0xac,0x6b,0xac,0x7b,0xac,0x67,0xac,0x77,0xac,
|
|
0x4f,0xac,0x5f,0x2c,0x39,0x96,0x1a,0x1b,0x18,0x1b,0x1c,0x1b,0x1a,0x1b,0x1e,0x1b,
|
|
0x19,0xcb,0x8c,0x8d,0x8b,0x4d,0x8a,0x4d,0x8e,0x4d,0x89,0x4d,0x8b,0xcd,0x88,0xe5,
|
|
0xc6,0xf2,0x63,0x85,0xb1,0xe2,0xd8,0xa2,0x58,0x59,0xac,0x22,0x56,0x15,0xab,0x8d,
|
|
0x35,0xc4,0x56,0xc7,0xd6,0xc4,0xd6,0xc7,0x36,0xc6,0x36,0xc7,0xb6,0xc6,0xb6,0xc7,
|
|
0x76,0xc6,0xde,0x88,0xed,0x8d,0xed,0x8b,0x1d,0x88,0xbd,0x17,0x7b,0x3f,0xf6,0x41,
|
|
0xec,0xc3,0xd8,0x47,0xb1,0x8f,0x63,0x27,0x62,0x9f,0xc4,0x3e,0x8d,0x9d,0x89,0x9d,
|
|
0x8b,0x7d,0x1e,0xbb,0x18,0xfb,0x22,0xf6,0x65,0xec,0xab,0x58,0x10,0x67,0x13,0x67,
|
|
0x17,0x67,0x1f,0x47,0x88,0x73,0x8e,0x73,0x8d,0x73,0x8f,0xf3,0x8c,0xf3,0x8e,0xf3,
|
|
0x89,0xf3,0x8b,0x23,0xc7,0x51,0xe3,0x02,0xe3,0x82,0xe3,0x42,0xe3,0xc2,0xe3,0x22,
|
|
0xe3,0x98,0x71,0x71,0x71,0x49,0x71,0xc9,0x71,0x29,0x71,0x69,0x71,0x19,0xbf,0x22,
|
|
0x99,0x10,0x41,0x9c,0x24,0x4e,0x1e,0xa7,0x8b,0xab,0x8d,0x6b,0x8a,0x6b,0xfd,0x03,
|
|
0xb4,0xc5,0x75,0xc5,0x99,0xe3,0x06,0xe3,0x86,0xe3,0x1e,0xbe,0xc1,0x63,0xc8,0x54,
|
|
0xdc,0x74,0x9c,0x25,0x6e,0x3e,0x6e,0x21,0x6e,0x29,0x6e,0x39,0x6e,0x25,0x6e,0x35,
|
|
0x0e,0x17,0x6f,0x13,0x6f,0x1f,0xef,0x1c,0xef,0x19,0xef,0x17,0x4f,0x8d,0x0f,0x8e,
|
|
0x0f,0x8f,0x67,0xc6,0x27,0xc5,0xa7,0xc4,0x67,0xc4,0xf3,0xe3,0xc5,0x10,0x59,0xbc,
|
|
0x2a,0xde,0x10,0x5f,0x13,0xdf,0x08,0x69,0x85,0x74,0xc6,0xf7,0x42,0x06,0xe2,0xef,
|
|
0x43,0x1e,0xc6,0x3f,0x8e,0x7f,0x12,0x3f,0x13,0xff,0x3c,0xfe,0x45,0xfc,0xab,0x78,
|
|
0x9b,0x04,0x87,0x04,0x97,0x04,0xb7,0x04,0x8f,0x04,0xaf,0x04,0x62,0x82,0x6f,0x02,
|
|
0x29,0x81,0x92,0x40,0x4b,0xa0,0x27,0x84,0x24,0x84,0x25,0x44,0x24,0x30,0x12,0x58,
|
|
0x09,0xf1,0x09,0xec,0x04,0x4e,0x42,0x6a,0x42,0x7a,0x42,0x66,0x02,0x2f,0x41,0x90,
|
|
0x20,0x4a,0x90,0x24,0x48,0x13,0xe4,0x09,0xca,0x04,0x75,0x82,0x2e,0xc1,0x98,0x60,
|
|
0x4a,0xa8,0x4d,0x68,0x48,0x68,0x4a,0x68,0x49,0x68,0x4b,0xe8,0x48,0xe8,0x4a,0xe8,
|
|
0x4e,0x30,0x27,0xf4,0x27,0x0c,0x26,0x0c,0x25,0x0c,0x27,0x8c,0x24,0x8c,0x26,0x8c,
|
|
0x25,0x8c,0x27,0x4c,0x26,0x4c,0x25,0x4c,0x27,0x58,0x12,0xe6,0x13,0x16,0x12,0x96,
|
|
0x12,0x96,0x13,0x56,0x12,0x56,0x13,0x70,0x89,0xb6,0x89,0xf8,0x44,0x87,0x44,0xa7,
|
|
0x44,0x97,0x44,0xb7,0x44,0x8f,0x44,0xaf,0x44,0x62,0xa2,0x6f,0x22,0x29,0x91,0x92,
|
|
0x48,0x4b,0xa4,0x27,0x86,0x24,0x86,0x25,0x46,0x24,0x32,0x12,0x59,0x89,0xf1,0x89,
|
|
0xec,0x44,0x4e,0x62,0x6a,0x62,0x7a,0x62,0x66,0xa2,0x20,0x51,0x92,0x28,0x4d,0x94,
|
|
0x27,0x2a,0x13,0xd5,0x89,0xba,0x44,0x63,0xa2,0x29,0xb1,0x36,0xb1,0x21,0xb1,0x29,
|
|
0xb1,0x2d,0xb1,0xf3,0xaf,0xa6,0x2b,0xb1,0x3b,0xd1,0x9c,0xd8,0x9f,0x38,0x98,0x38,
|
|
0x94,0x38,0x9c,0x38,0x92,0x38,0x9a,0x38,0x96,0x38,0x9e,0x38,0x95,0x38,0x9d,0x68,
|
|
0x49,0x9c,0x4f,0x5c,0x48,0x5c,0x4a,0x5c,0x4e,0x5c,0x49,0x5c,0x4d,0xc4,0x25,0xd9,
|
|
0x26,0xe1,0x93,0x1c,0x92,0xdc,0x92,0x88,0x49,0x94,0xa4,0x90,0x24,0x46,0x12,0x3b,
|
|
0x29,0x3d,0x49,0x90,0x24,0x4d,0x52,0x27,0x99,0x92,0x9a,0x92,0x3a,0x92,0xcc,0x49,
|
|
0x43,0x49,0xa3,0x49,0x93,0x49,0x96,0xa4,0xf9,0xa4,0x85,0xa4,0xa5,0xa4,0x65,0x08,
|
|
0x8e,0xed,0xc0,0x76,0x63,0x13,0xd9,0x14,0x36,0x9d,0x1d,0xc6,0x66,0xb0,0xe3,0xd9,
|
|
0x1c,0x76,0x3a,0x9b,0xc7,0x16,0xb1,0xa5,0x6c,0x25,0x5b,0xc7,0x36,0xb1,0x1b,0xd8,
|
|
0x2d,0xec,0x0e,0x76,0x37,0xbb,0x9f,0x3d,0xc4,0x1e,0x61,0x8f,0xb1,0x27,0xd9,0xd3,
|
|
0xec,0x79,0xf6,0x12,0x7b,0x85,0x8d,0x3b,0x81,0x3f,0xe1,0x74,0xc2,0xed,0x84,0xd7,
|
|
0x09,0xdf,0x13,0x94,0x13,0xf4,0x13,0x61,0x27,0x18,0x27,0xe2,0x4f,0x70,0x4e,0xa4,
|
|
0x9f,0xe0,0x9d,0x10,0x9d,0x90,0x9e,0x50,0x9e,0xd0,0x9d,0x30,0x9d,0x68,0x38,0xd1,
|
|
0x72,0xa2,0xe3,0x44,0xf7,0x89,0xfe,0x13,0x43,0x27,0x46,0x4e,0x8c,0x9d,0x98,0x3c,
|
|
0x31,0x7d,0x62,0xfe,0xc4,0xd2,0x89,0x95,0x13,0xb8,0x93,0xf8,0x93,0x4e,0x27,0xdd,
|
|
0x4e,0x7a,0x9d,0xf4,0x3d,0x49,0x39,0x49,0x3f,0x19,0x76,0x92,0x71,0x32,0xfe,0x24,
|
|
0xe7,0x64,0xfa,0x49,0xde,0x49,0xd1,0x49,0xe9,0x49,0xe5,0x49,0xdd,0x49,0xd3,0xc9,
|
|
0x86,0x93,0x2d,0x27,0x3b,0x4e,0x76,0x9f,0xec,0x3f,0x39,0x74,0x72,0xe4,0xe4,0xd8,
|
|
0xc9,0xc9,0x93,0xd3,0x27,0xe7,0x4f,0x2e,0x9d,0x5c,0x39,0x69,0x9b,0xec,0x94,0xec,
|
|
0x91,0xec,0x9b,0x4c,0x4b,0x0e,0x4b,0x66,0x25,0x73,0x92,0x33,0x93,0x45,0xc9,0xf2,
|
|
0x64,0x5d,0xb2,0x29,0xb9,0x21,0xb9,0x25,0xb9,0x23,0xb9,0x3b,0xb9,0x3f,0x79,0x28,
|
|
0x79,0x24,0x79,0x2c,0x79,0x32,0x79,0x3a,0x79,0x3e,0x79,0x29,0x79,0x25,0x19,0xc7,
|
|
0xc1,0x73,0x9c,0x38,0x6e,0x1c,0x2f,0x8e,0x2f,0x87,0xc2,0xa1,0x73,0xc2,0x38,0x0c,
|
|
0x4e,0x3c,0x87,0xc3,0x49,0xe7,0xf0,0x38,0x22,0x8e,0x94,0xa3,0xe4,0xe8,0x38,0x26,
|
|
0x4e,0x03,0xa7,0x85,0xd3,0xc1,0xe9,0xe6,0xf4,0x73,0x86,0x38,0x23,0x9c,0x31,0xce,
|
|
0x24,0x67,0x9a,0x33,0xcf,0x59,0xe2,0xac,0x72,0xf0,0xa7,0x5c,0x4e,0x79,0x9d,0x22,
|
|
0x9d,0xa2,0x9d,0x0a,0x39,0x15,0x71,0x8a,0x75,0x8a,0x7d,0x2a,0xf5,0x54,0xe6,0x29,
|
|
0xc1,0x29,0xc9,0x29,0xf9,0x29,0xf5,0x29,0xe3,0xa9,0xda,0x53,0x4d,0xa7,0xda,0x4e,
|
|
0x75,0x9d,0x32,0x9f,0x1a,0x3c,0x35,0x7c,0x6a,0xf4,0xd4,0xf8,0xa9,0xa9,0x53,0x96,
|
|
0x53,0x0b,0xa7,0x96,0x4f,0xad,0x9e,0xb2,0x3d,0xed,0x70,0xda,0xe5,0xb4,0xc7,0x69,
|
|
0xe2,0x69,0xd2,0x69,0xda,0xe9,0x90,0xd3,0x11,0xa7,0x59,0xa7,0xd9,0xa7,0x53,0x4f,
|
|
0x67,0x9e,0x16,0x9c,0x96,0x9c,0x96,0x9f,0x56,0x9f,0x36,0x9e,0xae,0x3d,0xdd,0x74,
|
|
0xba,0xed,0x74,0xd7,0x69,0xf3,0xe9,0xc1,0xd3,0xc3,0xa7,0x47,0x4f,0x8f,0x9f,0x9e,
|
|
0x3a,0x6d,0x39,0xbd,0x70,0x7a,0xf9,0xf4,0xea,0x69,0xdb,0x14,0x87,0x14,0x97,0x14,
|
|
0x8f,0x14,0x62,0x0a,0x29,0x85,0x96,0x12,0x92,0x12,0x91,0x12,0x9f,0x92,0x9a,0x92,
|
|
0x99,0x22,0x48,0x91,0xa4,0xc8,0x53,0xd4,0x29,0xc6,0x94,0xda,0x94,0xa6,0x94,0xb6,
|
|
0x94,0xae,0x14,0x73,0xca,0x60,0xca,0x70,0xca,0x68,0xca,0x78,0xca,0x54,0x8a,0x25,
|
|
0x65,0x29,0x65,0x35,0x05,0x9f,0xea,0x94,0xea,0x96,0xea,0x95,0xea,0x9b,0x4a,0x49,
|
|
0xa5,0xa7,0x86,0xa5,0x32,0x52,0xe3,0x53,0x39,0xa9,0xe9,0x10,0x5e,0xaa,0x28,0x55,
|
|
0x9a,0xaa,0x4c,0xd5,0xa5,0x9a,0x52,0x1b,0x52,0x5b,0x52,0x3b,0x52,0xbb,0x53,0xfb,
|
|
0x53,0x87,0x52,0x47,0x52,0xc7,0x52,0x27,0x53,0xa7,0x53,0xe7,0x53,0x97,0x52,0x57,
|
|
0x52,0x71,0x67,0xf0,0x67,0x9c,0xce,0xb8,0x9d,0xf1,0x3a,0xe3,0x7b,0x86,0x72,0x86,
|
|
0x7e,0x26,0xec,0x0c,0xe3,0x4c,0xfc,0x19,0xce,0x99,0xf4,0x33,0xbc,0x33,0xa2,0x33,
|
|
0xd2,0x33,0xca,0x33,0xba,0x33,0xa6,0x33,0x0d,0x67,0x5a,0xce,0x74,0x9c,0xe9,0x3e,
|
|
0xd3,0x7f,0x66,0xe8,0xcc,0xc8,0x99,0xb1,0x33,0x93,0x67,0xa6,0xcf,0xcc,0x9f,0x59,
|
|
0x3a,0xb3,0x72,0x06,0x77,0x16,0x7f,0xd6,0xe9,0xac,0xdb,0x59,0xaf,0xb3,0xbe,0x67,
|
|
0x29,0x67,0xe9,0x67,0xc3,0xce,0x32,0xce,0xc6,0xfd,0x09,0xc4,0x9f,0x4d,0x3d,0xcb,
|
|
0x3b,0x2b,0x39,0xab,0x3c,0x6b,0x3c,0xdb,0x70,0xb6,0xed,0x6c,0xf7,0xd9,0xc1,0xb3,
|
|
0x23,0x67,0xc7,0xcf,0x4e,0x9f,0x5d,0x38,0xbb,0x72,0xd6,0x36,0xcd,0x29,0xcd,0x23,
|
|
0xcd,0x37,0x8d,0x96,0x16,0x96,0xc6,0x4a,0xe3,0xa4,0x65,0xa6,0x89,0xd2,0xe4,0x69,
|
|
0xba,0xb4,0xda,0xb4,0x96,0xb4,0xae,0xb4,0xfe,0xb4,0xe1,0xb4,0xb1,0xb4,0xa9,0xb4,
|
|
0xf9,0xb4,0xe5,0x34,0x5c,0xba,0x43,0xba,0x5b,0x3a,0x31,0x9d,0x92,0x1e,0x92,0xce,
|
|
0x48,0x67,0xa7,0xa7,0xa7,0x0b,0xd2,0xa5,0xe9,0xea,0x74,0x53,0x7a,0x53,0x7a,0x47,
|
|
0xba,0x39,0x7d,0x28,0x7d,0x34,0x7d,0x32,0xdd,0x92,0xbe,0x94,0xbe,0x9a,0x8e,0xff,
|
|
0xc8,0xe5,0x23,0xaf,0x8f,0x48,0x1f,0xd1,0x3f,0x8a,0xf8,0x28,0x0e,0x12,0xff,0x51,
|
|
0xea,0x47,0xbc,0x8f,0x24,0x1f,0x29,0x3f,0x32,0x7e,0xd4,0xf0,0x51,0xdb,0x47,0xdd,
|
|
0x1f,0x0d,0x7e,0x34,0xf2,0xd1,0xf8,0x47,0xd3,0x1f,0x2d,0x7c,0xb4,0xf2,0x91,0xed,
|
|
0xc7,0x4e,0x1f,0x7b,0x7c,0xec,0xfb,0x31,0xed,0xe3,0xb0,0x8f,0x59,0x1f,0x73,0x3e,
|
|
0xce,0xfc,0x58,0xf4,0xb1,0xfc,0x63,0xdd,0xc7,0xb5,0x1f,0xb7,0x7c,0xdc,0xf5,0x71,
|
|
0xff,0xc7,0xc3,0x1f,0x8f,0x7d,0x3c,0xf5,0xf1,0xfc,0xc7,0xcb,0x1f,0xe3,0x32,0x1c,
|
|
0x32,0xdc,0x32,0x88,0x19,0x94,0x8c,0x90,0x0c,0x46,0x06,0x3b,0x23,0x3d,0x43,0x90,
|
|
0x21,0xcd,0x50,0x67,0x98,0x32,0x9a,0x32,0x3a,0x32,0xcc,0x19,0x43,0x19,0xa3,0x19,
|
|
0x13,0xbf,0x32,0x93,0x19,0x96,0x8c,0xa5,0x0c,0x5c,0xa6,0x53,0xa6,0x57,0x26,0x25,
|
|
0x33,0x2c,0x33,0x3e,0x33,0x3d,0x53,0x90,0x69,0xce,0x1c,0xcf,0x9c,0xf9,0x13,0xb1,
|
|
0x64,0xce,0x67,0x2e,0x64,0x2e,0x65,0x2e,0x67,0xae,0x64,0xae,0x66,0xe2,0xb2,0x6c,
|
|
0xb3,0xf0,0x59,0xce,0x7f,0x06,0x2e,0x59,0x1e,0x59,0x5e,0x59,0xc4,0x2c,0xdf,0x2c,
|
|
0x52,0x16,0x25,0x8b,0x96,0x45,0xcf,0x0a,0xc9,0x0a,0xcb,0x8a,0xc8,0x62,0x64,0xb1,
|
|
0xb2,0xe2,0xb3,0xd8,0x59,0x9c,0xac,0xd4,0xac,0xf4,0xac,0xcc,0x2c,0x5e,0x16,0x1f,
|
|
0x22,0xc8,0x12,0x65,0x49,0xb2,0xe4,0x59,0xea,0x2c,0x63,0x56,0x6d,0x56,0x43,0x56,
|
|
0x53,0x56,0x4b,0x56,0x5b,0x56,0x47,0x56,0x67,0x56,0x57,0x56,0x77,0x96,0x39,0xab,
|
|
0x3f,0x6b,0x30,0x6b,0x28,0x6b,0x38,0x6b,0x24,0x6b,0x34,0x6b,0x2c,0x6b,0x3c,0x6b,
|
|
0x32,0x6b,0x2a,0x6b,0x3a,0xcb,0x92,0x35,0x9f,0xb5,0x90,0xb5,0x94,0xb5,0x9c,0xf5,
|
|
0x32,0x6b,0x25,0x6b,0x35,0x0b,0x77,0xce,0xf6,0x9c,0x1d,0x06,0xfe,0x9c,0xd3,0x39,
|
|
0xb7,0x73,0x9e,0xe7,0xbc,0xce,0xf9,0x9c,0xf3,0x3d,0x47,0x39,0x47,0x3f,0x17,0x76,
|
|
0x8e,0x71,0x2e,0xfe,0x1c,0xe7,0x5c,0xfa,0x39,0xde,0x39,0xd1,0x39,0xe9,0x39,0xf9,
|
|
0x39,0xf5,0x39,0xe3,0xb9,0xda,0x73,0x4d,0xe7,0xda,0xce,0x75,0x9d,0x33,0x9f,0x1b,
|
|
0x3c,0x37,0x7c,0x6e,0xf4,0xdc,0xf8,0xb9,0xa9,0x73,0xd3,0xe7,0x2c,0xe7,0xe6,0xcf,
|
|
0x2d,0x9c,0x5b,0x3a,0xb7,0x7c,0x6e,0xe5,0xdc,0xea,0x39,0x1c,0xd7,0x96,0x8b,0xe7,
|
|
0x3a,0x70,0x9d,0xb8,0x2e,0x5c,0x37,0xae,0x07,0xd7,0x8b,0x4b,0xe4,0xfa,0x72,0x49,
|
|
0x5c,0x0a,0x97,0xc6,0xa5,0x73,0x43,0xb8,0x61,0xdc,0x08,0x2e,0x83,0xcb,0xe2,0xc6,
|
|
0x73,0xd9,0x5c,0x0e,0x37,0x95,0x9b,0xce,0xcd,0xe4,0xf2,0xb8,0x02,0xae,0x88,0x2b,
|
|
0xe1,0x4a,0xb9,0x72,0xae,0x92,0xab,0xe6,0xea,0xb8,0x46,0xae,0x89,0x5b,0xcb,0x6d,
|
|
0xe0,0x36,0x71,0x5b,0xb8,0x6d,0xdc,0x0e,0x6e,0x17,0xb7,0x9b,0x6b,0xe6,0xf6,0x73,
|
|
0x07,0xb9,0x43,0xdc,0x61,0xee,0x08,0x77,0x94,0x3b,0xc6,0x1d,0xe7,0x4e,0x72,0xa7,
|
|
0xb8,0xd3,0x5c,0x0b,0x77,0x9e,0xbb,0xc0,0x5d,0xe2,0x2e,0x73,0x57,0xb8,0xab,0x5c,
|
|
0x1c,0xcf,0x96,0x87,0xe7,0x39,0xf0,0x9c,0x78,0x2e,0x3c,0x37,0x9e,0x07,0xcf,0x8b,
|
|
0x47,0xe4,0xf9,0xf2,0x48,0x3c,0x0a,0x8f,0xc6,0xa3,0xf3,0x42,0x78,0x61,0xbc,0x08,
|
|
0x1e,0x83,0xc7,0xe2,0xc5,0xf3,0xd8,0x3c,0x0e,0x2f,0x95,0x97,0xce,0xcb,0xe4,0xf1,
|
|
0x78,0x02,0x9e,0x88,0x27,0xe1,0x49,0x79,0x72,0x9e,0x8e,0x57,0xcb,0x6b,0xe1,0x75,
|
|
0xf1,0xfa,0x79,0xc3,0xbc,0x51,0xde,0xe3,0x5f,0x18,0xe7,0x4d,0xf2,0xa6,0x78,0xd3,
|
|
0x3c,0x0b,0x6f,0x9e,0xb7,0xc0,0x5b,0xe2,0x2d,0xf3,0x56,0x78,0xab,0x3c,0x5c,0xb6,
|
|
0x6d,0x36,0x3e,0xdb,0x21,0xdb,0x29,0xdb,0x25,0xdb,0x2d,0xdb,0x23,0xdb,0x2b,0x9b,
|
|
0x98,0xed,0x9b,0x4d,0xca,0xa6,0x64,0xd3,0xb2,0xe9,0xd9,0x21,0xd9,0x61,0xd9,0x11,
|
|
0xd9,0x8c,0x6c,0x56,0x76,0x7c,0x36,0x3b,0x9b,0x93,0x9d,0x9a,0x9d,0x9e,0x9d,0x99,
|
|
0xcd,0xcb,0x16,0x64,0x8b,0xb2,0x25,0xd9,0xd2,0x6c,0x79,0xb6,0x32,0x5b,0x9d,0xad,
|
|
0xcb,0x36,0x66,0x9b,0xb2,0x6b,0xb3,0x1b,0xb2,0x9b,0xb2,0x5b,0xb2,0xdb,0xb2,0x3b,
|
|
0xb2,0xbb,0xb2,0xbb,0xb3,0xcd,0xd9,0xfd,0xd9,0x83,0xd9,0x43,0xd9,0xc3,0xd9,0x23,
|
|
0xd9,0xa3,0xd9,0x63,0xd9,0xe3,0xd9,0x93,0xd9,0x53,0xd9,0xd3,0xd9,0x96,0xec,0xf9,
|
|
0xec,0x85,0xec,0xa5,0xec,0xe5,0xec,0x95,0xec,0xd5,0x6c,0x5c,0x8e,0x6d,0x0e,0x3e,
|
|
0xc7,0x21,0xc7,0x29,0xc7,0x25,0xc7,0x2d,0xc7,0x23,0xc7,0x2b,0x87,0x98,0xe3,0x9b,
|
|
0x43,0xca,0xa1,0xe4,0xd0,0x72,0xe8,0x39,0x21,0x39,0x61,0x39,0x11,0x39,0x8c,0x1c,
|
|
0x56,0x4e,0x7c,0x0e,0x3b,0x87,0x93,0x93,0x9a,0x93,0x9e,0x93,0x99,0xc3,0xcb,0x11,
|
|
0xe4,0x88,0x72,0x24,0x39,0xd2,0x1c,0x79,0x8e,0x32,0x47,0x9d,0xa3,0xcb,0x31,0xe6,
|
|
0x98,0x72,0x6a,0x73,0x1a,0x72,0x9a,0x72,0x5a,0x72,0xda,0x72,0x3a,0x72,0xba,0x72,
|
|
0xba,0x73,0xcc,0x39,0xfd,0x39,0x83,0x39,0x43,0x39,0xc3,0x39,0x23,0x39,0xa3,0x39,
|
|
0x63,0x39,0xe3,0x39,0x93,0x39,0x53,0x39,0xd3,0x39,0x96,0x9c,0xf9,0x9c,0x85,0x9c,
|
|
0xa5,0x9c,0xe5,0x9c,0x95,0x9c,0xd5,0x1c,0x1c,0xdf,0x96,0x8f,0xe7,0x3b,0xf0,0x9d,
|
|
0xf8,0x2e,0x7c,0x37,0xbe,0x07,0xdf,0x8b,0x4f,0xe4,0xfb,0xf2,0x49,0x7c,0x0a,0x9f,
|
|
0xc6,0xa7,0xf3,0x43,0xf8,0x61,0xfc,0x08,0x3e,0x03,0xbe,0x28,0xc7,0xf3,0xd9,0x7c,
|
|
0x0e,0x3f,0x95,0x9f,0xce,0xcf,0xe4,0xf3,0xf8,0x02,0xbe,0x88,0x2f,0xe1,0x4b,0xf9,
|
|
0x72,0xbe,0x92,0xaf,0xe6,0xeb,0xf8,0x46,0xbe,0x89,0x5f,0xcb,0x6f,0xe0,0x37,0xf1,
|
|
0x5b,0xf8,0x6d,0xfc,0x0e,0x7e,0x17,0xbf,0x9b,0x6f,0xe6,0xf7,0xf3,0x07,0xf9,0x43,
|
|
0xfc,0x61,0xfe,0x08,0xff,0xa1,0x95,0x51,0xfe,0x18,0x7f,0x9c,0x3f,0xc9,0x9f,0xe2,
|
|
0x4f,0xf3,0x67,0x20,0x16,0xfe,0x3c,0x7f,0x81,0xbf,0xc4,0x5f,0xe6,0xaf,0xf0,0x5f,
|
|
0x41,0x56,0xf9,0x38,0x81,0xad,0x00,0x2f,0x70,0x10,0x38,0x09,0x9c,0x21,0x2e,0x02,
|
|
0x37,0x81,0x87,0xc0,0xd3,0x8a,0x97,0x80,0x28,0xf0,0x15,0x90,0x04,0x34,0x01,0x5d,
|
|
0x10,0x22,0x08,0x15,0x84,0x09,0x22,0x04,0x0c,0x01,0x4b,0x10,0x2f,0x60,0x0b,0x38,
|
|
0x82,0x94,0x75,0xfe,0x04,0x52,0x05,0xe9,0x82,0x4c,0x01,0x4f,0x20,0x10,0x08,0x05,
|
|
0x22,0x81,0x44,0x20,0x15,0xc8,0x05,0x4a,0x81,0x5a,0xa0,0x13,0x18,0x05,0x26,0x41,
|
|
0xad,0xa0,0x41,0xd0,0x24,0x68,0x11,0xb4,0x09,0x3a,0x04,0x5d,0x82,0x6e,0x81,0x59,
|
|
0xd0,0x2f,0x18,0x14,0x0c,0x09,0x86,0x05,0x23,0x82,0x51,0xc1,0x98,0x60,0x5c,0x30,
|
|
0x29,0x98,0x12,0x4c,0x0b,0x2c,0x82,0x79,0xc1,0x82,0x60,0x49,0xb0,0x2c,0x58,0x11,
|
|
0xac,0x0a,0x70,0xe7,0x6d,0xcf,0xe3,0xcf,0x3b,0x9c,0x77,0x3a,0xef,0x72,0xde,0xf5,
|
|
0xbc,0xdb,0x79,0x8f,0xf3,0x5e,0xe7,0x89,0xe7,0x7d,0xcf,0x93,0xce,0x53,0xce,0xd3,
|
|
0xce,0xd3,0xcf,0x07,0xaf,0xf3,0x4f,0x4e,0x38,0x84,0xf9,0x3f,0x92,0xb4,0x8e,0x95,
|
|
0x94,0xf3,0x19,0xeb,0xac,0xf3,0x17,0xc1,0x3f,0x2f,0x5e,0x67,0x9d,0x7f,0x61,0x64,
|
|
0xe7,0x55,0x10,0xc3,0x3a,0xff,0xa6,0xd4,0x9c,0x6f,0xfc,0x37,0xa6,0x75,0x9d,0x75,
|
|
0x7e,0x35,0x3a,0xcf,0xf7,0x9e,0xbf,0x77,0xfe,0xe1,0xf9,0x89,0xf3,0x33,0xe7,0x17,
|
|
0xff,0xa9,0x78,0x79,0x1e,0xe4,0xda,0xe7,0xba,0xe6,0x7a,0xe7,0x92,0xd7,0x59,0xe7,
|
|
0xff,0x22,0x14,0x08,0x2d,0x97,0x9e,0x1b,0x92,0x1b,0x96,0x1b,0x91,0xcb,0xc8,0x65,
|
|
0xe5,0xc6,0xe7,0xb2,0x73,0x39,0xb9,0xa9,0xb9,0xe9,0xb9,0x99,0xb9,0xbc,0x5c,0x41,
|
|
0xae,0x28,0x57,0x92,0x2b,0xcd,0x95,0xe7,0x2a,0x73,0xd5,0xb9,0xba,0x5c,0x63,0xae,
|
|
0x29,0xb7,0x36,0xb7,0x21,0xb7,0x29,0xb7,0x25,0xb7,0x2d,0xb7,0x23,0xb7,0x2b,0xb7,
|
|
0x3b,0xd7,0x9c,0xdb,0x9f,0x3b,0x98,0x3b,0x94,0x3b,0x9c,0x3b,0x92,0x3b,0x9a,0x3b,
|
|
0x96,0x3b,0x9e,0x3b,0x99,0x3b,0x95,0x3b,0x9d,0x6b,0xc9,0x9d,0xcf,0x5d,0xc8,0x5d,
|
|
0xca,0x5d,0xce,0x5d,0xc9,0x5d,0xcd,0xc5,0x09,0x6d,0x85,0x78,0xa1,0x83,0xd0,0x49,
|
|
0xe8,0x22,0x74,0x13,0x7a,0x08,0xbd,0x84,0x44,0xa1,0xaf,0x90,0x24,0xa4,0x08,0x69,
|
|
0x42,0xba,0x30,0x44,0x18,0x26,0x8c,0x10,0x32,0x84,0x2c,0x61,0xbc,0x90,0x2d,0xe4,
|
|
0x08,0x53,0x85,0xe9,0xc2,0x4c,0x21,0x4f,0x28,0x10,0x8a,0x84,0x12,0xa1,0x54,0x28,
|
|
0x17,0x2a,0x85,0x2a,0xa1,0x5a,0xa8,0x13,0x1a,0x85,0x26,0x61,0xad,0xb0,0x41,0xd8,
|
|
0x24,0x6c,0x11,0xb6,0x09,0x3b,0x84,0x5d,0xc2,0x6e,0xa1,0x59,0xd8,0x2f,0x1c,0x14,
|
|
0x0e,0x09,0x87,0x85,0x23,0xc2,0x51,0xe1,0x98,0x70,0x5c,0x38,0x29,0x9c,0x12,0x4e,
|
|
0x0b,0x2d,0xc2,0x79,0xe1,0x82,0x70,0x49,0xb8,0x2c,0x5c,0x11,0xae,0x0a,0x71,0x22,
|
|
0x5b,0x11,0x5e,0xe4,0x20,0x72,0x12,0xb9,0x88,0xdc,0x44,0x1e,0x22,0x2f,0x11,0x51,
|
|
0xe4,0x2b,0x22,0x89,0x28,0x22,0x9a,0x88,0x2e,0x0a,0x11,0x85,0x89,0x22,0x44,0x0c,
|
|
0x11,0x4b,0x14,0x2f,0x62,0x8b,0x38,0xa2,0x54,0x51,0xba,0x28,0x53,0xc4,0x13,0x09,
|
|
0x44,0x22,0x91,0x44,0x24,0x15,0xc9,0x45,0x4a,0x91,0x5a,0xa4,0x13,0x19,0x45,0x26,
|
|
0x51,0xad,0xa8,0x41,0xd4,0x24,0x6a,0x16,0xb5,0x88,0xda,0x44,0xed,0x90,0x0e,0x51,
|
|
0x27,0xa4,0x4b,0xd4,0x2d,0xea,0x85,0x98,0x45,0xfd,0xa2,0x41,0xd1,0x90,0xe8,0xbe,
|
|
0x68,0x58,0x34,0x22,0x1a,0x15,0x8d,0x89,0xc6,0x45,0x93,0xa2,0x29,0xd1,0xb4,0xc8,
|
|
0x22,0x9a,0x17,0x2d,0x88,0x96,0x44,0x2f,0x44,0xcb,0xa2,0x97,0xa2,0x15,0xd1,0xaa,
|
|
0x08,0x97,0x67,0x9b,0x87,0xcf,0x73,0xc8,0x73,0xca,0x73,0xce,0x73,0xc9,0x73,0xcb,
|
|
0xf3,0xc8,0xf3,0xca,0x23,0xe6,0xf9,0xe6,0x91,0xf2,0x28,0x79,0xb4,0x3c,0x7a,0x5e,
|
|
0x48,0x5e,0x58,0x5e,0x44,0x1e,0x23,0x8f,0x95,0x17,0x9f,0xc7,0xce,0xe3,0xe4,0xa5,
|
|
0xe6,0xa5,0xe7,0x65,0xe6,0xf1,0xf2,0x04,0x79,0xa2,0x3c,0x49,0x9e,0x34,0x4f,0x9e,
|
|
0xa7,0xcc,0x53,0xe7,0xe9,0xf2,0x8c,0x79,0xa6,0xbc,0xda,0xbc,0x86,0xbc,0xa6,0xbc,
|
|
0x96,0xbc,0xb6,0xbc,0x8e,0xbc,0xae,0xbc,0xee,0x3c,0x73,0x5e,0x7f,0xde,0x60,0xde,
|
|
0x50,0xde,0x70,0xde,0x48,0xde,0x68,0xde,0x58,0xde,0x78,0xde,0x64,0xde,0x54,0xde,
|
|
0x74,0x9e,0x25,0x6f,0x3e,0x6f,0x21,0x6f,0x29,0x6f,0x39,0x6f,0x25,0x6f,0x35,0x0f,
|
|
0x97,0x8f,0xcb,0xb7,0xcd,0xc7,0xe7,0x3b,0xe4,0x3b,0xe5,0xbb,0xe4,0xbb,0xe6,0xbb,
|
|
0xe5,0x7b,0xe4,0x7b,0xe5,0x13,0xf3,0x7d,0x20,0xbe,0xf9,0xa4,0x7c,0x4a,0x3e,0x2d,
|
|
0x9f,0x9e,0x1f,0x92,0x1f,0x96,0x1f,0x91,0x1f,0x99,0xcf,0xc8,0x67,0xe5,0xc7,0xe7,
|
|
0xb3,0xf3,0x39,0xf9,0xa9,0xf9,0xe9,0xf9,0x19,0xf9,0x99,0xf9,0xbc,0x7c,0x41,0xbe,
|
|
0x28,0x5f,0x92,0x2f,0xcd,0x97,0xe7,0x2b,0xf3,0xd5,0xf9,0xba,0x7c,0x63,0xbe,0x29,
|
|
0xbf,0x36,0xbf,0x21,0xbf,0x29,0xbf,0x25,0xbf,0x2d,0xbf,0x23,0xbf,0x2b,0xbf,0x3b,
|
|
0xdf,0x9c,0xdf,0x9f,0x3f,0x98,0x3f,0x94,0x3f,0x9c,0x3f,0x92,0x3f,0x9a,0x3f,0x96,
|
|
0xff,0x38,0x7f,0x3c,0x7f,0x32,0x7f,0x2a,0x7f,0x3a,0x7f,0x26,0xdf,0x92,0x3f,0x9f,
|
|
0xbf,0x90,0xbf,0x94,0xbf,0x9c,0xff,0x32,0x7f,0x25,0xff,0x95,0x95,0xd5,0x7c,0x9c,
|
|
0xd8,0x56,0x8c,0x17,0x3b,0x88,0x9d,0xc4,0x2e,0x62,0x57,0xb1,0x9b,0xd8,0x43,0xec,
|
|
0x25,0x26,0x8a,0x7d,0xc5,0x24,0x31,0x45,0x4c,0x13,0xd3,0xc5,0x21,0xe2,0x30,0x71,
|
|
0x84,0x98,0x21,0x66,0x89,0xe3,0xc5,0x6c,0x31,0x47,0x9c,0x2a,0x4e,0x17,0x67,0x8a,
|
|
0x79,0x62,0x81,0x58,0x24,0x96,0x88,0xa5,0x62,0xb9,0x58,0x29,0x56,0x8b,0x75,0x62,
|
|
0xa3,0xd8,0x24,0xae,0x15,0x37,0x88,0x9b,0xc4,0x2d,0xe2,0x36,0x71,0x87,0xb8,0x4b,
|
|
0xdc,0x2d,0x36,0x8b,0xfb,0xc5,0x83,0xe2,0x21,0xf1,0xb0,0x78,0x44,0x3c,0x2a,0x1e,
|
|
0x13,0x8f,0x8b,0x27,0xc5,0x53,0xe2,0x69,0xb1,0x45,0x3c,0x2f,0x5e,0x10,0x2f,0x89,
|
|
0x97,0xc5,0x2b,0xe2,0x55,0x31,0x4e,0x62,0x2b,0xc1,0x4b,0x1c,0x24,0x4e,0x12,0x17,
|
|
0x89,0x9b,0xc4,0x43,0xe2,0x25,0x21,0x4a,0x7c,0x25,0x24,0x09,0x45,0x42,0x93,0xd0,
|
|
0x25,0x21,0x92,0x30,0x49,0x84,0x84,0x21,0x61,0x49,0xe2,0x25,0x6c,0x09,0x47,0x92,
|
|
0x2a,0x49,0x97,0x64,0x4a,0x78,0x12,0x81,0x44,0x24,0x91,0x48,0xa4,0x12,0xb9,0x44,
|
|
0x29,0x51,0x4b,0x74,0x12,0xa3,0xc4,0x24,0xa9,0x95,0x34,0x48,0x9a,0x24,0x2d,0x92,
|
|
0x36,0x49,0x87,0xa4,0x4b,0xd2,0x2d,0x31,0x4b,0xfa,0x25,0x83,0x92,0x21,0xc9,0xb0,
|
|
0x64,0x44,0x32,0x2a,0x19,0x93,0x8c,0x4b,0x26,0x25,0x53,0x92,0x69,0x89,0x45,0x32,
|
|
0x2f,0x59,0x90,0x2c,0x49,0x96,0x25,0x2b,0x92,0x55,0x09,0xae,0xc0,0xb6,0x00,0x5f,
|
|
0xe0,0x50,0xe0,0x54,0xe0,0x52,0xe0,0x56,0xe0,0x51,0xe0,0x55,0x40,0x2c,0xf0,0x2d,
|
|
0x20,0x15,0x50,0x0a,0x68,0x05,0xf4,0x82,0x90,0x82,0xb0,0x82,0x88,0x02,0x46,0x01,
|
|
0xab,0x20,0xbe,0x80,0x5d,0xc0,0x29,0x48,0x2d,0x48,0x2f,0xc8,0x2c,0xe0,0x15,0x08,
|
|
0x0a,0x44,0x05,0x92,0x02,0x69,0x81,0xbc,0x40,0x59,0xa0,0x2e,0xd0,0x15,0x18,0x0b,
|
|
0x4c,0x05,0xb5,0x05,0x0d,0x05,0x4d,0x05,0x2d,0x05,0x6d,0x05,0x1d,0x05,0x5d,0x05,
|
|
0xdd,0x05,0xe6,0x82,0xfe,0x82,0xc1,0x82,0xa1,0x82,0xe1,0x82,0x91,0x82,0xd1,0x82,
|
|
0x31,0xc8,0x78,0xc1,0x64,0xc1,0x54,0xc1,0x74,0x81,0xa5,0x60,0xbe,0x60,0xa1,0x60,
|
|
0xa9,0x60,0xb9,0x60,0xa5,0x60,0xb5,0x00,0x57,0x68,0x5b,0x88,0x2f,0x74,0x28,0x74,
|
|
0x2a,0x74,0x29,0x74,0x2b,0xf4,0x28,0xf4,0x2a,0x24,0x16,0xfa,0x16,0x92,0x0a,0x29,
|
|
0x85,0xb4,0x42,0x7a,0x61,0x48,0x61,0x58,0x61,0x44,0x21,0xa3,0x90,0x55,0x18,0x5f,
|
|
0xc8,0x2e,0xe4,0x14,0xa6,0x16,0xa6,0x17,0x66,0x16,0xf2,0x0a,0x05,0x85,0xa2,0x42,
|
|
0x49,0xa1,0xb4,0x50,0x5e,0xa8,0x2c,0x54,0x17,0xea,0x0a,0x8d,0x85,0xa6,0xc2,0xda,
|
|
0xc2,0x86,0xc2,0xa6,0xc2,0x96,0xc2,0xb6,0xc2,0x8e,0xc2,0xae,0xc2,0xee,0x42,0x73,
|
|
0x61,0x7f,0xe1,0x60,0xe1,0x50,0xe1,0x70,0xe1,0x48,0xe1,0x68,0xe1,0x58,0xe1,0x78,
|
|
0xe1,0x64,0xe1,0x54,0xe1,0x74,0xa1,0xa5,0x70,0xbe,0x70,0xa1,0x70,0xa9,0x70,0xb9,
|
|
0x70,0xa5,0x70,0xb5,0x10,0x57,0x64,0x5b,0x84,0x2f,0x72,0x28,0x72,0x2a,0x72,0x29,
|
|
0x72,0x2b,0xf2,0x28,0xf2,0x2a,0x22,0x16,0xf9,0x16,0x91,0x8a,0x28,0x45,0xb4,0x22,
|
|
0x7a,0x51,0x48,0x51,0x58,0x51,0x44,0x11,0xa3,0x88,0x55,0x14,0x5f,0xc4,0x2e,0xe2,
|
|
0x14,0xa5,0x16,0xa5,0x17,0x65,0x16,0xf1,0x8a,0x04,0x45,0xa2,0x22,0x49,0x91,0xb4,
|
|
0x48,0x5e,0xa4,0x2c,0x52,0x17,0xe9,0x8a,0x8c,0x45,0xa6,0xa2,0xda,0xa2,0x86,0xa2,
|
|
0xa6,0xa2,0x96,0xa2,0xb6,0xa2,0x8e,0xa2,0xae,0xa2,0xee,0x22,0x73,0x51,0x7f,0xd1,
|
|
0x60,0xd1,0x50,0xd1,0x70,0xd1,0x48,0xd1,0x68,0xd1,0x58,0xd1,0x78,0xd1,0x64,0xd1,
|
|
0x54,0xd1,0x74,0x91,0xa5,0x68,0xbe,0x68,0xa1,0x68,0xa9,0x68,0xb9,0x68,0xa5,0x68,
|
|
0xb5,0x08,0x27,0xb5,0x95,0xe2,0xa5,0x0e,0x52,0x27,0xa9,0x8b,0xd4,0x4d,0xea,0x21,
|
|
0xf5,0x92,0x12,0xa5,0xbe,0x52,0x92,0x94,0x22,0xa5,0x49,0xe9,0xd2,0x10,0x69,0x98,
|
|
0x34,0x42,0xca,0x90,0xb2,0xa4,0xf1,0x52,0xb6,0x94,0x23,0x4d,0x95,0xa6,0x4b,0x33,
|
|
0xa5,0x5c,0x08,0x4f,0x2a,0x90,0x8a,0xa4,0x12,0xa9,0x54,0x2a,0x97,0x2a,0xa5,0x6a,
|
|
0xa9,0x4e,0x6a,0x94,0x9a,0xa4,0xb5,0xd2,0x06,0x69,0x93,0xb4,0x45,0xda,0x26,0xed,
|
|
0x90,0x76,0x49,0xbb,0xa5,0x66,0x69,0xbf,0x74,0x50,0x3a,0x24,0x1d,0x96,0x8e,0x48,
|
|
0x47,0xa5,0x63,0xd2,0x71,0xe9,0xa4,0x74,0x4a,0x3a,0x2d,0xb5,0x48,0xe7,0xa5,0x0b,
|
|
0xd2,0x25,0xe9,0xb2,0x74,0x45,0xba,0x2a,0xc5,0x15,0xdb,0x16,0xe3,0x8b,0x1d,0x8a,
|
|
0x9d,0x8a,0x5d,0x8a,0xdd,0x8a,0x3d,0x8a,0xbd,0x8a,0x89,0xc5,0xbe,0xc5,0xa4,0x62,
|
|
0x4a,0x31,0xad,0x98,0x5e,0x1c,0x52,0x1c,0x56,0x1c,0x51,0xcc,0x28,0x66,0x15,0xc7,
|
|
0x17,0xb3,0x8b,0x39,0xc5,0xa9,0xc5,0xe9,0xc5,0x99,0xc5,0xbc,0x62,0x41,0xb1,0xa8,
|
|
0x58,0x52,0x2c,0x2d,0x96,0x17,0x2b,0x8b,0xd5,0xc5,0xba,0x62,0x63,0xb1,0xa9,0xb8,
|
|
0xb6,0xb8,0xa1,0xb8,0xa9,0xb8,0xa5,0xb8,0xad,0xb8,0xa3,0xb8,0xab,0xb8,0xbb,0xd8,
|
|
0x5c,0xdc,0x5f,0x3c,0x58,0x3c,0x54,0x3c,0x5c,0x3c,0x02,0x19,0x2d,0x1e,0x2b,0x1e,
|
|
0x2f,0x9e,0x2c,0x9e,0x2a,0x9e,0x2e,0xb6,0x14,0xcf,0x17,0x2f,0x14,0x2f,0x15,0x2f,
|
|
0x17,0xaf,0x14,0xaf,0x16,0xe3,0x4a,0x6c,0x4b,0xf0,0x25,0x0e,0x25,0x4e,0x25,0x2e,
|
|
0x25,0x6e,0x25,0x1e,0x25,0x5e,0x25,0xc4,0x12,0xdf,0x12,0x52,0x09,0xa5,0x84,0x56,
|
|
0x42,0x2f,0x09,0x29,0x09,0x2b,0x89,0x28,0x61,0x94,0xb0,0x4a,0xe2,0x4b,0xd8,0x25,
|
|
0x9c,0x92,0xd4,0x92,0xf4,0x92,0xcc,0x12,0x5e,0x89,0xa0,0x44,0x54,0x22,0x29,0x91,
|
|
0x96,0xc8,0x4b,0x94,0x25,0xea,0x12,0x5d,0x89,0xb1,0xc4,0x54,0x52,0x5b,0xd2,0x50,
|
|
0xd2,0x54,0xd2,0x52,0xd2,0x56,0xd2,0x51,0xd2,0x55,0xd2,0x5d,0x62,0x2e,0xe9,0x2f,
|
|
0x19,0x2c,0x19,0x2a,0x19,0x2e,0x19,0x29,0x19,0x2d,0x19,0x2b,0x19,0x2f,0x99,0x2c,
|
|
0x99,0x2a,0x99,0x2e,0xb1,0x94,0xcc,0x97,0x2c,0x94,0x2c,0x95,0x2c,0x97,0xac,0x94,
|
|
0xac,0x96,0xe0,0x64,0xb6,0x32,0xbc,0xcc,0x41,0xe6,0x24,0x73,0x91,0xb9,0xc9,0x3c,
|
|
0x64,0x5e,0x32,0xa2,0xcc,0x57,0x46,0x92,0x51,0x64,0x34,0x19,0x5d,0x16,0x22,0x0b,
|
|
0x93,0x45,0xc8,0x18,0x32,0x96,0x2c,0x5e,0xc6,0x96,0x71,0x64,0xa9,0xb2,0x74,0x59,
|
|
0xa6,0x8c,0x27,0x13,0xc8,0x44,0x32,0x89,0x4c,0x2a,0x93,0xcb,0x94,0x32,0xb5,0x4c,
|
|
0x27,0x33,0xca,0x4c,0xb2,0x5a,0x59,0x83,0xac,0x49,0xd6,0x22,0x6b,0x93,0x75,0xc8,
|
|
0xba,0x64,0xdd,0x32,0xb3,0xac,0x5f,0x36,0x28,0x1b,0x92,0x0d,0xcb,0x46,0x64,0xa3,
|
|
0xb2,0x31,0xd9,0xb8,0x6c,0x52,0x36,0x25,0x9b,0x96,0x59,0x64,0xf3,0xb2,0x05,0xd9,
|
|
0x92,0x6c,0x59,0xb6,0x22,0x5b,0x95,0xe1,0xe4,0xb6,0x72,0xbc,0xdc,0x41,0xee,0x24,
|
|
0x77,0x91,0xbb,0xc9,0x3d,0xe4,0x5e,0x72,0xa2,0xdc,0x57,0x4e,0x92,0x53,0xe4,0x34,
|
|
0x39,0x5d,0x1e,0x22,0x0f,0x93,0x47,0xc8,0x19,0x72,0x96,0x3c,0x5e,0xce,0x96,0x73,
|
|
0xe4,0xa9,0xf2,0x74,0x79,0xa6,0x9c,0x27,0x17,0xc8,0x45,0x72,0x89,0x5c,0x2a,0x97,
|
|
0xcb,0x95,0x72,0xb5,0x5c,0x27,0x37,0xca,0x4d,0xf2,0x5a,0x79,0x83,0xbc,0x49,0xde,
|
|
0x22,0x6f,0x93,0x77,0xc8,0xbb,0xe4,0xdd,0x72,0xb3,0xbc,0x5f,0x3e,0x28,0x1f,0x92,
|
|
0x0f,0xcb,0x47,0xe4,0xa3,0xf2,0x31,0xf9,0xb8,0x7c,0x52,0x3e,0x25,0x9f,0x96,0x5b,
|
|
0xe4,0xf3,0xf2,0x05,0xf9,0x92,0x7c,0x59,0xfe,0x12,0xb2,0x22,0x5f,0x95,0xe3,0x4a,
|
|
0x6d,0x4b,0xf1,0xa5,0x0e,0xa5,0x4e,0xa5,0x2e,0xa5,0x6e,0xa5,0x1e,0xa5,0x5e,0xa5,
|
|
0xc4,0x52,0xdf,0x52,0x52,0x29,0xa5,0x94,0x56,0x4a,0x2f,0x0d,0x29,0x0d,0x2b,0x8d,
|
|
0x28,0x65,0x94,0xb2,0x4a,0xe3,0x4b,0xd9,0xa5,0x9c,0xd2,0xd4,0xd2,0xf4,0xd2,0xcc,
|
|
0x52,0x5e,0xa9,0xa0,0x54,0x54,0x2a,0x29,0x95,0x96,0xca,0x4b,0x95,0xa5,0xea,0x52,
|
|
0x5d,0xa9,0xb1,0xd4,0x54,0x5a,0x5b,0xda,0x50,0xda,0x54,0xda,0x52,0xda,0x56,0xda,
|
|
0x51,0xda,0x55,0xda,0x5d,0x6a,0x2e,0xed,0x2f,0x1d,0x2c,0xbd,0xf7,0x37,0x67,0xa8,
|
|
0x74,0xb8,0x74,0xa4,0x74,0xb4,0x74,0xac,0x74,0xbc,0x74,0xb2,0x74,0xaa,0x74,0xba,
|
|
0xd4,0x52,0x3a,0x5f,0xba,0x50,0xba,0x54,0xba,0x5c,0xba,0x52,0xba,0x5a,0x8a,0x2b,
|
|
0xb3,0x2d,0xc3,0x97,0x39,0x94,0x39,0x95,0xb9,0x94,0xb9,0x95,0x79,0x94,0x79,0x95,
|
|
0x11,0xcb,0x7c,0xcb,0x48,0x65,0x94,0x32,0x5a,0x19,0xbd,0x2c,0xa4,0x2c,0xac,0x2c,
|
|
0xa2,0x8c,0x51,0xc6,0x2a,0x8b,0x2f,0x63,0x97,0x71,0xca,0x52,0xcb,0xd2,0xcb,0x32,
|
|
0xcb,0x78,0x65,0x82,0x32,0x51,0x99,0xa4,0x4c,0x5a,0x26,0x2f,0x53,0x96,0xa9,0xcb,
|
|
0x74,0x65,0xc6,0x32,0x53,0x59,0x6d,0x59,0x43,0x59,0x53,0x59,0x4b,0x59,0x5b,0x59,
|
|
0x47,0x59,0x57,0x59,0x77,0x99,0xb9,0xac,0x6f,0x9d,0x75,0xd6,0xf9,0x23,0xf4,0x43,
|
|
0x06,0xcb,0x86,0xca,0x86,0xcb,0x1e,0x94,0x8d,0x94,0x8d,0x96,0x8d,0x95,0x8d,0x97,
|
|
0x4d,0x96,0x4d,0x95,0x4d,0x97,0x59,0xca,0xe6,0xcb,0x16,0xca,0x96,0xca,0x96,0xcb,
|
|
0x56,0xca,0x56,0xcb,0x70,0x0a,0x5b,0x05,0x5e,0xe1,0xa0,0x70,0x52,0xb8,0x28,0xdc,
|
|
0x14,0x1e,0x0a,0x2f,0x05,0x51,0xe1,0xab,0x20,0x29,0x28,0x0a,0xaa,0x82,0xa6,0xa0,
|
|
0x2b,0x82,0x15,0x21,0x8a,0x50,0x48,0x98,0x22,0x5c,0x11,0xa1,0x60,0x28,0x58,0x8a,
|
|
0x78,0x05,0x5b,0xc1,0x51,0xa4,0x2a,0xd2,0x15,0x99,0x0a,0x9e,0x82,0xaf,0x10,0x28,
|
|
0x44,0x0a,0x89,0x42,0xaa,0x90,0x29,0xe4,0x0a,0x85,0x42,0xa9,0x50,0xbd,0x81,0x5a,
|
|
0xa1,0xc5,0xd0,0x29,0x0c,0x0a,0xa3,0xa2,0x5a,0x61,0x52,0xd4,0x28,0x6a,0x15,0x0d,
|
|
0x8a,0x26,0x45,0xb3,0xa2,0x45,0xd1,0xa6,0x68,0x57,0x74,0x28,0x3a,0x21,0x5d,0x8a,
|
|
0x1b,0x8a,0x6e,0x45,0xaf,0xc2,0xac,0xe8,0x53,0xf4,0x2b,0x06,0x14,0x83,0x8a,0x7b,
|
|
0x8a,0x21,0xc5,0xb0,0xe2,0x81,0x62,0x44,0xf1,0x10,0x32,0xaa,0x18,0x53,0x8c,0x2b,
|
|
0x26,0x15,0x4f,0x14,0x53,0x8a,0x69,0x85,0x45,0x31,0xaf,0x58,0x50,0x2c,0x29,0x96,
|
|
0x15,0x2f,0x15,0x2b,0x8a,0x55,0x05,0x4e,0x69,0xab,0xb4,0x53,0xe2,0x95,0x0e,0x4a,
|
|
0x27,0xa5,0x8b,0xd2,0x55,0xe9,0xa6,0x74,0x57,0x7a,0x28,0xbd,0x94,0x44,0xa5,0xaf,
|
|
0x92,0xa4,0xa4,0x28,0x69,0x4a,0xba,0x32,0x44,0x19,0xa6,0x0c,0x57,0x46,0x28,0x19,
|
|
0x4a,0x96,0x32,0x5e,0xc9,0x56,0x72,0x94,0xa9,0xca,0x74,0x65,0xa6,0x92,0xa7,0x14,
|
|
0x28,0x45,0x4a,0x89,0x52,0xaa,0x94,0x2b,0x95,0x4a,0xb5,0x52,0xfb,0x0b,0x3a,0xa5,
|
|
0x51,0x69,0x52,0xd6,0x28,0x6b,0x95,0x0d,0xca,0x26,0x65,0x8b,0xb2,0x4d,0xd9,0xae,
|
|
0xec,0x50,0x76,0x29,0xbb,0x95,0x66,0x65,0xbf,0x72,0x50,0x39,0xa4,0x1c,0x56,0x8e,
|
|
0x28,0x47,0x95,0x63,0xca,0x71,0xe5,0xa4,0x72,0x4a,0x39,0xad,0xb4,0x28,0xe7,0x95,
|
|
0xcf,0xd7,0x59,0xe7,0x1f,0x82,0x05,0xc8,0xb2,0x72,0x55,0x69,0x5b,0xee,0x50,0xee,
|
|
0x52,0xee,0x51,0x4e,0x2c,0x27,0x95,0xd3,0xca,0x43,0xca,0xc3,0x7f,0x21,0xa2,0x3c,
|
|
0xbe,0x3c,0xb5,0x9c,0x57,0x2e,0x29,0x57,0x96,0x1b,0xcb,0x1b,0xca,0xdb,0xca,0xbb,
|
|
0xcb,0x07,0xcb,0x47,0xca,0xc7,0xcb,0xa7,0xcb,0x17,0xca,0x57,0xca,0x6d,0x2b,0x9c,
|
|
0x2a,0x3c,0x2a,0x7c,0x2b,0x68,0x15,0x61,0x15,0xac,0x0a,0x4e,0x45,0x66,0x85,0xa8,
|
|
0x42,0x5e,0xa1,0xab,0x30,0x56,0x98,0x2a,0x1a,0x2a,0x9a,0x2b,0x5a,0x2a,0xda,0x2a,
|
|
0x3a,0x2a,0xba,0x2a,0xba,0x2b,0xcc,0x15,0xfd,0x15,0x83,0x15,0x43,0x15,0xc3,0x15,
|
|
0x23,0x15,0xa3,0x15,0x63,0x15,0xe3,0x15,0x93,0x15,0x53,0x15,0xd3,0x15,0x96,0x8a,
|
|
0xf9,0x8a,0x85,0x8a,0xa5,0x8a,0xe5,0x8a,0x95,0x8a,0xd5,0x0a,0x9c,0xca,0x56,0x85,
|
|
0x57,0x39,0xa9,0xdc,0x54,0x5e,0x2a,0x5f,0x15,0x4d,0x15,0xfc,0x17,0x10,0xa2,0x8a,
|
|
0x50,0xb1,0x54,0x49,0xbf,0x0a,0x6c,0x55,0xca,0xbf,0x34,0xa9,0x90,0x4c,0x95,0x40,
|
|
0x25,0xfc,0x83,0x88,0x54,0x12,0x95,0x54,0x25,0x57,0xa9,0x55,0x3a,0x95,0x51,0x65,
|
|
0x52,0xd5,0xaa,0x1a,0x54,0x4d,0xaa,0x16,0x55,0x9b,0xaa,0x43,0xd5,0xa5,0xea,0x56,
|
|
0x99,0x55,0xfd,0xaa,0x41,0xd5,0x90,0x6a,0x58,0x35,0xa2,0x1a,0x55,0x8d,0xa9,0xc6,
|
|
0x55,0x93,0xaa,0x29,0xd5,0xb4,0xca,0xa2,0x9a,0x57,0x2d,0xa8,0x96,0x54,0xcb,0xaa,
|
|
0x15,0xd5,0xaa,0x0a,0xa7,0xb6,0x55,0xe3,0xd5,0x0e,0x6a,0x27,0xb5,0x8b,0xda,0x4d,
|
|
0xed,0xa1,0xf6,0x52,0x7b,0x63,0x10,0xd5,0x14,0x75,0x88,0x9a,0xa1,0x66,0xab,0xd3,
|
|
0xd5,0x02,0xb5,0x54,0xad,0x56,0x57,0xff,0x16,0x26,0x75,0xad,0xba,0x7e,0x9d,0x75,
|
|
0xd6,0xf9,0x0b,0x69,0x50,0x37,0xa9,0x5b,0xd4,0x6d,0xea,0x0e,0x75,0x97,0xba,0x5b,
|
|
0x6d,0x56,0xf7,0xab,0x07,0xd5,0xf7,0x7e,0x87,0xfb,0xea,0x07,0xea,0x87,0xea,0x47,
|
|
0xea,0xc7,0xea,0x09,0xf5,0x13,0xf5,0x53,0xf5,0x8c,0x7a,0x4e,0xfd,0x5c,0xbd,0xa8,
|
|
0x7e,0xa1,0x7e,0xa9,0x7e,0xa5,0x06,0x1a,0x1b,0x8d,0x9d,0xc6,0x5e,0x43,0xd0,0x38,
|
|
0x6b,0x5c,0x35,0xee,0x1a,0x4f,0x8d,0xb7,0xc6,0x47,0xe3,0xa7,0x21,0x6b,0xa8,0x9a,
|
|
0x40,0x4d,0xb0,0x26,0x54,0x13,0xae,0x89,0xd4,0x30,0x35,0x71,0x9a,0x24,0x4d,0xb2,
|
|
0x26,0x45,0x93,0xa6,0xc9,0xd0,0x70,0x35,0x7c,0x8d,0x50,0x23,0xd6,0x14,0x69,0x64,
|
|
0x1a,0x85,0x46,0xa5,0xd1,0x6a,0x0c,0x9a,0x6a,0x4d,0x8d,0xa6,0x5e,0xd3,0xa8,0x69,
|
|
0xd6,0xb4,0x6a,0xda,0x35,0x9d,0x9a,0x1b,0x9a,0x5e,0x4d,0x9f,0x66,0x40,0x73,0x4f,
|
|
0x73,0x5f,0xf3,0x40,0xf3,0x50,0xf3,0x48,0xf3,0x58,0x33,0xa1,0x79,0xa2,0x79,0xaa,
|
|
0x99,0xd1,0xcc,0x69,0x9e,0x6b,0x16,0x35,0x2f,0x34,0x2f,0x35,0xaf,0x34,0xa0,0xd2,
|
|
0xa6,0xd2,0xae,0xd2,0xbe,0x92,0x50,0xe9,0x5c,0xe9,0x5a,0xe9,0x5e,0xe9,0x59,0xe9,
|
|
0x5d,0xe9,0x53,0xe9,0x57,0x49,0xae,0xa4,0x56,0x06,0x56,0x06,0x57,0x86,0x56,0x86,
|
|
0x57,0x46,0x56,0x32,0x2b,0xe3,0x2a,0x93,0x2a,0x93,0x2b,0x53,0x2a,0xd3,0x2a,0x33,
|
|
0x2a,0xb9,0x95,0xfc,0x4a,0x61,0xa5,0xb8,0xb2,0xa8,0x52,0x56,0xa9,0xa8,0x54,0x55,
|
|
0x6a,0x2b,0x0d,0x95,0xd5,0x95,0x35,0x95,0xf5,0x95,0x8d,0x95,0xcd,0x95,0xad,0x95,
|
|
0xed,0x95,0x9d,0x95,0x37,0x2a,0x7b,0x2b,0xfb,0x2a,0x07,0x2a,0xef,0x55,0xde,0xaf,
|
|
0x7c,0x50,0xf9,0xb0,0xf2,0x51,0xe5,0xe3,0xca,0x89,0xca,0x27,0x95,0x4f,0x2b,0x67,
|
|
0x2a,0xe7,0x2a,0x9f,0x57,0x2e,0x56,0xbe,0xa8,0x7c,0x59,0xf9,0xaa,0x12,0x68,0x6d,
|
|
0xb4,0x76,0x5a,0x7b,0x2d,0x41,0xeb,0xac,0x75,0xd5,0xba,0x6b,0x3d,0xb5,0xde,0x5a,
|
|
0x1f,0xad,0x9f,0x96,0xac,0xa5,0x6a,0x03,0xb5,0xc1,0xda,0x50,0x6d,0xb8,0x36,0x52,
|
|
0xcb,0xd4,0xc6,0x69,0x93,0xb4,0xc9,0xda,0x14,0x6d,0x9a,0x36,0x43,0xcb,0xd5,0xf2,
|
|
0xb5,0x42,0xad,0x58,0x5b,0xa4,0x95,0xc1,0xd7,0x5b,0x95,0x56,0xab,0x35,0x68,0xab,
|
|
0xb5,0x35,0xda,0x7a,0x6d,0xa3,0xb6,0x59,0xdb,0xaa,0x6d,0xd7,0x76,0x6a,0x6f,0x68,
|
|
0x7b,0xb5,0x7d,0xda,0x01,0xed,0x3d,0xed,0x7d,0xed,0x03,0xed,0x43,0xed,0x23,0xed,
|
|
0x63,0xed,0x84,0xf6,0x89,0xf6,0xa9,0x76,0x46,0x3b,0xa7,0x7d,0xae,0x5d,0xd4,0xbe,
|
|
0xd0,0xbe,0xd4,0xbe,0xd2,0x02,0x9d,0x8d,0xce,0x4e,0x67,0xaf,0x23,0xe8,0x9c,0x75,
|
|
0xae,0x3a,0x77,0x9d,0xa7,0xce,0x5b,0xe7,0xa3,0xf3,0xd3,0x91,0x75,0x54,0x5d,0xa0,
|
|
0x2e,0x58,0x17,0xaa,0x0b,0xd7,0x45,0xea,0x98,0xba,0x38,0x5d,0x92,0x2e,0x59,0x97,
|
|
0xa2,0x4b,0xd3,0x65,0xe8,0xb8,0x3a,0xbe,0x4e,0xa8,0x13,0xeb,0x8a,0x74,0x32,0x9d,
|
|
0x42,0xa7,0xd2,0x69,0x75,0x06,0x5d,0xb5,0xae,0x46,0x57,0xaf,0x6b,0xd4,0x35,0xeb,
|
|
0x5a,0x75,0xed,0xba,0x4e,0xdd,0x0d,0x5d,0xaf,0xae,0x4f,0x37,0xa0,0xbb,0x07,0xb9,
|
|
0xaf,0x7b,0xa0,0x7b,0xa8,0x7b,0xa4,0x7b,0xac,0x9b,0xd0,0x3d,0xd1,0x3d,0xd5,0xcd,
|
|
0xe8,0xe6,0x74,0xcf,0x75,0x8b,0xba,0x17,0xba,0x97,0xba,0x57,0x3a,0xa0,0xb7,0xd1,
|
|
0xdb,0xe9,0xed,0xf5,0x04,0xbd,0xb3,0xde,0x55,0xef,0xae,0xf7,0xd4,0x7b,0xeb,0x7d,
|
|
0xf4,0x7e,0x7a,0xb2,0x9e,0xaa,0x0f,0xd4,0x07,0xeb,0x43,0xf5,0xe1,0xfa,0x48,0x3d,
|
|
0x53,0x1f,0xa7,0x4f,0xd2,0x27,0xeb,0x53,0xf4,0x69,0xfa,0x0c,0x3d,0x57,0xcf,0xd7,
|
|
0x0b,0xf5,0x62,0x7d,0x91,0x5e,0xa6,0x57,0xe8,0x55,0x7a,0xad,0xde,0xa0,0xaf,0xd6,
|
|
0xd7,0xe8,0xeb,0xf5,0x8d,0xfa,0x66,0x7d,0xab,0xbe,0x5d,0xdf,0xa9,0xbf,0xa1,0xef,
|
|
0xd5,0xf7,0xe9,0x07,0xf4,0xf7,0xf4,0xf7,0xf5,0x0f,0xf4,0x0f,0xf5,0x8f,0xf4,0x8f,
|
|
0xf5,0x13,0xfa,0x27,0xfa,0xa7,0xfa,0x19,0xfd,0x9c,0xfe,0xb9,0x7e,0x51,0xff,0x42,
|
|
0xff,0x52,0xff,0x4a,0x0f,0xaa,0x6c,0xaa,0xec,0xaa,0xec,0xab,0x08,0x55,0xce,0x55,
|
|
0xae,0x55,0xee,0x55,0x9e,0x55,0xde,0x55,0x3e,0x55,0x7e,0x55,0xe4,0x2a,0x6a,0x55,
|
|
0x60,0x55,0x70,0x55,0x68,0x55,0x78,0x55,0x64,0x15,0xb3,0x2a,0xae,0x2a,0xa9,0x2a,
|
|
0xb9,0x2a,0xa5,0x2a,0xad,0x2a,0xa3,0x8a,0x5b,0xc5,0xaf,0x12,0x56,0x89,0xab,0x8a,
|
|
0xaa,0x64,0x55,0x8a,0x2a,0x55,0x95,0xb6,0xca,0x50,0x55,0x5d,0x55,0x53,0x55,0x5f,
|
|
0xd5,0x58,0xd5,0x5c,0xd5,0x5a,0xd5,0x5e,0xd5,0x59,0x75,0xa3,0xaa,0xb7,0xaa,0xaf,
|
|
0x6a,0xa0,0xea,0x5e,0xd5,0xfd,0xaa,0x07,0x55,0x0f,0xab,0x1e,0x55,0x3d,0xae,0x9a,
|
|
0xa8,0x7a,0x52,0xf5,0xb4,0x6a,0xa6,0x6a,0xae,0xea,0x79,0xd5,0x62,0xd5,0x8b,0xaa,
|
|
0x97,0x55,0xaf,0xaa,0x80,0xc1,0xc6,0x60,0x67,0xb0,0x37,0x10,0x0c,0xce,0x06,0x57,
|
|
0x83,0xbb,0xc1,0xd3,0xe0,0x6d,0xf0,0x31,0xf8,0x19,0xc8,0x06,0xaa,0x21,0xd0,0x10,
|
|
0x6c,0x08,0x35,0x84,0x1b,0x22,0x0d,0x4c,0x43,0x9c,0x21,0xc9,0x90,0x6c,0x48,0x31,
|
|
0xa4,0x19,0x32,0x0c,0x5c,0x03,0xdf,0x20,0x34,0x88,0x0d,0x45,0x06,0x99,0x41,0x61,
|
|
0x50,0x19,0xb4,0x06,0x83,0xa1,0xda,0x50,0x63,0xa8,0x37,0x34,0x1a,0x9a,0x0d,0xad,
|
|
0x86,0x76,0x43,0xa7,0xe1,0x86,0xa1,0xd7,0xd0,0x67,0x18,0x30,0xdc,0x33,0xdc,0x37,
|
|
0x3c,0x30,0x3c,0x34,0x3c,0x32,0x3c,0x36,0x4c,0x18,0x9e,0x18,0x9e,0x1a,0x66,0x0c,
|
|
0x73,0x86,0xe7,0x86,0x45,0xc3,0x0b,0xc3,0x4b,0xc3,0x2b,0x03,0x30,0xda,0x18,0xed,
|
|
0x8c,0xf6,0x46,0x82,0xd1,0xd9,0xe8,0x6a,0x74,0x37,0x7a,0x1a,0xbd,0x8d,0x3e,0x46,
|
|
0x3f,0x23,0xd9,0x48,0x35,0x06,0x1a,0x83,0x8d,0xa1,0xc6,0x70,0x63,0xa4,0x91,0x69,
|
|
0x8c,0x33,0x26,0x19,0x93,0x8d,0x29,0xc6,0x34,0x63,0x86,0x91,0x6b,0xe4,0x1b,0x85,
|
|
0x46,0xb1,0xb1,0xc8,0x28,0x33,0x2a,0x8c,0x2a,0xa3,0xd6,0x68,0x30,0x56,0x1b,0x6b,
|
|
0x8c,0xf5,0xc6,0x46,0x63,0xb3,0xb1,0xd5,0xd8,0x6e,0xec,0x34,0xde,0x30,0xf6,0x1a,
|
|
0xfb,0x8c,0x03,0xc6,0x7b,0x90,0xfb,0xc6,0x07,0xc6,0x87,0xc6,0x47,0xc6,0xc7,0xc6,
|
|
0x09,0xe3,0x13,0xe3,0x53,0xe3,0x8c,0x71,0xce,0xf8,0xdc,0xb8,0x68,0x7c,0x61,0x7c,
|
|
0x69,0x7c,0x65,0x04,0x17,0x6c,0x2e,0xd8,0x5d,0xb0,0xbf,0x40,0xb8,0xe0,0x7c,0xc1,
|
|
0xf5,0x82,0xfb,0x05,0xcf,0x0b,0xde,0x17,0x7c,0x2e,0xf8,0x5d,0x20,0x5f,0xa0,0x5e,
|
|
0x08,0x5c,0xe7,0x5f,0x80,0xb5,0xff,0xf7,0xac,0x27,0x96,0xec,0x36,0x02,0x90,0x8e,
|
|
0x1d,0xdb,0xc0,0xe3,0x77,0x61,0x7e,0x08,0x2b,0xe3,0x60,0x79,0x60,0xe3,0xda,0xf1,
|
|
0x01,0x98,0x53,0x60,0x9e,0x0b,0xd6,0xf2,0x70,0x58,0x49,0x7d,0xe3,0xf8,0xf5,0x79,
|
|
0xaf,0xeb,0xc3,0xd0,0x4d,0x36,0xae,0xe5,0x38,0x2c,0xdf,0x80,0xe5,0x1b,0xb1,0xdc,
|
|
0x0e,0xcb,0xb7,0xc0,0xfc,0x28,0x76,0x8f,0x08,0xec,0xbc,0x08,0xec,0xbc,0x08,0xec,
|
|
0xbc,0x08,0xac,0x3f,0x03,0x6b,0x67,0x60,0xed,0x0c,0xac,0x9d,0x81,0xb5,0xc7,0x60,
|
|
0xd7,0x8f,0xc5,0xfa,0xc5,0x62,0xfd,0x62,0xb1,0x7e,0xb1,0x6f,0xb4,0xa3,0xfe,0x6c,
|
|
0xac,0x1f,0x1b,0xeb,0xc7,0xc6,0xfa,0xb1,0xb1,0x76,0x0e,0x56,0x9f,0x8e,0xf5,0x4b,
|
|
0x7f,0xa3,0xbc,0x01,0xcb,0x37,0x62,0xf9,0x6b,0x5b,0xa2,0xf9,0x7c,0x8c,0xcd,0x27,
|
|
0x13,0x3b,0x2f,0x13,0x3b,0x2f,0x13,0x3b,0x2f,0x13,0xeb,0xcf,0xc3,0xda,0x79,0x58,
|
|
0x3b,0x0f,0x6b,0xe7,0x61,0xed,0xe7,0xb1,0xeb,0xe7,0x62,0xfd,0x72,0xb1,0x7e,0xb9,
|
|
0x58,0xbf,0xdc,0x37,0xda,0x51,0x7f,0x09,0xd6,0x4f,0x82,0xf5,0x93,0x60,0xfd,0x24,
|
|
0x58,0xbb,0x14,0xab,0x97,0xbe,0x61,0x7f,0x1b,0x6c,0xdc,0x36,0x58,0x79,0x13,0x56,
|
|
0xde,0x84,0x95,0x7d,0xb0,0xb2,0x0f,0xe6,0x27,0x1c,0x36,0x3f,0x1c,0x56,0xde,0x80,
|
|
0x95,0x37,0x60,0xe5,0xcd,0x58,0x79,0x33,0x56,0xb6,0xc7,0xca,0x28,0x0f,0xc7,0xf2,
|
|
0x0c,0x2c,0x8f,0xc0,0xee,0x9b,0x89,0xe5,0x11,0xd8,0x7d,0x33,0xb1,0x3c,0x02,0xbb,
|
|
0x4e,0x26,0x96,0x47,0x60,0xe3,0xc8,0xc4,0xf2,0x08,0xec,0x3a,0x99,0x58,0x7e,0x1c,
|
|
0x1b,0xc7,0x39,0x2c,0x3f,0x8e,0x5d,0xe7,0x1c,0x96,0x1f,0xc7,0xae,0x73,0x0e,0xcb,
|
|
0x8f,0x63,0x7e,0x3a,0x87,0xe5,0x91,0xd8,0x79,0xdc,0x37,0xe2,0x6a,0x23,0xe6,0x8f,
|
|
0x8d,0x58,0xd9,0x06,0x2b,0xdb,0x60,0xe5,0x4d,0x58,0x79,0x13,0x56,0xf6,0xc1,0xca,
|
|
0x3e,0x58,0x79,0x33,0x96,0x47,0x81,0xb5,0xfa,0x6c,0xec,0x18,0x5d,0x3f,0x1b,0xcb,
|
|
0xa3,0xb1,0xfb,0xe7,0x60,0x39,0x13,0xb3,0x2f,0x1f,0xcb,0x99,0x58,0x3d,0xff,0x8d,
|
|
0x76,0x7b,0xac,0x6c,0x8f,0x95,0x6f,0x83,0xb5,0x32,0xca,0x63,0xb0,0xf3,0xce,0x63,
|
|
0x79,0x0c,0x76,0xde,0x79,0x2c,0x8f,0xc1,0xce,0x3b,0x8f,0xe5,0x03,0x1b,0xd6,0x8e,
|
|
0x63,0xb1,0x79,0xe5,0x62,0x79,0x2c,0x36,0xaf,0x5c,0x2c,0x47,0xe5,0xad,0x58,0x19,
|
|
0xe5,0x09,0xd8,0xf5,0xf3,0xb0,0x3c,0x01,0xbb,0x7e,0x1e,0x96,0x27,0x60,0xd7,0xcf,
|
|
0xc3,0xf2,0x44,0xac,0x5f,0x3e,0x96,0x27,0x62,0xf3,0xcf,0xc7,0xf2,0x44,0xec,0xbc,
|
|
0x7c,0x2c,0x4f,0xc4,0xce,0xcb,0xc7,0xf2,0x24,0xac,0x5e,0x8c,0xe5,0x49,0x58,0xbd,
|
|
0x18,0xcb,0xd9,0x98,0x9f,0x24,0x58,0xce,0xc6,0xe6,0x21,0xc1,0x72,0x36,0x36,0x0f,
|
|
0x09,0x96,0xb3,0xb1,0xf5,0x2a,0xc1,0x72,0x36,0x36,0x2f,0x09,0x96,0xb3,0x31,0x3f,
|
|
0x4a,0xb0,0xfc,0x24,0x36,0xce,0x42,0x2c,0xe7,0x60,0xb9,0xf4,0x8d,0x32,0x5a,0x57,
|
|
0xa7,0xb0,0xf9,0x15,0x63,0xf9,0x29,0x2c,0x0e,0x8a,0xb1,0xfc,0x14,0x36,0xde,0xe2,
|
|
0x37,0xe6,0x87,0x6c,0xbb,0x1b,0xb3,0xed,0x6e,0xec,0xde,0xbb,0xb1,0x7b,0xef,0xc6,
|
|
0xd6,0xce,0xa9,0x37,0xd6,0x51,0xf1,0x1b,0x6b,0xa9,0xf8,0x8d,0x38,0x40,0xb1,0xc5,
|
|
0xc4,0xe2,0x8c,0x8f,0xe5,0x31,0x58,0x7d,0x0c,0x56,0x3e,0x8f,0xe5,0x61,0xd8,0x79,
|
|
0xe9,0x58,0xce,0xc0,0x72,0x1e,0x96,0xc7,0x62,0x79,0xee,0x1b,0xf6,0xb5,0xc7,0xc6,
|
|
0x64,0xff,0xc6,0x3e,0x69,0xf3,0xc6,0x1e,0x63,0xf3,0x46,0x3d,0xee,0x8d,0x7a,0xdc,
|
|
0x1b,0xf5,0xf6,0x6f,0xd4,0xbf,0x79,0x1d,0xf0,0x46,0x3d,0x78,0xe3,0x39,0x61,0xf3,
|
|
0xc6,0x1e,0xfb,0x7a,0x9f,0xda,0xfc,0x46,0xfd,0xeb,0xe3,0xff,0x85,0xf9,0x79,0x16,
|
|
0xcb,0x8f,0x63,0xe3,0x3c,0x87,0xe5,0xd1,0x58,0x9e,0xf3,0xc6,0xfc,0x7c,0xb0,0xf9,
|
|
0xf9,0xbc,0x51,0xb6,0x79,0xa3,0x0e,0x1d,0xdf,0xc6,0xad,0xf5,0xff,0x74,0xc3,0x5a,
|
|
0x9e,0xfd,0x86,0x1f,0x90,0x4f,0x5e,0xfb,0xe3,0xb5,0x2f,0x8e,0x63,0x7e,0x3f,0xf7,
|
|
0xc6,0xfa,0x03,0xd8,0x7a,0x03,0x6f,0x3c,0xf7,0x70,0x6f,0x3c,0x33,0x70,0xd8,0xf8,
|
|
0x71,0xd8,0xf8,0x51,0x3e,0x81,0xe5,0x2f,0xff,0x3f,0xf6,0xce,0x04,0x40,0xc7,0xe2,
|
|
0xf1,0xe3,0xcf,0xfb,0xee,0xbe,0xbb,0xd6,0x7d,0x76,0x29,0xd7,0x16,0xc2,0xae,0xbd,
|
|
0x59,0xe7,0x5a,0xd6,0x99,0x90,0x90,0x54,0xae,0x90,0x5c,0xeb,0x08,0x95,0xca,0x91,
|
|
0xd2,0x49,0x87,0x4a,0x27,0x9d,0xa4,0x72,0x25,0x54,0xce,0x0a,0x91,0x12,0x15,0x65,
|
|
0x8b,0x90,0x44,0x42,0xba,0x48,0xf5,0xff,0xcc,0x3e,0xdf,0x27,0xe3,0xf9,0xdb,0x1f,
|
|
0xaa,0x5f,0xbf,0x8e,0xf7,0x19,0x1f,0xdf,0x99,0x79,0xe6,0x99,0x67,0x66,0x9e,0x99,
|
|
0x79,0x9e,0xf7,0x99,0x79,0x66,0xad,0xfb,0x68,0x11,0x1d,0x53,0x44,0xee,0x62,0x72,
|
|
0x17,0x53,0x7f,0x58,0x44,0xfd,0x61,0x11,0xb9,0x8b,0xc9,0x5d,0x4c,0xd7,0xb7,0x88,
|
|
0xae,0x6f,0x11,0xb9,0x8b,0xc9,0x5d,0x4c,0xf9,0x2f,0xa2,0xbc,0x17,0x91,0xbb,0x98,
|
|
0xdc,0xc5,0xd4,0x9e,0x8b,0xa8,0x3d,0x17,0x91,0xbb,0x98,0xdc,0xc5,0x74,0x1d,0x8b,
|
|
0xe8,0x1a,0x16,0x91,0xbb,0x98,0xdc,0xc5,0xd4,0x9e,0x2b,0xaa,0xbe,0x57,0x54,0xfb,
|
|
0xad,0xa8,0xf6,0x5b,0x51,0xfd,0x6f,0x41,0xf5,0xbf,0x05,0xad,0xeb,0xdc,0xd5,0xea,
|
|
0xff,0xbd,0xfb,0x6a,0x25,0xeb,0x3e,0x1e,0x69,0xdd,0x03,0x23,0xad,0xfb,0x7c,0xa4,
|
|
0x75,0x8f,0xf4,0xfc,0xa3,0xe5,0x17,0x6d,0xb9,0x23,0x2d,0xbf,0x48,0xb5,0xe3,0x48,
|
|
0xb5,0xeb,0x48,0xa5,0xa7,0x67,0xd0,0xbd,0xee,0x26,0xaf,0x57,0x63,0xbf,0x16,0x46,
|
|
0x05,0xdd,0xbe,0xe0,0x6a,0x3d,0x33,0x45,0xe9,0x79,0x29,0x5a,0x9a,0x5f,0x5a,0x59,
|
|
0x1a,0x21,0x35,0x7d,0x4b,0xf7,0xa0,0xdb,0x3e,0x4d,0x59,0x0c,0x87,0x89,0x41,0xb7,
|
|
0x6e,0x98,0xeb,0x5c,0x22,0xe2,0x48,0x9b,0x59,0x10,0x74,0x8f,0xc9,0xc2,0x5e,0xdb,
|
|
0x7a,0x36,0x9b,0x2a,0xbd,0x4b,0xe1,0x4c,0xbf,0x3f,0x51,0xf6,0xfb,0xa5,0x93,0xa4,
|
|
0x8f,0x49,0x9f,0x92,0x4e,0xf3,0xe2,0xb6,0xce,0x33,0x49,0xf6,0xa7,0xa4,0xb3,0xe4,
|
|
0x3f,0xd7,0x8b,0xdf,0x3a,0xc6,0xe8,0x1b,0x76,0x1a,0x65,0xf7,0xfc,0x16,0x5b,0x61,
|
|
0x8c,0xbe,0x29,0x9d,0x0d,0xf3,0x75,0x8e,0x75,0xf2,0x5b,0xa7,0x63,0x96,0xc3,0x12,
|
|
0x78,0x19,0x96,0xc2,0x32,0x78,0x40,0xe7,0x7f,0x02,0x4a,0x45,0xba,0xe5,0x63,0xd4,
|
|
0x84,0x2f,0x11,0xe9,0x1e,0x1f,0x25,0xf7,0x19,0x72,0x9f,0xa6,0x70,0xb1,0x91,0xee,
|
|
0xf5,0x38,0x4d,0x5a,0x53,0x9a,0xaa,0xfd,0xa9,0x3a,0x2e,0x59,0xc7,0xb5,0x97,0xbb,
|
|
0x96,0xdc,0x35,0x15,0xae,0xa1,0x8e,0x1b,0x12,0xa9,0xba,0x2d,0x3d,0x45,0xfe,0x69,
|
|
0xd2,0xa2,0xd2,0x04,0xcb,0x9d,0x4f,0xee,0x7c,0x4a,0xb7,0x77,0x7e,0xa3,0x1b,0xe5,
|
|
0xff,0xa1,0xf4,0x14,0x69,0x9a,0xf4,0x54,0x69,0x0d,0xa9,0xc9,0x47,0xa4,0xd2,0x15,
|
|
0x29,0x77,0x3e,0xb9,0x8d,0x96,0x91,0xd6,0x93,0xee,0x94,0x7e,0x21,0x8d,0x93,0xb6,
|
|
0x94,0xc6,0x2a,0x9e,0x86,0xd2,0x58,0xf9,0x37,0xb4,0xf6,0x17,0x90,0xdb,0x68,0x25,
|
|
0xf9,0x37,0x91,0x56,0x95,0xb6,0x90,0xf6,0x08,0x39,0xce,0x68,0xa8,0x14,0x45,0x3b,
|
|
0x8f,0x72,0xf5,0x42,0x68,0x2a,0x35,0xee,0x76,0xd0,0xdc,0x72,0x0f,0xd1,0x7e,0xa3,
|
|
0x2b,0xa4,0xcd,0xa5,0xef,0x2b,0xdc,0x52,0xe9,0x3a,0x69,0xe5,0x18,0xc7,0xa9,0x03,
|
|
0x09,0xd2,0x64,0x69,0x29,0xe9,0x29,0xd2,0x53,0xa5,0x67,0x4a,0xcb,0x4b,0x2b,0x48,
|
|
0xab,0x4a,0xab,0x4b,0x57,0xc0,0x22,0xe9,0x06,0x98,0x02,0xaf,0xc2,0xe3,0xd2,0x19,
|
|
0xd2,0xa4,0xfc,0x84,0x87,0x9a,0xd2,0x53,0xa4,0xa7,0x4a,0xcf,0x94,0x56,0x95,0x36,
|
|
0x29,0x40,0xdd,0x2a,0xe0,0x6a,0x3d,0x69,0x07,0x28,0x0f,0x75,0xa0,0x82,0xf4,0x6e,
|
|
0xd8,0x00,0xcb,0x61,0x11,0xac,0x90,0x2e,0x97,0x7f,0xe3,0x82,0xc4,0x03,0x8b,0xe1,
|
|
0x7d,0x58,0x6e,0xe9,0x07,0xd2,0x65,0x96,0x9a,0x7d,0x8d,0x0b,0x71,0x4e,0x68,0x22,
|
|
0x35,0xee,0x0e,0xf0,0x21,0xac,0x92,0xbe,0x63,0xa9,0xe7,0xb7,0x19,0x5a,0x16,0x26,
|
|
0xaf,0xb0,0x06,0x66,0xc3,0x74,0x98,0x24,0x9d,0x02,0x05,0x8a,0x38,0x4e,0x26,0xcc,
|
|
0x83,0xf3,0xa4,0x6d,0xa4,0xed,0xa5,0x9d,0xa4,0x19,0x30,0x17,0x06,0xc2,0x20,0xe9,
|
|
0x10,0x98,0x0d,0x23,0xa5,0x03,0x65,0x9f,0x63,0xa9,0xe7,0xe7,0xe9,0xdd,0x8a,0xef,
|
|
0x61,0xe9,0x14,0xe9,0xd3,0xd2,0xe9,0xd2,0x09,0x3a,0xdf,0x39,0x45,0x1d,0x27,0x1e,
|
|
0x72,0x20,0x54,0x9a,0xb6,0x07,0xd1,0xd2,0x18,0x69,0x01,0x69,0x21,0x69,0x31,0x69,
|
|
0x2d,0x69,0x1d,0x69,0x3d,0x69,0x7d,0x69,0xa6,0xd4,0xdc,0xa3,0xcc,0x7d,0x3b,0x53,
|
|
0xcf,0x01,0xe6,0x1e,0x75,0x67,0xc0,0x7d,0x06,0x30,0xf7,0x33,0xef,0xd9,0xbf,0x85,
|
|
0x9e,0xcb,0x5a,0xea,0x39,0xcc,0xdc,0x7b,0x2a,0xd0,0xb7,0xb7,0x76,0xdc,0xfb,0xa8,
|
|
0xb9,0x17,0x9a,0xfb,0xa5,0x79,0xc6,0x34,0xf7,0xbb,0xd6,0xec,0x6b,0x03,0xc1,0xb3,
|
|
0x1c,0xa7,0x9b,0x9e,0x2d,0xcc,0x7d,0xaf,0x23,0x7e,0x9d,0xe0,0x92,0xa0,0xfb,0x7c,
|
|
0x61,0x9e,0x65,0xfa,0x99,0xf8,0x03,0xee,0x3d,0xec,0x42,0xfc,0x4f,0xe1,0x98,0x53,
|
|
0x21,0xdb,0x71,0xef,0xad,0xe6,0xfe,0x7b,0x16,0xee,0x01,0xec,0x1b,0x8a,0xfd,0x9c,
|
|
0xb3,0xdc,0xbe,0x78,0x0e,0xbc,0xa8,0xbe,0x77,0x85,0x9e,0x03,0x06,0x29,0xbc,0x09,
|
|
0xe7,0x85,0x59,0x6a,0x85,0xa9,0x4b,0x7b,0xbf,0x20,0xe8,0xfe,0xa6,0x6b,0x87,0xee,
|
|
0x73,0xdc,0xb4,0xf4,0x44,0x3b,0xa3,0x5d,0xa1,0x07,0x5c,0x01,0xbd,0xcd,0x3d,0xd3,
|
|
0xdc,0x2b,0x39,0xdf,0x23,0x68,0x3f,0x18,0x8b,0xfd,0x31,0x74,0x20,0x64,0xc3,0x20,
|
|
0x18,0x0c,0x43,0xe0,0x2a,0x18,0x0e,0xa3,0x61,0x0c,0x4c,0x27,0x4f,0xb7,0xa0,0xb7,
|
|
0xc2,0x99,0x1c,0x77,0x1b,0x7a,0x7b,0xd0,0x7d,0xc6,0x9a,0x80,0xde,0x15,0x74,0x9f,
|
|
0xc9,0xe6,0xeb,0x59,0xe1,0x1c,0x3d,0x2b,0x18,0xcd,0xd4,0x7d,0xb8,0x9b,0xd4,0xb8,
|
|
0x63,0xe5,0x8e,0x95,0x3b,0x51,0xee,0x44,0xeb,0x1d,0x44,0xc0,0xfa,0xfd,0x1e,0xd0,
|
|
0x33,0x5e,0xb4,0x9e,0xb3,0xa3,0xe5,0x8e,0x95,0x3b,0x56,0xee,0x44,0xb9,0x13,0xe5,
|
|
0xae,0x24,0x77,0x25,0xb9,0xe3,0xe4,0x8e,0xb3,0x7e,0xf3,0x3a,0xd6,0xef,0x5e,0xc7,
|
|
0xf2,0x0f,0x58,0xfe,0xde,0x3b,0x90,0x38,0xf9,0x79,0xc7,0x27,0xc8,0x9d,0x60,0x3d,
|
|
0x13,0x45,0x59,0xcf,0x45,0xc6,0xde,0x58,0xe9,0xed,0x69,0xfd,0xd6,0x8d,0xd4,0x33,
|
|
0x69,0xa4,0x9e,0xb5,0xa2,0xf5,0x6c,0x13,0x2d,0x77,0xac,0xdc,0xb1,0x72,0xe7,0x93,
|
|
0x3b,0x9f,0xdc,0x95,0xe4,0xf6,0x7e,0x2b,0xc7,0xcb,0x1d,0xaf,0x67,0xc9,0x04,0xd5,
|
|
0xa1,0x04,0xeb,0x9d,0x4c,0xc0,0x7a,0x9f,0x11,0xd0,0x33,0x78,0x40,0xcf,0xe0,0x9e,
|
|
0x3b,0x56,0xee,0x58,0xb9,0x13,0xe5,0x4e,0xd4,0x6f,0x9a,0x58,0xfd,0xd6,0x8d,0xb5,
|
|
0xdc,0x91,0x96,0x5f,0xa4,0xfc,0x13,0xe5,0xe7,0x1d,0x17,0x27,0xb7,0xd1,0x96,0x3a,
|
|
0x5f,0x3f,0x69,0x4b,0xe5,0xbb,0x9f,0xb4,0xa5,0xe2,0xea,0x27,0x3d,0x5f,0xfe,0xfd,
|
|
0xa5,0xe7,0xcb,0xbf,0xbf,0xb5,0x3f,0x51,0xee,0x44,0xb9,0xe3,0xe4,0x8e,0xb3,0x9e,
|
|
0x41,0x03,0xd6,0x33,0x68,0xc0,0xf2,0xcf,0x67,0xf9,0xe7,0x8b,0x38,0xf2,0xdb,0xdb,
|
|
0xb1,0x7e,0x7f,0x3b,0x96,0x7f,0xc0,0xf2,0x37,0xf6,0xd6,0xca,0x47,0xb6,0x73,0xc4,
|
|
0x1d,0x2d,0x77,0xb4,0x9e,0xcd,0xa3,0xf5,0x6c,0xee,0xb9,0x63,0xe5,0x8e,0xb5,0xdc,
|
|
0x91,0x96,0x5f,0xa4,0xfc,0x13,0xe5,0x97,0xa8,0x67,0xf6,0x68,0x3d,0xb3,0x47,0xcb,
|
|
0x1d,0x2b,0x77,0xac,0xf5,0x9b,0x3e,0xda,0xfa,0x5d,0x1f,0x6d,0xfd,0x76,0x8f,0xb6,
|
|
0x7e,0xbf,0xdb,0xc7,0x47,0x5b,0x71,0x44,0xeb,0xb7,0x40,0xb4,0x7e,0x0b,0x78,0xee,
|
|
0x58,0xb9,0x63,0xe5,0x4e,0x94,0x3b,0x51,0xee,0x38,0xb9,0xe3,0xf4,0x5b,0xe3,0x6c,
|
|
0xfd,0xd6,0x38,0x5b,0xee,0x04,0xb9,0x13,0xe4,0x8e,0x93,0x3b,0xce,0x7a,0x57,0x10,
|
|
0xb0,0xde,0x17,0x04,0xac,0x77,0x06,0xf9,0xac,0xf7,0x06,0xc6,0xde,0x5e,0x61,0x86,
|
|
0x4a,0xdb,0x2b,0x5d,0x43,0xa5,0x1d,0xf4,0xdb,0x6e,0x98,0xb4,0x83,0xca,0x62,0x98,
|
|
0xb4,0x83,0xda,0xc0,0x30,0x69,0x07,0xe5,0x73,0x98,0xb4,0x83,0xe2,0x19,0x26,0xbd,
|
|
0x48,0xfe,0xc3,0xa5,0x17,0xe9,0xb8,0xe1,0xd6,0xbb,0xc9,0x68,0xfd,0x46,0xf1,0xde,
|
|
0x29,0x04,0xf5,0x4e,0x21,0x28,0x77,0xac,0xdc,0xb1,0x72,0x27,0xca,0x9d,0xa8,0x76,
|
|
0xeb,0x95,0xa7,0x97,0xae,0xfc,0x8a,0x2f,0xbf,0xfa,0xd1,0x45,0xf4,0xad,0x37,0x04,
|
|
0xdc,0xf8,0x1b,0x28,0x9e,0xae,0x52,0xe3,0x8e,0x91,0x3b,0xc6,0x7a,0xc7,0x6b,0xbf,
|
|
0x1f,0xb5,0xdf,0xfd,0x3a,0x96,0xbf,0x63,0xf9,0xc7,0x58,0xfe,0x76,0x3c,0x11,0x96,
|
|
0x7f,0x84,0x75,0xfe,0xa0,0x95,0x86,0xa0,0xf5,0xce,0x32,0x60,0xbd,0xb7,0x0c,0x58,
|
|
0xfe,0x8e,0xe5,0xef,0x58,0xfe,0x31,0x96,0x7f,0x8c,0xe5,0x1f,0x61,0xf9,0xdb,0xe7,
|
|
0x8d,0xb2,0xce,0xeb,0xbd,0x9b,0x8c,0x55,0x9f,0x1b,0x2b,0x77,0x8c,0xdc,0x31,0x72,
|
|
0x47,0xc8,0x1d,0x61,0xbd,0xcb,0xb6,0xdf,0x03,0xdb,0xef,0xb8,0x1d,0xcb,0xdf,0xb1,
|
|
0xfc,0x63,0x2c,0xff,0x18,0xcb,0x3f,0xc2,0xf2,0x8f,0xb0,0xd2,0x13,0xb4,0xd2,0xe4,
|
|
0xbd,0xc3,0x8c,0x51,0x1f,0x1c,0x23,0x77,0xac,0xdc,0xb1,0xea,0x5f,0x62,0xd5,0xb7,
|
|
0x78,0xee,0x18,0xb9,0x63,0xac,0x77,0xe7,0xf6,0x7b,0x67,0xfb,0x9d,0xba,0x63,0xf9,
|
|
0x3b,0x96,0x7f,0x8c,0xe5,0x6f,0xc7,0x13,0x61,0xf9,0x47,0x58,0xe7,0x0f,0x5a,0x69,
|
|
0xf0,0xde,0xd5,0x97,0xb6,0xce,0x5b,0xda,0x3a,0x6f,0x69,0xeb,0xbc,0xa5,0xad,0xf3,
|
|
0x96,0xb6,0xce,0x5b,0xda,0x3a,0x6f,0x69,0xeb,0xbc,0xa5,0xad,0xf3,0x1a,0x7b,0xac,
|
|
0xe5,0x1f,0xab,0xf6,0x1f,0xab,0xb6,0xef,0xb9,0x63,0xe4,0x8e,0xb1,0xde,0xcb,0x05,
|
|
0xac,0x77,0x73,0x01,0xcb,0xdf,0xb1,0xfc,0x1d,0xcb,0x3f,0xc6,0xf2,0xb7,0xe3,0x89,
|
|
0xb0,0xfc,0x23,0x2c,0xff,0x58,0xcb,0x3f,0x56,0xed,0xdd,0x51,0xfb,0x74,0xe4,0x8e,
|
|
0x95,0xdb,0xdb,0x1f,0x23,0x77,0x8c,0xdc,0x11,0x72,0x47,0xe8,0xf7,0x7c,0x09,0x69,
|
|
0x49,0xcb,0xed,0x58,0x7e,0x8e,0xe5,0x1f,0xb0,0xfc,0x03,0x96,0x7f,0xa6,0xe5,0x9f,
|
|
0xa9,0xf7,0x0f,0x25,0xa4,0x25,0x2d,0xb7,0x63,0xf9,0x39,0x96,0x7f,0xc0,0xf2,0x0f,
|
|
0x58,0xfe,0x99,0x96,0x7f,0xa6,0x7e,0xf7,0x97,0x90,0x96,0xb4,0xdc,0x8e,0xe5,0xe7,
|
|
0x58,0xfe,0x01,0xcb,0xdf,0xd8,0x27,0xca,0x7f,0xa2,0xfc,0x26,0x5a,0xc7,0x4f,0xb4,
|
|
0x8e,0x9f,0x68,0x1d,0x3f,0xd1,0x3a,0x7e,0x9e,0xfc,0xe7,0xc9,0x6f,0x9e,0x75,0xfc,
|
|
0x3c,0xeb,0xf8,0x79,0xd6,0xf1,0xf3,0x8e,0x71,0x7c,0xa6,0xe5,0x9f,0xa9,0x77,0x33,
|
|
0x25,0xa4,0x25,0x2d,0xb7,0x63,0xf9,0x39,0x96,0x7f,0xc0,0xf2,0x0f,0x58,0xfe,0x99,
|
|
0x96,0x7f,0xa6,0xde,0xc1,0x94,0x90,0x96,0xb4,0xdc,0x8e,0xe5,0xe7,0x58,0xfe,0x01,
|
|
0xcb,0x3f,0x60,0xf9,0x67,0x5a,0xfe,0x99,0x7a,0x2f,0x54,0x42,0x5a,0xd2,0x72,0x3b,
|
|
0x96,0x9f,0x63,0xf9,0x07,0x2c,0xff,0x80,0xe5,0x9f,0x69,0xf9,0x67,0xea,0x1d,0x51,
|
|
0x09,0x69,0x49,0xcb,0xed,0x58,0x7e,0x8e,0xe5,0x1f,0xb0,0xfc,0xbd,0x77,0x5a,0x25,
|
|
0xa4,0x25,0x2d,0xb7,0x63,0xf9,0x39,0x96,0x7f,0xc0,0xf2,0xf7,0xde,0x4d,0x95,0x90,
|
|
0x96,0xb4,0xdc,0x8e,0xe5,0xe7,0x58,0xfe,0x01,0xcb,0xdf,0x3e,0x3e,0xd3,0xf2,0xcf,
|
|
0xd4,0xbb,0xad,0x92,0x96,0x3a,0x96,0x3d,0x60,0xd9,0x33,0xf5,0x5e,0xac,0x84,0xb4,
|
|
0xa4,0xe5,0x76,0x2c,0x3f,0xc7,0xf2,0x0f,0x58,0xfe,0x01,0xcb,0x3f,0xd3,0xf2,0xcf,
|
|
0xd4,0xfb,0xbd,0x12,0xd2,0x92,0x96,0xdb,0xb1,0xfc,0x1c,0xcb,0x3f,0x60,0xf9,0x07,
|
|
0x2c,0xff,0x4c,0xcb,0xdf,0x6b,0xf7,0x8e,0xef,0xdd,0xa0,0xe3,0x7b,0x47,0xe8,0xf8,
|
|
0xde,0x15,0x3a,0xd6,0x3b,0xc3,0xc5,0xd6,0x35,0xf5,0xca,0xd0,0xf1,0xbd,0x27,0x74,
|
|
0xac,0xf7,0x85,0x5e,0x9f,0x93,0x65,0xf5,0x39,0x59,0xbe,0xbe,0x2b,0xcb,0xd7,0x7f,
|
|
0x65,0xf9,0xfa,0xb0,0x2c,0x5f,0x3f,0x96,0xe5,0xeb,0xcb,0xb2,0x7c,0xfd,0x59,0x96,
|
|
0xd5,0x27,0x65,0x59,0x7d,0x52,0x96,0xaf,0x6f,0xcb,0xf2,0xf5,0x6f,0x59,0xbe,0x3e,
|
|
0x2e,0xcb,0xd7,0xcf,0x65,0xf9,0xfa,0xba,0x2c,0x5f,0x7f,0x97,0x65,0xf5,0x19,0x59,
|
|
0x56,0x9f,0x91,0xe5,0xeb,0x7b,0xb2,0x7c,0xfd,0x4f,0x96,0xaf,0x0f,0xca,0xf2,0xf5,
|
|
0x43,0x59,0xbe,0xbe,0x28,0xcb,0xd7,0x1f,0x65,0x59,0x7d,0x4a,0x96,0xd5,0xa7,0x64,
|
|
0xf9,0xfa,0xa6,0x2c,0x5f,0xff,0x94,0xe5,0xeb,0xa3,0xb2,0x7c,0xfd,0x54,0x96,0xaf,
|
|
0xaf,0xca,0xf2,0xf5,0x57,0x59,0x56,0xfd,0xcd,0xb2,0xea,0x6f,0x96,0xaf,0x1d,0x64,
|
|
0xf9,0xda,0x42,0x96,0xaf,0x3d,0x64,0xf9,0xda,0x44,0x96,0xaf,0x5d,0x64,0xf9,0xda,
|
|
0x46,0x96,0x55,0xbf,0xb3,0xac,0xfa,0x9d,0xe5,0x6b,0x27,0x59,0xbe,0xb6,0x92,0xe5,
|
|
0x6b,0x2f,0x59,0xbe,0x36,0x93,0xe5,0x6b,0x37,0x59,0xbe,0xb6,0xe3,0xd5,0xb3,0x28,
|
|
0x69,0xa4,0xd5,0x9e,0xbc,0x7d,0x59,0x56,0xdb,0xf2,0xec,0x99,0x96,0x7a,0x75,0x26,
|
|
0x4a,0x1a,0x29,0x75,0xac,0x71,0x80,0xbb,0x14,0xce,0x8c,0x13,0x78,0xf7,0x03,0xcf,
|
|
0x6e,0x34,0x53,0x63,0x07,0x99,0x56,0x7b,0xf5,0xea,0x44,0x96,0xd5,0x76,0x3d,0x7b,
|
|
0xa6,0xa5,0x59,0xba,0x47,0x7a,0xf7,0x4d,0xef,0x7e,0xe4,0x58,0x63,0x0e,0xf7,0x2b,
|
|
0xdc,0xe2,0xb2,0x6a,0xeb,0x65,0xd5,0xf6,0xcb,0x1e,0xb9,0xb7,0x44,0x49,0x23,0xad,
|
|
0xb1,0x03,0xc7,0x37,0x1e,0xb1,0xc0,0xba,0x17,0xe5,0xb3,0xee,0x1f,0x51,0xd2,0x48,
|
|
0xa9,0x63,0x8d,0x73,0xfc,0xac,0x73,0xfe,0x5c,0xf6,0x88,0xdb,0xeb,0x9f,0xa3,0xa4,
|
|
0x91,0xd6,0x38,0x85,0xe3,0x1b,0xc7,0x58,0xaa,0xeb,0xb7,0xd4,0xba,0x27,0x64,0x5a,
|
|
0x61,0xbc,0xfe,0x3d,0x4a,0x1a,0x29,0x75,0xac,0xb1,0x95,0x29,0x3a,0x76,0xaa,0x9e,
|
|
0xd3,0xbc,0x71,0x9a,0x2e,0xce,0x91,0xfe,0xcd,0xab,0x93,0x59,0x56,0x5f,0xe7,0xd9,
|
|
0x33,0x2d,0xcd,0xd2,0x3d,0xcb,0xb1,0xc6,0x70,0xa6,0x59,0x7d,0xb7,0xe7,0x36,0xe1,
|
|
0x5e,0xd4,0xd8,0x90,0x39,0x77,0x10,0x4b,0x44,0xb9,0x23,0xf3,0x7c,0xfe,0x13,0x45,
|
|
0x15,0x2e,0x99,0xe3,0xe2,0x9d,0x63,0x63,0xf6,0x27,0x95,0xfb,0xff,0xa4,0x1e,0x83,
|
|
0xf2,0x8e,0x8b,0x39,0x26,0x44,0x9c,0xf5,0x9d,0x23,0x78,0xfb,0xea,0x1f,0x23,0x3e,
|
|
0x13,0x3e,0x41,0x73,0x24,0xcc,0x1c,0xa2,0x54,0x48,0x83,0x1a,0x50,0x13,0xd2,0xa1,
|
|
0x2a,0x14,0xaf,0xe0,0x38,0x75,0xcd,0x98,0x1a,0x9c,0xab,0xb1,0xec,0x04,0xcd,0x45,
|
|
0xf2,0xe6,0x21,0x9d,0xcc,0xf1,0x5d,0xf5,0x5e,0x75,0x80,0xc6,0xe1,0xcc,0xfb,0xd5,
|
|
0x2b,0xf4,0x5e,0xb5,0xaf,0xde,0xad,0x9a,0x73,0x64,0x6b,0xac,0x6e,0x88,0xde,0xd7,
|
|
0x0e,0xd6,0xb1,0xd5,0x1d,0xf7,0x7d,0xa1,0x67,0x37,0xfe,0xe6,0x5d,0xe2,0x4c,0x69,
|
|
0x77,0xf9,0x0f,0xb0,0xec,0xe6,0xb9,0x7e,0x42,0xc0,0x0d,0x63,0xde,0xd3,0xf5,0xd2,
|
|
0xbb,0x62,0x8f,0xdc,0x77,0x6c,0x01,0xf7,0xb7,0x5a,0x33,0xbd,0x37,0xee,0xab,0xf7,
|
|
0xc6,0xe7,0x2b,0x2e,0xf3,0xbe,0xa7,0x8d,0xd2,0xe2,0xd1,0x56,0xef,0x97,0x2f,0xd4,
|
|
0x7b,0xe8,0xf3,0x64,0x6f,0xa9,0x71,0xea,0x69,0x7a,0x0f,0xd0,0xc2,0x39,0x32,0x06,
|
|
0x9d,0xa9,0x74,0xf6,0xd0,0x31,0x8d,0x15,0xde,0x9c,0x63,0x6d,0xc8,0x71,0xde,0x85,
|
|
0x75,0xb0,0x3e,0xe4,0x5e,0x9b,0xc6,0x3a,0xd6,0xbc,0x8f,0x58,0xa2,0xf7,0xc3,0xf7,
|
|
0xc0,0x64,0x28,0x56,0xc1,0x7d,0xdf,0xe9,0xbd,0xab,0xf6,0xe6,0xbb,0x78,0xf3,0xc4,
|
|
0x6a,0x58,0xf6,0x74,0xcb,0x9e,0x68,0x5d,0x43,0xe3,0x4e,0xd6,0xb5,0xf4,0xec,0x9e,
|
|
0x7f,0xaa,0xe5,0x9f,0x6a,0xcd,0x39,0x4b,0xd5,0x35,0xf7,0xec,0x5e,0xf8,0x34,0xd5,
|
|
0x03,0xcf,0xee,0xf9,0xd7,0xb4,0x8e,0xad,0x69,0x85,0xa9,0xa9,0xfa,0xe2,0xd9,0xbd,
|
|
0xf0,0xde,0x75,0x38,0x16,0xed,0x2d,0x9a,0x59,0xea,0xb7,0x7b,0x5c,0x64,0xd1,0xcc,
|
|
0x52,0xef,0x3a,0x37,0xd4,0x38,0x42,0x4b,0x95,0x5f,0x5e,0x0c,0xb5,0xe8,0x6d,0xa9,
|
|
0xdf,0xee,0x31,0xdc,0xa2,0xb7,0xa5,0xbd,0x55,0xb7,0xba,0xeb,0xba,0xf5,0xd3,0xb5,
|
|
0xf0,0xca,0x7e,0x02,0x0d,0xb6,0xa6,0x99,0xfb,0x20,0xbd,0x57,0xba,0x56,0xfa,0x9e,
|
|
0x74,0x9d,0x34,0xa2,0x82,0xab,0xf9,0xa4,0x05,0xa4,0xb1,0xd2,0x73,0xa4,0x55,0x2b,
|
|
0xfc,0x7f,0xe2,0x8f,0x41,0x1d,0x85,0x6f,0x28,0xcd,0x92,0x36,0x95,0x9a,0xb6,0x6c,
|
|
0xb4,0xab,0xdc,0x2d,0xa5,0x75,0xe4,0x5f,0x4f,0x7a,0xb9,0xfc,0x7b,0x48,0x07,0x49,
|
|
0x07,0x4b,0x87,0x4a,0x87,0x49,0xaf,0x91,0x5e,0x2b,0x1d,0x2d,0x1d,0x23,0xbd,0x49,
|
|
0x7a,0xb3,0xf4,0x71,0xe9,0x54,0xe9,0x34,0xe9,0x74,0xe9,0x08,0xe9,0x75,0xd2,0xbb,
|
|
0xa4,0x77,0x4b,0x67,0x4b,0xe7,0x48,0x5f,0x94,0xce,0xf5,0xca,0x93,0x8b,0x12,0x93,
|
|
0x70,0x62,0xfd,0x9c,0xdd,0x9e,0x12,0xad,0xbe,0x31,0xd1,0x39,0xd2,0x9e,0xbc,0xf9,
|
|
0x9b,0x5e,0x7b,0xf1,0xda,0x87,0xd7,0x46,0xbd,0xfa,0x9f,0xae,0x63,0x13,0xd4,0x67,
|
|
0x26,0xaa,0xdf,0xac,0x2c,0x7f,0xcf,0x9e,0x6c,0xd9,0x53,0x2c,0x7b,0xaa,0x65,0x4f,
|
|
0xb3,0xec,0x35,0x2c,0x7b,0x4d,0xcb,0x9e,0x6e,0xd9,0xbd,0x7c,0xd8,0xee,0x44,0x9f,
|
|
0x3b,0xc9,0xe7,0x4e,0xf6,0xb9,0x53,0x7c,0xee,0x54,0x9f,0x3b,0xcd,0xe7,0xae,0xe1,
|
|
0x73,0xd7,0xf4,0xb9,0xd3,0x7d,0xf9,0xf7,0xd2,0x97,0xa8,0x7b,0x65,0x92,0x34,0x59,
|
|
0x9a,0x22,0x4d,0x95,0xa6,0x49,0x6b,0x48,0x6b,0x4a,0xd3,0xa5,0x5e,0x9e,0xe3,0xad,
|
|
0xfc,0xc6,0x5b,0x79,0x8d,0xb7,0xf2,0x19,0x6f,0xe5,0x31,0xde,0xca,0x5f,0xbc,0x95,
|
|
0xb7,0x78,0x2b,0x5f,0xf1,0x56,0x9e,0xe2,0xad,0xfc,0xc4,0x5b,0x79,0x89,0x57,0xde,
|
|
0xba,0x5a,0xf9,0xec,0x66,0xd9,0xbb,0x5b,0xf6,0xcb,0x2d,0x7b,0x0f,0xcb,0xde,0xd3,
|
|
0xb2,0xf7,0xb2,0xec,0x57,0x58,0xf6,0xde,0x96,0xfd,0x4a,0xcb,0xde,0xc7,0xb2,0xf7,
|
|
0xb5,0xec,0xfd,0x2c,0x7b,0x7f,0xcb,0x3e,0xc0,0xb2,0x67,0x5b,0xf6,0x81,0x96,0x7d,
|
|
0x90,0x65,0x1f,0x6c,0xd9,0x87,0x58,0xf6,0xab,0x2c,0xfb,0x50,0xcb,0x3e,0xcc,0xb2,
|
|
0x0f,0xb7,0xec,0x57,0x5b,0xf6,0x6b,0x64,0x6f,0xe0,0x1c,0xb9,0x9f,0x36,0xb2,0xee,
|
|
0xa7,0x27,0x32,0x16,0x6c,0xdf,0xcf,0xdb,0x5a,0xe3,0xc1,0xed,0x35,0x26,0x6c,0xee,
|
|
0x13,0x1d,0x75,0x1f,0xef,0xaa,0x6b,0xd2,0xdd,0xba,0xd7,0xf6,0x54,0x59,0x5f,0x61,
|
|
0xdd,0x77,0xfd,0xcf,0x30,0x03,0x54,0x46,0x03,0x55,0x26,0x83,0xad,0xf1,0xe1,0xa1,
|
|
0xca,0xeb,0x70,0xe5,0xed,0x1a,0xd5,0x07,0x7f,0x1f,0x5d,0xcb,0x71,0xa9,0x9b,0x07,
|
|
0x1f,0x57,0x71,0xfb,0xab,0x2b,0x95,0xf6,0xae,0x71,0x8e,0xb3,0x86,0x84,0x3c,0xf6,
|
|
0x98,0x9b,0xd9,0xca,0x90,0x06,0xf5,0xa1,0x23,0x8c,0x85,0xdb,0x61,0x32,0xbc,0x6c,
|
|
0xfc,0x29,0x84,0x1e,0xd0,0x07,0x46,0xc3,0x7d,0x30,0x1d,0xb6,0xc0,0xb7,0x2a,0xa0,
|
|
0x87,0xe0,0x20,0x94,0xa2,0xa0,0xce,0x80,0x9a,0xd0,0x00,0x2e,0x81,0xde,0x30,0x1a,
|
|
0x5e,0x82,0x95,0xb0,0x0d,0x36,0x90,0x90,0xb2,0x14,0xe2,0x6e,0x0a,0x31,0x48,0x21,
|
|
0xe6,0x87,0x52,0x50,0x09,0x06,0x43,0xeb,0x4e,0x8e,0x33,0x12,0x7e,0x80,0x22,0x97,
|
|
0x38,0x4e,0x05,0xa8,0x09,0xfd,0x61,0x20,0x6c,0xba,0xd4,0x71,0x3e,0x83,0xfd,0xf0,
|
|
0x33,0x0c,0xba,0x8c,0xf2,0x81,0x1b,0xe0,0x1b,0xf8,0x19,0x0a,0x74,0xe6,0xb7,0x03,
|
|
0xb4,0x86,0xae,0x30,0x18,0x5e,0x83,0x7c,0x5c,0xa8,0x34,0x68,0x01,0xd5,0xb9,0x50,
|
|
0x29,0x70,0x33,0xdc,0x0f,0x4f,0xc2,0x02,0xd8,0x02,0x9f,0xc1,0x3e,0x2e,0x62,0x3e,
|
|
0x2e,0x62,0x65,0x28,0x47,0x99,0x75,0x83,0xab,0x61,0x0e,0xac,0x86,0xf7,0x60,0x13,
|
|
0x14,0xe1,0xa2,0x96,0x84,0x14,0xe8,0xc3,0x05,0xad,0xc2,0xc5,0x4c,0x83,0xda,0x50,
|
|
0x1f,0x9a,0x40,0x47,0xe8,0x04,0xcf,0xc1,0x8d,0x5c,0xe8,0x5b,0x20,0x87,0x8b,0xbd,
|
|
0x03,0x4e,0xe3,0x82,0x97,0x85,0xca,0x90,0x00,0xb7,0xc1,0xdd,0x30,0x94,0x4a,0x70,
|
|
0x1d,0xbc,0x00,0x8b,0xe1,0x2b,0xd8,0x44,0xa5,0xd8,0x0a,0x07,0xa0,0x16,0x15,0x63,
|
|
0x3e,0x2c,0x82,0x21,0x54,0x90,0xd5,0x70,0x10,0x06,0x8f,0xa0,0xec,0x20,0xed,0x06,
|
|
0xea,0x30,0xdc,0x0a,0x0b,0x21,0x30,0xd2,0x71,0x0a,0x42,0x71,0x48,0x86,0x1b,0xe0,
|
|
0x16,0xd8,0x36,0xca,0x71,0x76,0xc1,0x01,0x38,0x0c,0x05,0x47,0x3b,0x4e,0x69,0x28,
|
|
0x0b,0xfd,0x61,0x10,0x0c,0x87,0x96,0x37,0x91,0x3f,0xc8,0x18,0x47,0x7b,0x81,0xee,
|
|
0x70,0xfd,0x2d,0xa4,0x17,0xd6,0x81,0x73,0x2b,0xfd,0xda,0xed,0xb4,0x31,0x68,0x07,
|
|
0xc3,0xe1,0x11,0xb8,0xfc,0x0e,0xea,0x39,0xcc,0x81,0xe9,0x77,0x3a,0xce,0x2a,0x78,
|
|
0x68,0x3c,0xcf,0xdb,0x30,0x17,0xee,0x9a,0x40,0x5b,0xbc,0xcb,0x71,0x96,0xc3,0x5b,
|
|
0xf0,0x2e,0x0c,0x9b,0x48,0x1d,0x80,0x33,0xef,0xa3,0xee,0xc0,0x02,0xd8,0x09,0x6d,
|
|
0xee,0x77,0x9c,0xcb,0xa0,0x1b,0xf4,0x86,0xd5,0xb0,0x07,0x0e,0x40,0xe0,0x01,0xee,
|
|
0xf7,0xb0,0x09,0x36,0xc3,0x7d,0x93,0xf8,0x2d,0x0a,0xcf,0xc1,0xd4,0x07,0x1d,0x67,
|
|
0x23,0x6c,0x86,0x73,0x1e,0xe2,0xda,0x43,0x12,0xd4,0x81,0x8b,0xe1,0xb3,0x87,0x69,
|
|
0x77,0x8f,0x52,0x26,0xf0,0x14,0xbc,0x02,0xaf,0xc1,0x1a,0x78,0x17,0x0e,0xc2,0x4f,
|
|
0x50,0x98,0x76,0x53,0x02,0xca,0x41,0x6d,0x68,0x0e,0x17,0xc0,0x1d,0xf0,0x30,0x4c,
|
|
0x7e,0xcc,0xfd,0xed,0x54,0x3c,0xc1,0x6d,0x03,0x8d,0x20,0x0b,0x5a,0xe0,0x9e,0x04,
|
|
0x2d,0xa5,0xad,0xa4,0x6d,0xa4,0x6d,0xa5,0xed,0xa4,0x1d,0xa4,0x1d,0xa5,0x9d,0xa4,
|
|
0x97,0x4a,0x3b,0x4b,0xbb,0x4a,0x2f,0x97,0xf6,0x94,0x5e,0x21,0x1d,0x60,0xe9,0x83,
|
|
0x30,0x48,0xee,0x41,0x72,0x5f,0x25,0xf7,0x55,0x72,0x0f,0x97,0x7b,0xb8,0xdc,0xd7,
|
|
0xca,0x7d,0xad,0xdc,0x8d,0xe5,0x36,0x79,0xf4,0xd4,0xf8,0x3f,0x22,0xff,0x71,0x70,
|
|
0x2b,0x4c,0x97,0xfb,0x79,0xe9,0x0c,0xe9,0x2c,0xe9,0x1c,0xe9,0x5c,0xe9,0x3c,0xe9,
|
|
0x02,0xe9,0x2b,0xd2,0x85,0xd2,0xc5,0xd2,0xa5,0xd2,0xd7,0xa5,0xcb,0xa5,0x2b,0xa5,
|
|
0xef,0x58,0x6a,0xd2,0xb5,0x4e,0xee,0x75,0x72,0xbf,0x2f,0xf7,0xfb,0x72,0x6f,0x94,
|
|
0x7b,0xa3,0xdc,0x9b,0xe4,0xde,0x24,0xf7,0xd3,0x72,0xef,0x95,0xee,0x93,0xee,0x97,
|
|
0x7e,0x2d,0xfd,0xc9,0xca,0x97,0x49,0x8b,0x53,0x8c,0xfa,0x08,0xcf,0x42,0x10,0x9e,
|
|
0x83,0xe7,0x21,0x02,0x22,0x21,0x04,0x33,0x61,0x16,0xcc,0x86,0x39,0xf0,0x22,0xcc,
|
|
0x85,0x33,0x20,0x0a,0xa2,0x21,0x1f,0x94,0x87,0x18,0xc8,0x0f,0x05,0xa0,0x20,0x14,
|
|
0x82,0xc2,0x50,0x04,0x8a,0x42,0x31,0x28,0x0e,0x5d,0xa1,0x1b,0x74,0x87,0xcb,0xa1,
|
|
0x07,0xf4,0x84,0x5e,0x70,0x05,0xf4,0x86,0x2b,0xa1,0x0f,0xf4,0x85,0x7e,0xd0,0x1f,
|
|
0x06,0x40,0x36,0x0c,0x84,0x41,0x30,0x18,0x86,0xc0,0x55,0xd0,0x05,0x4a,0x42,0x29,
|
|
0x58,0x01,0x2b,0xe1,0x2d,0x78,0x1b,0xd6,0xc3,0x06,0xf8,0x10,0xce,0x84,0x8f,0x61,
|
|
0x33,0x9c,0x05,0x65,0xa0,0x1c,0x54,0x80,0x58,0xa8,0x04,0xe7,0x42,0x55,0xa8,0x06,
|
|
0x71,0x10,0x0f,0xd5,0x21,0x09,0xd2,0x20,0x03,0x9a,0xc0,0x79,0xb0,0x1f,0xbe,0x86,
|
|
0x0e,0x70,0x11,0x74,0x84,0x1b,0x61,0x2c,0x8c,0x83,0xbb,0xe0,0x6e,0xb8,0x17,0x1e,
|
|
0x85,0x29,0xc5,0xdc,0x7b,0x9a,0xb9,0x7f,0xc5,0xc0,0x26,0xee,0x33,0xf9,0xd1,0x38,
|
|
0x28,0x00,0x49,0x57,0xb9,0xf7,0xb8,0xd3,0x21,0x00,0xe7,0x72,0xaf,0x49,0xe8,0xe0,
|
|
0xde,0xe7,0xcc,0x73,0x83,0xb9,0x66,0xde,0x33,0x44,0xd0,0xb2,0x47,0x58,0xf6,0x90,
|
|
0x65,0x8f,0xb2,0xec,0xd1,0x96,0x3d,0xc6,0xb2,0x17,0xb0,0xec,0x05,0x2d,0x7b,0x61,
|
|
0xcb,0x5e,0xc4,0xb2,0x17,0xb5,0xec,0xc5,0x2c,0x7b,0x71,0xcb,0xee,0xe8,0x3a,0xdb,
|
|
0x69,0xed,0xea,0x4b,0x6f,0x57,0x5f,0x9a,0xbb,0xfa,0xd2,0xdd,0xd5,0x97,0xf6,0xae,
|
|
0xbe,0xf4,0x77,0xf5,0xe5,0xa1,0xab,0x2f,0x1f,0x5d,0x7d,0x79,0xe9,0xea,0xcb,0x4f,
|
|
0x57,0x5f,0x9e,0xba,0xfa,0xf2,0xd5,0xd5,0x97,0x37,0x7f,0xfc,0xfd,0x7d,0xe7,0xef,
|
|
0xad,0x7a,0x6f,0xea,0xf3,0xf4,0x63,0xec,0x2b,0xee,0x3b,0xc6,0xd4,0x03,0xcf,0x7e,
|
|
0xbb,0x65,0x8f,0xb1,0xec,0xa6,0x7e,0x78,0xf6,0x7b,0x2d,0xff,0x7e,0x6d,0xac,0xb2,
|
|
0xb4,0xfc,0xfb,0x58,0xfe,0x97,0x5a,0xfe,0xa6,0x9f,0xf7,0xec,0xe6,0x79,0xe1,0xd7,
|
|
0xf0,0xd9,0xd6,0x6f,0xb0,0xbe,0x47,0xec,0x95,0xad,0x30,0xe6,0x5e,0xe7,0xd9,0xcd,
|
|
0x33,0x91,0x67,0x37,0xcf,0x1f,0x9e,0xbd,0xca,0x15,0x56,0xfa,0xad,0x63,0xeb,0x5d,
|
|
0x7d,0xc4,0x5e,0xe8,0x42,0xeb,0x59,0x78,0xd0,0x11,0xfb,0x94,0xdb,0xad,0x34,0x5b,
|
|
0xe1,0x5f,0xbc,0xe0,0x88,0x7d,0x9b,0x95,0x97,0x11,0x56,0x3c,0x3d,0x3b,0x59,0x61,
|
|
0x86,0x1e,0xb1,0x07,0x5a,0x1d,0xb1,0xaf,0xb0,0xe2,0xbf,0xd0,0x2a,0x87,0x7e,0xd6,
|
|
0xb9,0x8a,0x59,0xe1,0xcd,0x73,0x86,0x67,0x3f,0x20,0x7b,0x2b,0x1e,0xac,0x47,0x5c,
|
|
0xe6,0x3e,0x87,0x8d,0xbf,0xd6,0x7d,0xf6,0xf6,0xde,0x99,0x25,0x59,0xbf,0xb5,0x92,
|
|
0xac,0xdf,0xda,0x49,0xfa,0x9d,0x95,0xe4,0x1c,0x79,0x0f,0x95,0x26,0xad,0x21,0xad,
|
|
0x29,0x4d,0xd7,0x31,0x09,0xd6,0xef,0xed,0x64,0x2b,0xae,0x64,0xeb,0xf7,0x7b,0xb2,
|
|
0xe2,0x73,0xd4,0x6f,0x47,0xa8,0xaf,0xf6,0xfa,0xe3,0x18,0xab,0x0f,0x3e,0x56,0xff,
|
|
0xeb,0xb5,0x4d,0xaf,0x4d,0x7a,0x6d,0xd1,0x6b,0x83,0x5e,0xdb,0xf3,0xda,0x9c,0xd7,
|
|
0xd6,0xbc,0x36,0xe6,0xb5,0x2d,0xaf,0x4d,0x79,0x6d,0xc9,0x6b,0x43,0x5e,0xdb,0x29,
|
|
0xee,0x0b,0x37,0x4f,0xe7,0xf6,0xda,0x49,0x7f,0xc5,0x39,0x44,0xda,0xff,0x18,0x7d,
|
|
0xa3,0xa9,0xf3,0xa6,0xae,0x9b,0x3a,0x6e,0xea,0xb6,0xa9,0xd3,0xa6,0x2e,0x9b,0x3a,
|
|
0x6c,0xea,0xae,0xa9,0xb3,0xa6,0xae,0x9a,0x3a,0x6a,0xea,0xa6,0xa9,0x93,0xa6,0x2e,
|
|
0x9a,0x3a,0x68,0xea,0x9e,0xa9,0x73,0xa6,0xae,0x99,0x3a,0x66,0xea,0x96,0xa9,0x53,
|
|
0x1b,0xd1,0x1a,0x57,0xb9,0xcf,0xf1,0xbd,0x79,0xae,0xab,0x42,0xbc,0xd9,0xc4,0xb9,
|
|
0x93,0xb8,0x42,0x0f,0xb8,0x75,0x61,0x12,0x7e,0xdd,0xfb,0x1c,0xdd,0x37,0xef,0xe0,
|
|
0x39,0xfe,0x00,0xe1,0x6a,0xc3,0xfd,0x9d,0xdc,0xba,0x67,0xea,0x9c,0xa9,0x6b,0xa6,
|
|
0x8e,0x99,0xba,0x75,0x66,0x47,0xf7,0xfa,0xa4,0xe9,0x3a,0xd5,0x90,0x7a,0xef,0x0f,
|
|
0xd3,0x75,0x0d,0x13,0xac,0xf7,0x29,0x29,0x56,0x5d,0xf1,0xae,0x71,0x8a,0xf5,0xae,
|
|
0x26,0x45,0xf1,0xa5,0x28,0xbe,0x14,0xc5,0x97,0xa2,0xf8,0x52,0xad,0x77,0x37,0xa6,
|
|
0x5c,0x92,0xa4,0xc9,0xd2,0x14,0x69,0xaa,0x34,0x4d,0x5a,0x43,0x5a,0x53,0x9a,0x2e,
|
|
0xf5,0xde,0x27,0x78,0xf6,0x44,0xcb,0xee,0xc5,0xdd,0x54,0xbf,0x1d,0x7b,0xe8,0x77,
|
|
0xa1,0x67,0x6f,0x6f,0xbd,0x43,0x36,0xbf,0x67,0x1f,0x27,0xa2,0x27,0xf5,0x8c,0x32,
|
|
0x15,0x9e,0xd5,0x73,0xd7,0xf3,0x7a,0xde,0x9a,0xa5,0xe7,0x91,0xb9,0x7a,0xbe,0x5a,
|
|
0xa0,0xe7,0xaa,0x85,0x7a,0x9e,0x5a,0xaa,0xe7,0xa8,0xe5,0x7a,0x66,0x59,0x05,0xab,
|
|
0xe1,0x2d,0x58,0x03,0x6f,0xeb,0x39,0x6a,0x9d,0x9e,0x97,0x36,0xea,0xb9,0xe8,0x13,
|
|
0xd8,0x0c,0x5b,0xe0,0x53,0xd8,0x0a,0xdb,0x61,0x07,0xec,0x84,0x2f,0x60,0x17,0xec,
|
|
0x86,0x2f,0x61,0x8f,0x9e,0x9f,0xf6,0xe9,0xb9,0xc9,0x3c,0x33,0x6d,0x37,0x75,0xf1,
|
|
0x42,0x37,0x0f,0xde,0xb3,0xda,0x61,0xa5,0xe3,0x71,0x1d,0x6b,0xce,0x39,0x45,0xee,
|
|
0x03,0xd6,0x33,0xda,0xe3,0xe2,0xb0,0xc2,0x3d,0xa9,0x74,0x1f,0xb0,0x9e,0x33,0x9f,
|
|
0x94,0x7b,0xa9,0xca,0x67,0x9a,0xdc,0x53,0x55,0x0e,0x33,0xac,0xf3,0x4d,0x92,0xff,
|
|
0x61,0x95,0xdf,0x61,0x95,0xe5,0x01,0x85,0x7d,0x56,0x7e,0x5b,0xb4,0xff,0x49,0xe5,
|
|
0x6f,0xba,0xf2,0xfa,0x9a,0xe2,0x99,0xae,0xbc,0xee,0xb2,0xe2,0x9a,0x24,0xbf,0x03,
|
|
0x96,0xfb,0x80,0xca,0xd0,0x7b,0x36,0xf6,0x3f,0x2b,0xaf,0xd6,0xf1,0xc6,0xfd,0x99,
|
|
0x15,0x9f,0xb7,0x7f,0xb7,0xf5,0x3c,0xec,0xf9,0xef,0xb1,0xd4,0x2b,0x83,0x2f,0x94,
|
|
0x66,0xcf,0xff,0x53,0x2b,0xcf,0xbb,0x2d,0xff,0xbd,0x56,0x1e,0xfc,0xc7,0xfa,0xdd,
|
|
0x2b,0xad,0x72,0xde,0x6d,0x3d,0xa7,0x3f,0x69,0x9d,0x7b,0x8f,0xce,0xb3,0x46,0x75,
|
|
0xf0,0xb0,0xca,0x71,0x8e,0x8e,0x59,0x25,0xfb,0x61,0xeb,0x39,0x7b,0xae,0xe2,0xf0,
|
|
0xe2,0x9d,0x6b,0x5d,0x3f,0xaf,0xec,0xe7,0xa9,0x2c,0xec,0xeb,0xfc,0x8a,0x15,0xce,
|
|
0xb3,0xaf,0xf4,0x95,0xcf,0x02,0xeb,0x77,0xc2,0x3c,0xeb,0x9a,0xef,0xb6,0xf2,0xb3,
|
|
0x4a,0xf5,0xfd,0x6d,0xab,0x2c,0xde,0x51,0x9a,0x5e,0xf7,0xd5,0x51,0xfb,0x3c,0xb6,
|
|
0xff,0xeb,0xd6,0xef,0x8f,0xc3,0xaa,0xfb,0xbb,0xad,0xdf,0x1e,0x8f,0x2b,0x2d,0x2b,
|
|
0x7d,0xfe,0x33,0x7c,0xee,0x39,0xd6,0xef,0x16,0xbb,0x1d,0xd8,0x75,0xcd,0xfb,0x0d,
|
|
0xf3,0x84,0x75,0x4d,0xbd,0xdf,0x36,0xaf,0x29,0x9f,0xcf,0x58,0xc7,0x7f,0x61,0xb5,
|
|
0xa1,0x19,0x2a,0x1f,0xaf,0xfd,0x78,0xed,0x6a,0xa1,0x65,0x5f,0xad,0x34,0x6c,0x54,
|
|
0x98,0xd7,0xad,0x7d,0x5e,0xbb,0xd8,0x68,0xe5,0x7d,0x9e,0xf5,0x3b,0xca,0xcb,0xff,
|
|
0x62,0xeb,0xfa,0x3e,0x69,0x95,0xd9,0x26,0x5f,0xf9,0x6f,0xd2,0xbe,0x4d,0x56,0xfc,
|
|
0x2b,0xad,0xdf,0x61,0x5e,0x3a,0x3d,0xbb,0xd7,0x7e,0x9e,0xb4,0xea,0x9b,0xe7,0xde,
|
|
0x2d,0xfb,0x6b,0xba,0x16,0x9f,0xc8,0x6f,0x86,0xec,0x07,0x94,0xd6,0xcf,0x65,0xdf,
|
|
0x6c,0xc5,0xe1,0xb9,0x77,0x59,0x6a,0x5f,0xcf,0xdd,0x6a,0x43,0x5e,0x7b,0xb5,0xed,
|
|
0x5e,0x3d,0xf2,0xb7,0xb1,0xed,0xbe,0x7e,0x66,0xbb,0x15,0xd7,0x0e,0xab,0x6f,0xdb,
|
|
0x65,0x5d,0xdb,0xdd,0x72,0x7f,0xe1,0xab,0x17,0xde,0x71,0x87,0xad,0x6b,0xed,0xf5,
|
|
0xb1,0x5b,0xa4,0x5e,0xd9,0xcd,0xb2,0xfa,0x1a,0xbb,0x7d,0x9b,0x7b,0xcf,0x82,0x6c,
|
|
0xf7,0x7e,0x63,0x34,0x49,0x9a,0x2c,0x4d,0x91,0xa6,0x4a,0xd3,0xa4,0x35,0xa4,0x35,
|
|
0xa5,0xe9,0x56,0x3c,0x76,0x9c,0x89,0x96,0x3d,0xc9,0xb2,0x27,0x5b,0xf6,0x14,0xcb,
|
|
0x9e,0x6a,0xd9,0xd3,0x2c,0x7b,0x0d,0xcb,0x5e,0xd3,0xb2,0xa7,0x5b,0xe9,0x4e,0xb0,
|
|
0xec,0x76,0x7e,0x92,0x2c,0x7b,0xb2,0x65,0xf7,0xce,0x7b,0x85,0xde,0xef,0x76,0xd5,
|
|
0xfb,0xda,0xae,0x7a,0x57,0xdc,0x4e,0xef,0x71,0xbb,0xea,0xbe,0x3b,0x40,0xf7,0xdc,
|
|
0x6c,0xdf,0x78,0x9c,0xa7,0x49,0x96,0x3d,0x59,0xef,0x93,0x4d,0x1c,0x83,0x79,0x96,
|
|
0x2d,0x4a,0x44,0x71,0x3d,0xdd,0x7b,0x9c,0x79,0xaf,0x69,0x9e,0x77,0x0a,0xe3,0x7e,
|
|
0xa5,0xaf,0xfb,0x0c,0x55,0xa4,0x33,0xbf,0xf3,0x5b,0xb9,0xcf,0x51,0xd9,0x3a,0x7f,
|
|
0x7f,0xe9,0xab,0x9a,0xe7,0xdc,0x4f,0xee,0x3e,0xd2,0x16,0x7a,0x9f,0xdd,0x52,0xda,
|
|
0x44,0xea,0x8d,0x77,0xf7,0x55,0x58,0xdb,0x9d,0xad,0x77,0xde,0xfd,0xa5,0xaf,0x46,
|
|
0x1c,0xd1,0x5e,0x3a,0x87,0xf7,0xdd,0x92,0x37,0xee,0x7d,0x8d,0xdc,0x9e,0xbd,0xa5,
|
|
0x65,0x6f,0x62,0xd9,0x2f,0xb4,0xec,0xaf,0x46,0x1c,0x79,0xb7,0xdd,0x57,0xe5,0xd2,
|
|
0xd7,0x7a,0xe7,0xdd,0xd3,0x7a,0xef,0xdd,0x4f,0xe1,0xfb,0x39,0x47,0xe8,0x2e,0xed,
|
|
0xe3,0x1c,0xed,0x9f,0x64,0xed,0x4b,0xb2,0xb4,0x8f,0xcf,0xcf,0xbb,0x06,0xdd,0x2d,
|
|
0xbb,0xa7,0x7d,0x7c,0x7e,0xa5,0x2a,0xb8,0xef,0xda,0x6d,0x7b,0x92,0x55,0x27,0xfa,
|
|
0x58,0xf6,0x96,0x96,0xbd,0x89,0x65,0x1f,0x64,0xd5,0x1f,0xdb,0xee,0xc5,0x77,0x2c,
|
|
0xbf,0x24,0x6b,0xde,0x42,0x7f,0xe9,0xab,0x11,0x47,0xd2,0x32,0x58,0xfb,0xdb,0x6b,
|
|
0x7f,0x7b,0xed,0x6f,0xaf,0xfd,0xed,0x95,0xb6,0xf6,0x4a,0x97,0x57,0x37,0x3b,0x28,
|
|
0x7c,0x07,0x85,0xef,0xa0,0xf0,0x1d,0x14,0xbe,0x83,0xc2,0x7b,0xee,0x69,0xfa,0xbe,
|
|
0x66,0x9a,0xe6,0xd0,0xc7,0x2b,0x7c,0xbc,0xea,0xd3,0x40,0x95,0x63,0x77,0xab,0xde,
|
|
0x37,0x54,0x3e,0xbc,0x7a,0xd2,0x50,0xed,0x23,0x5e,0xfb,0xbd,0xfa,0x78,0xb5,0xc6,
|
|
0x3c,0xba,0xaa,0x6e,0xb4,0xd6,0xf8,0x47,0x7f,0xd5,0x5f,0x8f,0x96,0x4a,0xcb,0x10,
|
|
0xe7,0xe8,0x7a,0xd3,0x5f,0x3a,0x40,0xe7,0xe9,0xab,0x31,0x90,0x7e,0x6a,0x9b,0xfd,
|
|
0xac,0x31,0xf2,0x7e,0x0a,0xd7,0x57,0xe7,0x69,0xaa,0xf2,0xb0,0xf3,0xd3,0x5a,0x78,
|
|
0xd7,0xd1,0x9b,0x2b,0x32,0x48,0xe3,0x3a,0x43,0x55,0x2e,0xdd,0x54,0x9e,0x26,0x8f,
|
|
0x5e,0xbb,0xf3,0xec,0x89,0xfa,0x3d,0x9e,0x24,0x4d,0x96,0xa6,0x48,0x53,0xa5,0x69,
|
|
0xd2,0x1a,0xd2,0x9a,0xd2,0x74,0xa9,0xd7,0x57,0x7a,0xf6,0x44,0xcb,0x9e,0x64,0xd9,
|
|
0x93,0x2d,0x7b,0x8a,0x65,0x4f,0xb5,0xec,0x69,0x96,0xbd,0x86,0x65,0xaf,0x69,0xd9,
|
|
0xd3,0xad,0x74,0x27,0x58,0x76,0x3b,0x3f,0x49,0x96,0x3d,0xd9,0xb2,0xa7,0x58,0xf6,
|
|
0x54,0xcb,0x9e,0x66,0xd9,0x6b,0x58,0xf6,0x9a,0x96,0x3d,0xdd,0x2a,0xa7,0x04,0xcb,
|
|
0xee,0x9d,0xb7,0x97,0xd5,0x3f,0x35,0x8f,0xe4,0x37,0x0d,0x0c,0x78,0xc6,0xad,0x53,
|
|
0x8d,0x35,0xee,0x56,0x31,0xc0,0xf5,0x81,0x4a,0xf8,0xd7,0x98,0x4e,0x5d,0x09,0x72,
|
|
0xed,0xd0,0x3b,0xd0,0xa6,0xfc,0x1e,0xfc,0xa6,0xa7,0x3b,0x8e,0xb0,0x12,0xfb,0xbb,
|
|
0x54,0x9a,0x24,0x7e,0x4f,0x7c,0xd6,0xd6,0x7d,0x07,0x6f,0x68,0xd3,0xd1,0xfd,0xdd,
|
|
0x7a,0x33,0x1d,0x72,0x53,0xec,0xdf,0x71,0xc2,0xde,0x5c,0xec,0xb1,0x37,0x38,0x4e,
|
|
0xfd,0x9b,0x1c,0xe7,0xe5,0x9b,0x1d,0xe7,0x87,0x71,0x8e,0x33,0x9e,0xdf,0xa8,0xc1,
|
|
0x2b,0x1d,0xa7,0x34,0x17,0xfa,0x43,0x2a,0xcf,0x27,0x54,0x8e,0xba,0x37,0x3a,0xce,
|
|
0x95,0x1c,0xbb,0x7f,0x92,0xe3,0x8c,0x26,0xde,0xab,0x88,0x37,0x92,0xca,0x5a,0x9a,
|
|
0x4a,0x13,0xc7,0xb1,0x65,0x1e,0xa5,0x2e,0xf1,0x7b,0x75,0x37,0x95,0x6f,0xcd,0x58,
|
|
0xea,0xff,0x2d,0x8e,0xf3,0x26,0x15,0x68,0xe3,0x28,0x7e,0x27,0x13,0xe7,0x2a,0xfa,
|
|
0xff,0x53,0xc9,0xe4,0x95,0xc4,0x79,0x98,0x63,0xde,0xe6,0x1c,0x37,0xd1,0xd7,0xcf,
|
|
0x23,0x63,0x9f,0x50,0x01,0x5f,0xa7,0xc1,0xac,0xe7,0x9c,0x45,0xd9,0xf7,0xf9,0x50,
|
|
0x77,0x5c,0x26,0x8a,0x78,0x2f,0x81,0xbd,0x77,0x90,0x97,0xfb,0x29,0x8f,0x87,0x1c,
|
|
0xe7,0xd0,0x23,0xdc,0x3f,0xa8,0xfc,0x37,0xd0,0xa8,0x26,0x5f,0xc7,0x39,0xc6,0x90,
|
|
0x8e,0x7b,0xdc,0x31,0x8a,0x0f,0x6e,0xe5,0x19,0xe5,0x22,0xdc,0xdc,0x47,0xba,0x8c,
|
|
0x70,0x9c,0xeb,0x89,0xa3,0x1b,0xf1,0xad,0x22,0xfc,0x32,0xca,0xe4,0xfb,0xfb,0x48,
|
|
0x0f,0xfb,0xbb,0x5d,0xe2,0x38,0x25,0x38,0xd7,0x47,0xa4,0xa5,0x08,0xe9,0xad,0x4e,
|
|
0x3c,0x35,0xae,0xa7,0x0d,0xb2,0x7f,0x1d,0x69,0xb9,0x8d,0xe3,0x72,0x48,0xd7,0x5b,
|
|
0x70,0x26,0x1d,0xf9,0x22,0xf6,0xef,0xe7,0x3c,0x57,0xb1,0x7f,0xe4,0x6d,0x3c,0xff,
|
|
0x74,0x73,0xcb,0xe7,0x67,0xce,0x97,0x4e,0x59,0x7c,0xce,0xef,0xf2,0xe2,0x5d,0x28,
|
|
0x57,0xca,0x29,0x9b,0xdf,0xf9,0xa7,0x52,0x36,0x3f,0x72,0xce,0xc5,0xe4,0x6f,0x1a,
|
|
0x69,0x29,0x44,0x98,0xb7,0xb8,0xb0,0xc3,0xb9,0xce,0x15,0x88,0xeb,0x35,0xf6,0x5f,
|
|
0x46,0x3a,0x02,0xc3,0xb8,0x3f,0x52,0xae,0xcf,0x12,0xcf,0xcb,0x7d,0xdc,0xb1,0x9f,
|
|
0x71,0x84,0xfb,0x99,0xf8,0x3f,0x1b,0x4d,0xfe,0xe8,0x68,0x7a,0x10,0xdf,0x0b,0x1c,
|
|
0xdf,0x9b,0xb4,0xbc,0x09,0xa3,0xe8,0x48,0x3e,0x27,0x6f,0x03,0xd8,0xbf,0x8e,0xe3,
|
|
0xde,0xe1,0x9a,0x7c,0x4b,0x9a,0x33,0x2f,0x74,0xdf,0x2f,0x7c,0x49,0x39,0xbf,0xc1,
|
|
0x79,0x7e,0x26,0x5f,0x55,0x28,0xa3,0xe7,0x27,0x52,0xe6,0x0f,0x3a,0xce,0xfd,0x94,
|
|
0xcf,0xdb,0x8f,0xba,0xe3,0x92,0xcb,0xa9,0x27,0xc3,0xcc,0xd8,0x1d,0xe7,0x1b,0x42,
|
|
0xf8,0x09,0x1a,0xac,0x7d,0x90,0x6b,0x10,0xcb,0x71,0xcd,0xe8,0xec,0x6e,0xa1,0x13,
|
|
0x5a,0xc5,0xf1,0xdf,0x90,0xde,0x01,0x94,0x47,0x45,0xc2,0x7e,0x45,0x5a,0x63,0xb9,
|
|
0x6e,0xcd,0x29,0xef,0x53,0x89,0xe7,0x09,0x58,0xc8,0x79,0x57,0x52,0x47,0x96,0x8d,
|
|
0x73,0xf3,0xf1,0x26,0xf1,0x7d,0x4b,0x9e,0xaf,0x25,0xed,0x2f,0x70,0x8e,0x7a,0xa4,
|
|
0xf5,0xaa,0xc1,0xee,0x6f,0xdb,0x83,0xed,0xdd,0xb2,0x7a,0x99,0x7a,0x72,0x26,0xe5,
|
|
0x35,0x1b,0xff,0xde,0x9c,0xe7,0x41,0xea,0x5f,0x63,0xce,0x91,0x72,0x37,0x75,0x92,
|
|
0x32,0x6e,0xca,0xb5,0x3e,0xed,0x01,0xae,0x03,0xe5,0xf7,0x82,0x79,0x87,0x42,0x1e,
|
|
0xe7,0xe3,0xff,0x29,0xc7,0xdc,0x44,0x3c,0x1f,0xd1,0x69,0x7d,0x45,0x3c,0xf5,0xb9,
|
|
0x8e,0x93,0x7a,0xb8,0xd7,0xe2,0x6d,0xd2,0x9c,0x49,0xbd,0x39,0x4c,0x1a,0x47,0x4c,
|
|
0x70,0xc7,0x9e,0xc6,0x91,0xcf,0x78,0x8e,0xbb,0x85,0x74,0x5e,0x4b,0xdd,0x3b,0x00,
|
|
0x0d,0xb8,0xe6,0x0f,0xd3,0x36,0x62,0x38,0x6f,0x47,0xca,0xb6,0x0f,0xd7,0xa9,0x28,
|
|
0x79,0xbc,0xec,0x01,0xf7,0xbd,0x4f,0x3c,0xe5,0x30,0x9c,0x63,0xaa,0x72,0x8e,0xd3,
|
|
0x49,0xe7,0x2e,0xc2,0x57,0x21,0xef,0xb7,0x91,0xa7,0x46,0x94,0xd3,0xa9,0x57,0xb8,
|
|
0xd7,0xf9,0x26,0xc2,0x9c,0x4b,0xbc,0x45,0xc8,0x7f,0x0f,0x53,0x9f,0x38,0xd7,0xf9,
|
|
0xc4,0x3f,0x95,0xfd,0x9f,0x71,0x0d,0xa3,0x88,0x7f,0x2b,0xf1,0x5f,0x4d,0xde,0xde,
|
|
0xa1,0x6c,0x3e,0x1d,0xe7,0x8e,0xe3,0x6d,0xe5,0xb8,0xfa,0x5c,0xff,0x97,0x49,0xc3,
|
|
0x59,0x1c,0xbb,0x96,0x74,0x3f,0x40,0xd8,0x43,0xb4,0x99,0x27,0xd8,0xd7,0xe1,0x61,
|
|
0xc7,0x79,0x8c,0xeb,0x74,0x3f,0x71,0xad,0xe6,0xdc,0x3b,0x47,0xb9,0x63,0x98,0xe5,
|
|
0xae,0x75,0x9c,0xbb,0x29,0xcb,0x25,0xd4,0xe7,0x49,0x94,0xf7,0x45,0xd4,0xc3,0x25,
|
|
0x66,0x9c,0x9a,0x7a,0x59,0x8b,0x74,0x44,0xc3,0xd3,0x94,0xfd,0x7a,0xd2,0xff,0x01,
|
|
0xe1,0xc6,0x52,0x3e,0x65,0x38,0xfe,0x45,0xd2,0x55,0x7b,0xbc,0x3b,0x36,0xd9,0xf2,
|
|
0x3e,0x77,0x5c,0x72,0x3d,0xe1,0x32,0xc8,0xeb,0x12,0xfa,0x81,0x8b,0xa9,0x87,0x43,
|
|
0x08,0xf3,0x09,0xee,0x2a,0xe4,0x6b,0x15,0x65,0x58,0x87,0x32,0xbf,0x0c,0x7a,0xc0,
|
|
0x78,0x68,0xcf,0xf5,0x58,0x34,0xc2,0x1d,0x2f,0x2d,0x4e,0x7b,0xfc,0x81,0xeb,0x5c,
|
|
0x93,0x32,0xfe,0x09,0xf6,0x52,0x6e,0x87,0xa1,0x32,0xfd,0xc2,0x8b,0xb4,0xcd,0x4f,
|
|
0xf0,0x9b,0xc7,0x79,0x5e,0xe0,0xda,0x7d,0x4e,0x19,0xb6,0x34,0xf5,0x96,0xb4,0x6d,
|
|
0x87,0x36,0xe4,0xfb,0x11,0xce,0x19,0x45,0x3d,0xb8,0x02,0x32,0x38,0xf7,0x54,0xb8,
|
|
0x5c,0xe3,0xd8,0xf7,0x72,0x7d,0xaf,0xa0,0x8c,0xef,0x84,0xaf,0xa1,0x15,0xd7,0x76,
|
|
0x2b,0xdc,0x45,0xfa,0xc6,0x52,0xae,0xc3,0xc8,0xcf,0x19,0x94,0x5b,0x05,0xea,0x68,
|
|
0x7f,0xca,0xad,0x2a,0x65,0x51,0x81,0xb2,0xbb,0x6b,0xb8,0xfb,0xcc,0xd8,0x0c,0x9a,
|
|
0x42,0x6b,0x93,0xe6,0xab,0xdd,0xf7,0x6f,0x77,0xc0,0x9d,0x90,0x41,0x19,0x8e,0x82,
|
|
0x25,0xd7,0xba,0x75,0x3a,0x86,0xf6,0xde,0x00,0x06,0x91,0xa7,0x10,0x75,0x6f,0x0f,
|
|
0xe5,0x7c,0xf5,0x68,0x97,0x0e,0xd4,0xa1,0xa2,0x94,0xd3,0x7d,0x10,0xa0,0x9c,0xd3,
|
|
0x61,0x3d,0xfd,0x47,0x3e,0xfa,0xa1,0x97,0xc6,0xbb,0x79,0xdf,0x46,0x1e,0x7f,0xa1,
|
|
0x5c,0x6a,0x93,0xf7,0xab,0x48,0xf7,0x57,0x99,0x41,0xe7,0x34,0x8e,0xad,0xc8,0x35,
|
|
0x99,0x4b,0x9e,0xaf,0x80,0x91,0x94,0x41,0x96,0x51,0x58,0x41,0xfe,0x0f,0x5d,0xe0,
|
|
0xe6,0xbf,0x1d,0x4c,0x82,0xad,0x2a,0xff,0x39,0xd0,0x88,0xb6,0x7b,0x21,0x74,0xbb,
|
|
0x98,0xb2,0xe4,0xda,0xad,0xe3,0x1a,0x7d,0x08,0xbd,0xa9,0x77,0xcf,0xc3,0x46,0xce,
|
|
0x71,0x3e,0x65,0x92,0x4f,0xe5,0xd3,0x45,0x65,0x94,0xc2,0xf5,0x7e,0x9d,0xb6,0x76,
|
|
0x26,0x6d,0xf7,0x02,0x68,0xdf,0xc3,0xbd,0x9e,0xa6,0xaf,0x2d,0x0d,0xed,0x7b,0xb9,
|
|
0xe3,0xf3,0xa6,0x7f,0x31,0x75,0x7f,0x13,0xe5,0xb7,0x5a,0x65,0x58,0x26,0xdb,0x2d,
|
|
0xc7,0x67,0xe8,0x87,0x52,0x29,0xcb,0x19,0x83,0xdc,0x3a,0x30,0x90,0x32,0x8d,0xa2,
|
|
0xee,0xd6,0x86,0xb3,0xa8,0x0f,0x65,0x87,0xba,0xf5,0x62,0x13,0x7c,0x03,0xcd,0x09,
|
|
0x9f,0x01,0x6f,0x51,0xee,0xb3,0x54,0xa6,0xd7,0x52,0x3f,0x3a,0x5d,0xe7,0x96,0x6d,
|
|
0x3d,0x95,0xe9,0x05,0xd4,0xcd,0xbd,0x70,0x35,0xf7,0x95,0x06,0x94,0xe5,0x4d,0x2a,
|
|
0xd3,0xc5,0xb7,0xba,0x75,0x68,0xf5,0xad,0x6e,0xf9,0x9a,0x7e,0x74,0xcf,0xad,0x6e,
|
|
0x39,0xdf,0x7a,0x9b,0x5b,0xce,0x35,0x29,0xe7,0x41,0x94,0xf3,0x24,0xda,0xcc,0x50,
|
|
0xfa,0x85,0x11,0xf7,0xb9,0x65,0x6e,0xea,0xe2,0xa6,0xfb,0xdd,0xb2,0x2f,0xf0,0x80,
|
|
0x5b,0xfe,0xc5,0x1f,0x72,0xef,0x6f,0xcd,0x2b,0x07,0x9d,0x46,0xf0,0x7e,0x72,0xd0,
|
|
0x79,0xa4,0x36,0x7d,0x48,0x06,0x71,0x42,0xb3,0x0b,0x82,0xce,0xda,0x4b,0x82,0xce,
|
|
0xfa,0xeb,0x83,0x4e,0x43,0xc2,0xdd,0xf9,0x98,0xfb,0xec,0xed,0xd1,0x5b,0xda,0xf7,
|
|
0x18,0x7e,0x9e,0xbf,0x37,0x0f,0xc5,0xd3,0x21,0x21,0xd2,0x15,0x72,0xb5,0x87,0xb4,
|
|
0x0f,0x5c,0x6f,0xf9,0xf7,0x83,0x0f,0xe1,0x45,0xf8,0x1a,0xe6,0xc1,0xd6,0x90,0x3b,
|
|
0x67,0xd5,0xcc,0x55,0x7d,0x0f,0x36,0x41,0x0e,0x7c,0x0c,0x3b,0x61,0x57,0xc8,0x9d,
|
|
0x03,0xfc,0x05,0xba,0x34,0xe4,0xea,0x32,0xe9,0xab,0x96,0xdf,0xab,0xf2,0x5f,0xab,
|
|
0x78,0x8d,0xce,0x97,0xbe,0xaa,0x39,0xb1,0xaf,0x6a,0x5e,0xec,0xab,0x3a,0xdf,0xab,
|
|
0x3a,0xa7,0xd1,0xf7,0xa5,0x1f,0x48,0x37,0x4a,0x3f,0x94,0x7e,0x24,0xdd,0x24,0xcd,
|
|
0x91,0x7e,0x22,0xdd,0x22,0xfd,0x54,0xba,0x4d,0xba,0x5d,0xba,0x43,0xfa,0xb9,0x74,
|
|
0xa7,0xd4,0x4b,0xfb,0x2e,0x2b,0x1d,0x0b,0x94,0xde,0xc5,0x3a,0xdf,0x62,0xc5,0xb3,
|
|
0x58,0xf9,0x31,0xe7,0x1e,0x18,0xe5,0x72,0xad,0x8f,0xeb,0x7d,0x8c,0xf4,0x71,0x8d,
|
|
0x8f,0x1b,0x7c,0x5c,0xed,0xe3,0x49,0x1f,0x4f,0xfb,0xb8,0xd1,0xc7,0x18,0x1f,0x37,
|
|
0xf9,0xb8,0xd9,0xc7,0x1d,0xe2,0x76,0x71,0xa7,0x18,0x27,0x1e,0x10,0x77,0x89,0x69,
|
|
0x3e,0x66,0xf8,0x98,0xe3,0x63,0x96,0x8f,0x97,0xc5,0x2b,0x3e,0xbc,0xb5,0x6b,0xec,
|
|
0x35,0x6c,0x6c,0x16,0xf9,0x58,0x67,0x61,0xaf,0x75,0xf3,0xbc,0x8f,0x15,0x62,0xb9,
|
|
0x58,0x29,0xbc,0xb5,0x73,0x56,0x8b,0x37,0xc4,0x9b,0x62,0xad,0x8f,0x66,0xc2,0x5e,
|
|
0x8b,0xe7,0x58,0xf6,0xf7,0xf3,0xb0,0x37,0xcd,0xc3,0xbe,0x22,0x0f,0xfb,0xf2,0x3c,
|
|
0xec,0x2b,0xf3,0xb0,0xaf,0x3d,0x01,0x7b,0xb3,0xff,0x60,0x7f,0xcb,0x87,0xb7,0xaf,
|
|
0x9a,0x65,0x8f,0xb3,0xec,0x59,0x79,0xc4,0x65,0xb4,0xb2,0x8e,0xab,0xac,0x63,0x8c,
|
|
0xc6,0x4b,0xb3,0xa4,0xcd,0xa4,0x26,0x7c,0x15,0x85,0xaf,0xa2,0xf0,0x55,0x14,0xbe,
|
|
0x8a,0xc2,0x57,0x51,0xf8,0x2a,0x0a,0x5f,0x55,0xe1,0xab,0x6a,0x7f,0x55,0xed,0xaf,
|
|
0xaa,0xfd,0xd5,0x14,0x4f,0x35,0xed,0x8f,0xb3,0xfc,0xb2,0x14,0x77,0x35,0x69,0x9c,
|
|
0xd4,0xf8,0x27,0xcb,0x3f,0x59,0xfe,0xc9,0xda,0x97,0xac,0xfd,0xa9,0xf2,0x4f,0x95,
|
|
0x3b,0x4d,0xe1,0xd3,0xe4,0x9f,0xa6,0xf0,0x69,0xda,0x5f,0x43,0xfe,0x35,0xe4,0xae,
|
|
0x29,0x4d,0xd7,0x71,0xe9,0x72,0xd7,0x92,0xbb,0x96,0xdc,0x0d,0xe4,0x6e,0xa0,0xe3,
|
|
0x1b,0x28,0xde,0x06,0xd6,0xfe,0x66,0x52,0x93,0xdf,0x4c,0x85,0xcb,0xd4,0xfe,0x4c,
|
|
0xed,0xcf,0xd4,0xfe,0x86,0xaa,0xa3,0x0d,0x15,0x6f,0x43,0x85,0x6f,0xa8,0x78,0x8d,
|
|
0x36,0x92,0x66,0x49,0x9b,0x49,0x9b,0x6b,0x5f,0x35,0x69,0x9c,0x34,0x5e,0x9a,0x25,
|
|
0x6d,0x26,0x6d,0x2e,0x3f,0xbb,0xec,0xb3,0xac,0x32,0xf6,0x68,0x66,0xd5,0xa1,0xc6,
|
|
0x0a,0xdf,0x58,0xe1,0x1b,0x2b,0x7c,0x63,0x85,0x69,0xac,0xf0,0x8d,0x15,0xbe,0x89,
|
|
0xc2,0x37,0xd1,0xfe,0x26,0xda,0xdf,0x44,0xfb,0x9b,0x5b,0xf5,0xd6,0xab,0xb3,0xf1,
|
|
0x56,0xda,0x9a,0x5b,0x75,0xd6,0x90,0x00,0xd9,0x90,0x28,0x6d,0x26,0x35,0xf3,0xa6,
|
|
0xce,0x43,0xdb,0xc8,0xde,0xd2,0xb2,0x9f,0x6f,0xd9,0x5b,0x59,0xf6,0xd6,0x96,0xbd,
|
|
0x8d,0xe2,0xf1,0xda,0x46,0xa2,0x65,0x4f,0xca,0xa3,0x2d,0x35,0x3e,0x4e,0xbb,0x4a,
|
|
0x94,0x26,0xf9,0xda,0x53,0xe3,0x3c,0xda,0x55,0xa2,0x34,0xc9,0xd7,0x9e,0x1a,0xe7,
|
|
0xd1,0xae,0x12,0xa5,0x49,0xbe,0xf6,0xd5,0xf8,0x18,0xed,0xec,0x58,0xf5,0x30,0xaf,
|
|
0x7a,0x77,0xbc,0xfa,0x95,0x57,0x3d,0xaa,0x64,0xd5,0x99,0xc6,0x4a,0x5f,0x63,0xa5,
|
|
0xcf,0xae,0x1f,0x8d,0x8f,0x51,0x4f,0x9a,0x59,0xe5,0xef,0x95,0x7d,0x92,0xaf,0x1e,
|
|
0x34,0x3e,0x46,0x7d,0x38,0x5e,0xdf,0x17,0x9f,0xc7,0xb5,0x6b,0x72,0x82,0x7d,0x5f,
|
|
0x93,0x13,0xec,0xf3,0x9a,0x58,0xd7,0xe0,0x64,0xfa,0xb4,0x93,0xed,0xcb,0xe2,0x7f,
|
|
0x43,0x9f,0xf6,0x47,0xf5,0x65,0xfe,0xbe,0xeb,0x44,0xfb,0xa8,0x13,0xe9,0x93,0x9a,
|
|
0x9c,0x40,0x5f,0x74,0x22,0x7d,0x4f,0x93,0x3c,0xfa,0x9c,0xec,0x13,0xec,0x6b,0x9a,
|
|
0x1c,0xa7,0xbe,0xf8,0xeb,0xc5,0xb1,0xae,0x7f,0x55,0xb9,0x93,0xad,0xeb,0x6b,0xdc,
|
|
0x29,0x72,0xa7,0xc8,0x7d,0xac,0x72,0xca,0x3a,0x46,0x7e,0xfc,0xe9,0xcb,0x88,0x3a,
|
|
0xd2,0xa7,0x19,0x7b,0x2b,0xcb,0xee,0xf5,0x69,0x35,0xd4,0x4e,0x6a,0xe8,0xb8,0x74,
|
|
0xb9,0xd3,0xe5,0xae,0x25,0x77,0x2d,0xb9,0x93,0xe5,0x4e,0x96,0x3b,0x45,0xee,0x14,
|
|
0xab,0xbc,0x9a,0x59,0xe5,0x56,0x4d,0xee,0x6a,0x56,0x39,0x36,0xb3,0xca,0x33,0x55,
|
|
0xee,0x54,0xb9,0xd3,0xe4,0x4e,0xb3,0xe2,0xaf,0x26,0x8d,0x93,0xc6,0xfb,0xca,0x28,
|
|
0x51,0xe9,0x49,0x54,0x3c,0x89,0x3a,0x3e,0xf1,0x5f,0x90,0xbf,0xe3,0x1d,0x6f,0xd7,
|
|
0xa9,0x26,0xd6,0x73,0x4b,0x5e,0x7d,0x49,0x5e,0xf1,0xf9,0x9f,0x77,0x4c,0x1f,0xde,
|
|
0xc2,0xd2,0x2a,0x56,0x9b,0xac,0x62,0xf5,0x65,0xc7,0xb2,0x67,0x59,0x7d,0x63,0x96,
|
|
0xd5,0x3e,0xaa,0x59,0xf6,0x38,0xcb,0x1e,0x7f,0x8c,0x3e,0xd2,0xb3,0xc7,0x59,0x75,
|
|
0x3e,0xce,0x7a,0x0e,0x49,0xb6,0xc2,0x26,0x5b,0xfd,0x6a,0xb2,0x75,0xcd,0x92,0xad,
|
|
0x78,0x8e,0x65,0xaf,0x66,0xd9,0xb3,0x7c,0xf6,0x54,0xeb,0xfc,0x7e,0x7b,0x96,0x75,
|
|
0xed,0xe2,0xf2,0xb0,0x57,0xb3,0xae,0x7f,0x96,0xef,0x9a,0xd9,0xf6,0x2c,0x9f,0x3d,
|
|
0xcd,0xaa,0x83,0x69,0x56,0x19,0xda,0xf6,0x1a,0x56,0x5e,0x8e,0x65,0xb7,0xc3,0x34,
|
|
0xb7,0xfa,0xfb,0x2c,0xab,0xcf,0xcf,0xcb,0xde,0xcc,0xba,0x0f,0x64,0x59,0xf6,0xe6,
|
|
0x96,0xbd,0x99,0x75,0x4f,0xc8,0xf2,0xd9,0x33,0xad,0xf4,0x64,0x5a,0xf1,0x34,0xb2,
|
|
0xca,0xa7,0x91,0xd5,0xbe,0x1a,0x59,0xf9,0xf5,0xee,0x0f,0xd5,0x8e,0x61,0x8f,0xb7,
|
|
0x8e,0x8d,0xf7,0xf5,0x93,0x71,0x3e,0xfb,0xb1,0xea,0x51,0x96,0x65,0x6f,0xee,0xbb,
|
|
0x3f,0xdb,0xf7,0x1b,0x7f,0x7d,0xb4,0xef,0x3b,0xde,0xbd,0xda,0xbe,0x47,0x35,0xf1,
|
|
0xdd,0x97,0xe2,0x7c,0xf6,0x66,0xd6,0xfd,0x2a,0x2b,0x0f,0x7b,0x33,0xab,0xaf,0x6f,
|
|
0x6e,0xd9,0x9b,0x59,0x69,0xcd,0xf2,0xd9,0x2b,0x5b,0x7d,0x50,0x15,0xab,0xbe,0x55,
|
|
0xb1,0xe2,0xac,0xe2,0x0b,0x13,0x6f,0xf9,0x67,0x59,0xfe,0x59,0x56,0x1f,0x97,0xe5,
|
|
0xfb,0x3d,0x66,0xfb,0x37,0xb3,0xfa,0x91,0x66,0x56,0xbb,0x68,0x6e,0xd5,0xff,0xe6,
|
|
0x56,0x1d,0xb6,0x7f,0x87,0xd8,0xcf,0x8c,0xcd,0x7d,0xf7,0x5e,0xfb,0x7e,0xdc,0xfc,
|
|
0x18,0x79,0x6d,0x6e,0xd5,0xa5,0xe6,0x56,0xd9,0x36,0xf7,0xd5,0x37,0xbb,0x8e,0xa5,
|
|
0x5b,0xe1,0x1b,0x1e,0xe3,0x77,0x8b,0xfd,0x5c,0x61,0xa7,0x33,0xcb,0x0a,0x9f,0xe5,
|
|
0xf3,0x6f,0xec,0x7b,0xa6,0x8b,0xb3,0xf2,0x51,0xcd,0x57,0xaf,0x9a,0x5b,0xcf,0x4b,
|
|
0xcd,0xad,0x67,0xcb,0xe6,0xbe,0xf8,0xed,0xb6,0x99,0xea,0xeb,0x8b,0xe2,0x7d,0x69,
|
|
0xf6,0xee,0x37,0x8d,0xf4,0xee,0x24,0xd3,0xb2,0x57,0x92,0xdd,0x7b,0x86,0xf2,0x9e,
|
|
0xe1,0xbd,0xdf,0x1f,0x76,0x3b,0xa8,0x6e,0xc5,0xe3,0x95,0x93,0x77,0x0f,0x6a,0x6a,
|
|
0xf9,0x37,0xb2,0x9e,0x35,0x9a,0x6a,0x7f,0x23,0x2b,0xad,0x8d,0xac,0x7a,0xe0,0xd9,
|
|
0x73,0xff,0x8e,0x8a,0x2f,0x2d,0xc6,0xcf,0x1f,0x9f,0xf1,0xf3,0xc7,0xe9,0xb5,0x75,
|
|
0xb3,0xcf,0xb3,0x57,0xb2,0xe2,0x49,0xd4,0x7b,0x0e,0xcf,0xaf,0x9a,0x99,0x33,0x9d,
|
|
0xe0,0x38,0xc1,0x04,0xf7,0x5b,0xbd,0xda,0xd6,0xba,0x0b,0xa7,0xe0,0x77,0x6a,0xc2,
|
|
0xb1,0xd7,0x79,0x28,0xc9,0x09,0x4a,0x40,0x67,0xc7,0xc5,0x5b,0x23,0xe1,0x5a,0xb8,
|
|
0xce,0xec,0xe7,0xb8,0x52,0x50,0x14,0x8a,0x41,0x7e,0x28,0x90,0x70,0xe4,0xdb,0xe4,
|
|
0x82,0x50,0x08,0x0a,0x43,0x11,0xf3,0x0d,0x91,0x99,0x03,0x6e,0xad,0x05,0x91,0x97,
|
|
0x7a,0xe7,0x33,0x78,0x69,0x8f,0x57,0xba,0x6b,0x59,0x6b,0x47,0x98,0xf4,0xe5,0x95,
|
|
0xa6,0x58,0x33,0x86,0x6b,0xe6,0xae,0x6b,0x9d,0x87,0x38,0xc7,0xfd,0x06,0xbc,0x9e,
|
|
0xbe,0x4b,0xbc,0xc4,0xac,0x0b,0x69,0xd6,0x86,0x85,0x0c,0xa5,0xa9,0x85,0x9e,0x09,
|
|
0x5b,0x58,0xbf,0x8f,0xbd,0xdf,0xc6,0xde,0xef,0x62,0xef,0x59,0xd2,0xfb,0x6d,0xec,
|
|
0x3d,0x4f,0x7a,0xbf,0x8f,0xbd,0x67,0x4a,0xef,0x37,0x72,0x86,0xf5,0x9b,0xf9,0x02,
|
|
0xb9,0x8d,0x96,0x8f,0x3a,0x7a,0x6d,0x6c,0x7b,0x8d,0x6c,0xff,0x5a,0xd9,0xfe,0x35,
|
|
0xb3,0xfd,0x6b,0x67,0xe7,0xa5,0x95,0x44,0x65,0x1f,0xe7,0x8a,0x2a,0x3e,0xaa,0xfa,
|
|
0xa8,0xe6,0x23,0xce,0x47,0xbc,0x8f,0xea,0x22,0x41,0x24,0x8a,0x24,0x91,0xec,0x23,
|
|
0xc5,0x47,0xaa,0x8f,0x34,0x1f,0x35,0x7c,0xd4,0xf4,0x91,0xee,0xa3,0x96,0x8f,0x06,
|
|
0x3e,0x32,0x7d,0x34,0xf4,0xd1,0xc8,0x47,0x96,0x8f,0xc6,0x3e,0x9a,0xf8,0x68,0x2a,
|
|
0x9a,0x1d,0xe3,0x37,0x78,0x73,0xab,0xdd,0xb6,0xcd,0xc3,0x7e,0x61,0x1e,0xf6,0x76,
|
|
0x79,0xd8,0x3d,0x35,0x6d,0xa3,0x82,0xe3,0xb6,0x01,0xaf,0x8e,0x9b,0xb6,0x50,0xc9,
|
|
0x6a,0xc3,0x5e,0xbb,0xa8,0xa6,0xb6,0x11,0xaf,0xb5,0x48,0x4e,0x74,0xed,0x14,0xaf,
|
|
0x1f,0xa9,0xa3,0xf6,0x54,0x4f,0xed,0x32,0xe3,0x4f,0xfc,0xee,0xb9,0x93,0xda,0xb1,
|
|
0xe9,0x53,0x2e,0x53,0x7f,0xd1,0xe5,0x4f,0xfc,0x1e,0xda,0xf4,0x39,0x23,0xd4,0xef,
|
|
0x5c,0x0f,0x63,0x29,0xd8,0x9b,0xce,0x75,0xfb,0x59,0xaf,0xef,0x33,0x7d,0xd7,0x8f,
|
|
0x9a,0x73,0x3e,0x45,0xf3,0x65,0x9f,0xd2,0xdc,0x58,0x33,0x27,0x7c,0x9b,0xe6,0x58,
|
|
0x7f,0xae,0x39,0x92,0x87,0x13,0xfe,0x7e,0xf3,0xea,0x0f,0x68,0xae,0xa7,0x99,0x23,
|
|
0xda,0xa5,0xd8,0x3f,0xeb,0xdb,0xc3,0xc7,0xc9,0xce,0x13,0xf0,0x9c,0xf5,0x77,0xd1,
|
|
0x9e,0x46,0x9f,0x32,0xf3,0xd7,0xf0,0x08,0x9e,0xe3,0xae,0x89,0x72,0x57,0x79,0x77,
|
|
0x4d,0x94,0x7b,0x60,0x32,0x7e,0xab,0x61,0x6d,0xd0,0x71,0xde,0x0d,0xba,0x7f,0xbf,
|
|
0x65,0x12,0xda,0x16,0x9e,0x30,0x6b,0xa3,0x4f,0xe7,0x78,0xf4,0x49,0x68,0x0f,0x1d,
|
|
0xcc,0xda,0xe5,0x67,0x51,0xb7,0xd1,0xcb,0x60,0x1a,0x5c,0x0e,0xdd,0xa0,0x0b,0x3c,
|
|
0x14,0x74,0xd7,0xff,0x79,0xd8,0xac,0xf1,0x0e,0x37,0xc2,0xb3,0x66,0x3d,0x74,0xf3,
|
|
0x37,0x43,0x20,0x72,0x73,0xc0,0xb9,0xf3,0x19,0xf2,0x82,0x3d,0x64,0xec,0x68,0x14,
|
|
0x6a,0xfe,0x4e,0xcc,0x50,0xf3,0x37,0x49,0x82,0x6e,0x9d,0xbe,0x06,0xcd,0x87,0xff,
|
|
0x75,0xe8,0xf5,0x30,0x12,0xa6,0xc2,0xd3,0x26,0x5e,0xd2,0xf4,0x0c,0x3a,0xce,0x84,
|
|
0xa5,0x53,0x18,0x8f,0x4e,0x81,0xc7,0xe1,0x01,0x58,0xc2,0xf9,0x97,0xc2,0x32,0xc8,
|
|
0x4f,0x1c,0x65,0x60,0x52,0xd1,0x80,0xf3,0x32,0x3c,0x24,0x7d,0x4a,0x9a,0x58,0x2c,
|
|
0xe0,0x54,0x82,0x24,0x69,0x93,0x12,0x01,0xa7,0x5e,0x09,0x57,0x3b,0xc0,0x82,0x92,
|
|
0x84,0x2b,0xe9,0xea,0x4c,0xe9,0x42,0x98,0x5f,0x2a,0xe0,0xcc,0x80,0x05,0xd2,0xd4,
|
|
0xd3,0x03,0x4e,0x02,0x74,0x78,0x37,0xe0,0xf4,0x80,0x8b,0x7c,0xda,0xdf,0xb2,0x0f,
|
|
0xb0,0xec,0xd9,0x96,0x7d,0xa0,0x65,0x1f,0x04,0x0b,0x64,0x7f,0x59,0xba,0xc0,0x8a,
|
|
0xeb,0x65,0xcb,0xbe,0xc0,0x8a,0xf7,0x65,0xcb,0xfe,0x4f,0x5b,0xd3,0xe1,0xaf,0x90,
|
|
0x9f,0x7f,0x52,0x5e,0xfe,0xe8,0x6b,0xe3,0xe5,0xa5,0x89,0x95,0x76,0x7f,0x9a,0x4f,
|
|
0x36,0xbd,0x3d,0x8f,0x93,0xce,0x7f,0x7b,0x99,0x67,0x1e,0x23,0x2f,0xc7,0xcb,0xc3,
|
|
0x7f,0x4a,0xff,0xff,0x3a,0xed,0xc7,0xba,0x06,0xad,0xfe,0x62,0x69,0x0e,0xf7,0xa7,
|
|
0xe1,0xfc,0x84,0xf3,0x13,0xce,0xcf,0x3f,0x2d,0x3f,0x89,0x3c,0x2f,0xd7,0x08,0xba,
|
|
0xeb,0xf0,0xde,0xad,0xb5,0x31,0xef,0xd5,0x7a,0xb9,0xf7,0x69,0x7d,0xdc,0x07,0xb4,
|
|
0x66,0xed,0x83,0xf0,0x10,0x3c,0x0c,0x8f,0xc0,0xa3,0x5a,0xe7,0x75,0xb2,0xd6,0x91,
|
|
0x7d,0x40,0x7f,0xfb,0xee,0x49,0xad,0x2f,0xfb,0x34,0x3c,0x63,0xd6,0x18,0xd4,0xba,
|
|
0xaf,0xd1,0x15,0xdc,0xb5,0x81,0xed,0xbf,0xe5,0x64,0xd6,0xe2,0x7e,0x49,0x6b,0xf6,
|
|
0xce,0xd7,0xfa,0xb9,0xe6,0x6f,0xea,0xbd,0xa2,0xbf,0xe7,0xbc,0x10,0x16,0x69,0x0d,
|
|
0xee,0x25,0xd6,0xdf,0xda,0x7b,0x0d,0x5e,0xd7,0x5a,0xb7,0xde,0xdf,0x7a,0x5a,0xa9,
|
|
0xb5,0x68,0x83,0x15,0xdc,0x78,0xe7,0x2b,0xae,0xe5,0x3a,0x6e,0x49,0x44,0x38,0x9f,
|
|
0xe1,0x7c,0x86,0xf3,0xf9,0x57,0xce,0x67,0x0e,0x7c,0x1c,0x71,0xe2,0xef,0xf9,0xfe,
|
|
0xf2,0xe1,0x22,0x09,0x07,0x49,0x91,0xee,0xdf,0xee,0x4c,0x89,0x74,0xff,0xa6,0xa6,
|
|
0xf9,0xbb,0x99,0xe6,0x6f,0x65,0x9a,0xbf,0x87,0x69,0xfe,0x86,0x67,0x6d,0xa8,0x13,
|
|
0xe9,0xfe,0x3d,0xcc,0xfa,0x90,0x01,0x0d,0x20,0x33,0xd2,0xfd,0x9b,0x96,0x8d,0x20,
|
|
0x0b,0x1a,0x47,0xba,0x7f,0xd3,0xb2,0x69,0xa4,0xfb,0xb7,0x2c,0xcd,0xdf,0xc7,0x3c,
|
|
0x1f,0x6e,0x79,0xda,0xfd,0xdb,0x9c,0xe6,0xef,0x82,0x5e,0x14,0xe9,0xfe,0x1d,0xcd,
|
|
0x19,0xf0,0x4e,0xe4,0xc9,0xa5,0xc1,0x3b,0x7f,0x83,0xff,0x70,0xde,0xe6,0x3a,0xf7,
|
|
0x5d,0x3a,0x5f,0x3b,0xe8,0x0c,0xd3,0xa1,0x0d,0xe9,0x98,0x15,0x79,0xe4,0xbd,0x7e,
|
|
0x35,0xbd,0x73,0x6f,0xaa,0x77,0xec,0x71,0xd6,0x1c,0x8f,0x86,0xbe,0x39,0x32,0xc9,
|
|
0x7a,0x2f,0xde,0x40,0xef,0xd7,0x33,0xad,0xb9,0x13,0xde,0xfb,0xff,0x78,0xbd,0xbb,
|
|
0x4f,0xd3,0x3b,0x75,0xf3,0xde,0xbc,0xbf,0xe6,0x35,0x4f,0x81,0x01,0xd6,0x79,0x9b,
|
|
0xf8,0xc6,0xea,0x8e,0x77,0x2e,0xff,0x79,0xd2,0xac,0x39,0x55,0xf6,0x38,0xa8,0x7d,
|
|
0xbc,0x7d,0xac,0x7d,0xcc,0xcb,0x79,0xa4,0xa5,0x86,0x6f,0xec,0xf0,0x64,0xd2,0x62,
|
|
0xe7,0x77,0x4a,0xd4,0xff,0x2f,0xe3,0x26,0x79,0x94,0xf3,0x1f,0x51,0xc6,0xc7,0xbb,
|
|
0x96,0x7f,0xc4,0x39,0xbc,0xf5,0x5c,0x13,0xf4,0xde,0x3f,0x51,0x9a,0x24,0x4d,0x96,
|
|
0xa6,0x48,0x53,0xa5,0x69,0xd2,0x1a,0xd2,0x9a,0xd2,0x74,0x69,0x65,0x3d,0xb7,0x79,
|
|
0xeb,0x2a,0x65,0x5a,0xf6,0x86,0x96,0xbd,0x91,0x65,0xcf,0xb2,0xec,0x8d,0x2d,0x7b,
|
|
0x13,0xcb,0xde,0xd4,0xb2,0x37,0xb3,0xec,0xcd,0x2d,0x7b,0x0b,0xcb,0x7e,0x9e,0x65,
|
|
0x6f,0x69,0xd9,0xcf,0xb7,0xec,0xad,0x2c,0x7b,0x6b,0xcb,0xde,0xc6,0xb2,0x5f,0x60,
|
|
0xd9,0xdb,0x5a,0xf6,0x0b,0x2d,0x7b,0x3b,0xcb,0xde,0xde,0xb2,0x77,0xb0,0xec,0x17,
|
|
0x59,0xf6,0x8e,0x96,0xfd,0x62,0xd9,0xcd,0x58,0xa5,0x89,0xdf,0x8c,0x57,0x36,0xd4,
|
|
0x79,0xbd,0xe7,0xde,0x0e,0x0a,0xf7,0x67,0x3d,0x0f,0x37,0xf5,0x7d,0xd7,0xdd,0x56,
|
|
0xe7,0x6b,0x2b,0xbc,0xef,0x98,0xbd,0x63,0x1b,0x2a,0xac,0xa7,0xde,0x1a,0xe5,0x17,
|
|
0xc8,0x6e,0xd2,0x64,0xd6,0x6c,0x6c,0xa1,0xb1,0x0a,0x6f,0xbc,0xc2,0xac,0x7b,0xda,
|
|
0xa1,0x93,0xe3,0xbc,0xd5,0xf6,0xc8,0x9a,0x28,0x66,0x4d,0xa8,0x33,0x48,0xc8,0xb6,
|
|
0x5b,0xdc,0x35,0xf1,0x9e,0xc4,0x5d,0x8e,0x87,0xf1,0xf2,0x03,0xdd,0x6f,0x0e,0x5b,
|
|
0x12,0xe9,0xed,0x9d,0x1d,0xe7,0x0e,0x32,0x33,0x13,0xf7,0x59,0xe6,0x1b,0xcc,0xeb,
|
|
0xdc,0x35,0x4b,0xa7,0xdd,0xee,0x38,0xfb,0xc8,0x48,0x3a,0x99,0x2b,0xc9,0xc3,0xf9,
|
|
0x44,0xe2,0x6f,0xd7,0xdd,0x2d,0x04,0xb3,0xce,0x54,0xf3,0x09,0xee,0xda,0x4e,0x66,
|
|
0x9d,0x27,0xb3,0xbe,0x53,0x74,0x77,0x77,0x2d,0xd0,0xb6,0x84,0x1b,0xc5,0x43,0xfa,
|
|
0x35,0x3c,0xa4,0xe7,0xe3,0xd8,0x91,0xfd,0xdd,0x75,0xa5,0x72,0xd7,0x56,0x22,0xde,
|
|
0x41,0x9c,0xe3,0x25,0x0a,0xab,0xe5,0x5d,0xee,0x75,0xaa,0xd6,0xcb,0xbd,0x4e,0xc6,
|
|
0x6e,0xe2,0xf5,0xec,0xb7,0x5b,0xf6,0x5b,0x3a,0x1d,0xb1,0x9b,0x75,0x1e,0x3c,0xbb,
|
|
0x39,0x97,0x67,0xdf,0x30,0xf4,0x88,0xfd,0xe3,0x0b,0x8e,0xd8,0x3b,0xf4,0x70,0xed,
|
|
0xf7,0x93,0xcf,0xbd,0x6d,0x4f,0xfc,0xfe,0x57,0x97,0xf3,0xd7,0x34,0xeb,0x66,0x41,
|
|
0x85,0x40,0xd0,0xe9,0xd2,0xca,0xfd,0x1e,0xf0,0x15,0x08,0x72,0xc1,0xae,0x81,0x49,
|
|
0xad,0xdd,0xef,0x03,0xdf,0x81,0x47,0x53,0x4c,0x5f,0x10,0xcc,0xfd,0x56,0xf0,0x42,
|
|
0xb8,0x1c,0x86,0x99,0x6f,0x6f,0x43,0x41,0x67,0x01,0xfb,0x7a,0xb5,0x71,0xcb,0xb9,
|
|
0x05,0xee,0xfb,0xd1,0x27,0xcd,0xb7,0xb9,0xc4,0xfd,0x5c,0x1b,0xf7,0x5b,0xbb,0xcd,
|
|
0x77,0x05,0x73,0xd7,0xdd,0x8d,0x20,0xed,0x9b,0x09,0x5f,0x1b,0x6d,0x7c,0x81,0x5b,
|
|
0x5e,0xc3,0x4c,0x7e,0x52,0xdd,0xef,0xef,0xbc,0xef,0x10,0xcd,0x77,0x78,0x21,0xf2,
|
|
0x13,0xd5,0xd6,0xfd,0x56,0xb7,0x59,0x5b,0xf7,0xdb,0xc4,0x8b,0x61,0x30,0x5c,0x07,
|
|
0x37,0x58,0x54,0xcb,0x1f,0x74,0xb2,0x29,0xbb,0x55,0xd8,0x37,0x43,0xf7,0x02,0x41,
|
|
0x67,0x37,0xba,0xdf,0xc4,0xc1,0x75,0x7a,0x14,0x6a,0x42,0x53,0xb8,0xc2,0xac,0xdf,
|
|
0x04,0xdf,0x41,0x51,0xae,0x55,0x5b,0xe8,0x0e,0x37,0x0a,0xf3,0xdd,0xdf,0x74,0x98,
|
|
0x03,0xcb,0xe0,0x94,0x0e,0xee,0xf7,0x90,0xa7,0xa2,0x6d,0xd0,0x21,0xed,0xdd,0x6f,
|
|
0x39,0xbf,0xa2,0xfe,0xbc,0x8d,0xdf,0x37,0x50,0x08,0xfb,0x6d,0x68,0x12,0x9a,0x08,
|
|
0xcf,0xc1,0xf6,0x92,0x41,0xe7,0x6b,0xf4,0x7b,0x88,0xea,0xe8,0xd6,0xd5,0x0a,0xe6,
|
|
0xfb,0x41,0x98,0x7a,0x4a,0xd0,0xd9,0x05,0x5f,0x62,0x2f,0x4d,0x43,0xaa,0x04,0x1b,
|
|
0xb1,0xf7,0x44,0xbf,0xe2,0x62,0x1d,0x86,0x7c,0xd4,0x8b,0x7a,0x62,0xe5,0xe9,0x41,
|
|
0xe7,0x35,0x74,0x63,0x27,0xf7,0xfb,0xdc,0x03,0x70,0x5a,0xe9,0xa0,0xf3,0x0b,0x1a,
|
|
0x75,0x09,0x79,0xe8,0xec,0xae,0x37,0x3c,0x8a,0x8b,0xdc,0x45,0xdf,0x6a,0x2e,0x81,
|
|
0x3b,0x60,0xfb,0x59,0x41,0xa7,0x21,0x75,0x79,0x07,0xda,0x1f,0xed,0x03,0x23,0xe0,
|
|
0x53,0xd8,0x0a,0xd5,0xa9,0x14,0x3f,0xa1,0x95,0x2f,0xa3,0x5e,0x98,0xef,0x19,0xa1,
|
|
0x1b,0x7e,0x63,0xca,0x07,0x9d,0x11,0xe8,0x4c,0xdc,0x73,0xe0,0xa5,0xcb,0xdc,0x6f,
|
|
0xc4,0xef,0x7e,0x22,0x98,0xbb,0x56,0x71,0x62,0x6c,0x30,0x97,0xc0,0x68,0xce,0xdd,
|
|
0xd9,0x65,0x05,0xe1,0xe7,0x27,0x05,0x9d,0x8f,0xba,0x06,0x9d,0x6e,0xb8,0xfb,0xc0,
|
|
0x36,0xfc,0x1e,0x44,0xd7,0xc0,0x06,0x38,0x08,0xa3,0xba,0x50,0x9f,0xa8,0x88,0x67,
|
|
0xa6,0xbb,0xdf,0x94,0xbe,0x57,0x31,0xe8,0xac,0x40,0x9b,0xf2,0x03,0xfb,0xbc,0xae,
|
|
0xee,0x77,0x94,0x46,0xaf,0xd1,0xb7,0x94,0xb3,0xe1,0x49,0x98,0x01,0x9f,0xe8,0xbb,
|
|
0x4a,0xf3,0x6d,0xbc,0x59,0xaf,0xa4,0x34,0x5c,0x0a,0xb3,0xe0,0x3d,0x68,0x4d,0x5b,
|
|
0x2d,0x58,0x35,0xe8,0xd4,0x45,0x0f,0xe3,0xbe,0x02,0x1d,0x03,0xdb,0x61,0x3f,0xfe,
|
|
0x15,0xf8,0xe1,0xfe,0x06,0xf6,0x69,0x10,0x5f,0x8b,0xfc,0xe2,0xbe,0x1e,0x1e,0x81,
|
|
0x61,0xd0,0xb7,0x96,0xfb,0x5d,0x6b,0xdf,0x1e,0x66,0x6e,0x4a,0xd0,0xd9,0x86,0xfe,
|
|
0x40,0xbf,0xd2,0x0c,0x4e,0xaf,0xed,0x7e,0xeb,0x9a,0x0f,0xdd,0x4e,0xb8,0xbb,0xa9,
|
|
0xd3,0x13,0xdb,0xb8,0x2f,0x00,0x1e,0xc6,0xff,0xf9,0x91,0x3c,0xef,0x35,0x3c,0xf2,
|
|
0x6d,0x67,0x79,0xb8,0x0c,0xda,0xc2,0x6b,0xc9,0x41,0xa7,0x19,0xc7,0x1d,0xc2,0x3e,
|
|
0x16,0x2e,0xb8,0xc2,0xfd,0x66,0xb6,0x5f,0x4a,0xd0,0xb9,0x13,0x2d,0x0b,0x25,0x7b,
|
|
0x3b,0xb9,0xdf,0x45,0x66,0xa2,0x4f,0xc0,0x2e,0x98,0x7a,0x25,0xf6,0xb4,0xa0,0xb3,
|
|
0x09,0x3d,0xad,0x0e,0x71,0xf6,0xe1,0xf7,0x41,0xcd,0xa0,0x73,0x21,0x7a,0x3e,0xee,
|
|
0x41,0x66,0x5d,0x6c,0x7d,0x3f,0xfa,0x0a,0xdc,0x51,0x2b,0xe8,0x14,0xe0,0x5a,0x1f,
|
|
0x42,0xcf,0xef,0xcb,0xef,0x81,0x3a,0x41,0x67,0x31,0xba,0x06,0x7a,0xc1,0x29,0xfd,
|
|
0xa8,0x53,0xfd,0xdc,0x6f,0x75,0xcd,0xf7,0xa6,0xbd,0x61,0x38,0x8c,0x85,0x32,0x75,
|
|
0x83,0x4e,0x0a,0x5a,0x9d,0x7e,0xad,0x3f,0x24,0xd7,0x75,0xbf,0x45,0x5d,0x01,0xef,
|
|
0xd6,0x0b,0x3a,0x07,0xd9,0xd7,0x9f,0xfe,0xf2,0xb2,0xfa,0xa4,0x19,0x96,0x63,0x4f,
|
|
0xcf,0x76,0xbf,0x53,0x2d,0x0d,0xf7,0x11,0xbe,0x39,0x7a,0x1d,0x0c,0x83,0xe7,0xe1,
|
|
0x1c,0xfa,0x84,0x2c,0xfa,0xe4,0xee,0x99,0x41,0xe7,0x61,0x74,0x7a,0xc3,0xa0,0x53,
|
|
0x79,0x90,0xfb,0x3d,0x6b,0x6b,0xc8,0xd7,0x38,0xe8,0x8c,0x44,0x27,0x1a,0xbf,0x26,
|
|
0x41,0xa7,0x64,0xd3,0xa0,0x73,0xcd,0x60,0xda,0x13,0x3c,0x57,0x8f,0xdf,0x44,0xe8,
|
|
0xfc,0x7a,0x2e,0x4d,0x86,0x38,0xce,0x25,0x43,0xdc,0xef,0x5f,0xc7,0x9a,0xef,0xdf,
|
|
0xa1,0x74,0x7d,0xc7,0x39,0x9b,0xbe,0x37,0xed,0xbc,0xa0,0x53,0xcf,0xac,0x41,0x8d,
|
|
0x9a,0x6f,0xfc,0x1f,0xa3,0xfe,0x16,0xa5,0xdf,0x9c,0xd2,0x2a,0xe8,0xcc,0x87,0x46,
|
|
0xad,0x83,0xce,0x61,0xc2,0xe6,0xcb,0x70,0xbf,0x91,0x3d,0x80,0xfb,0x6b,0x38,0xbd,
|
|
0x4d,0xd0,0x49,0x86,0x32,0xc3,0xb8,0x06,0xc2,0x7c,0x3f,0x6b,0xbe,0x4b,0xbd,0x0d,
|
|
0x6d,0x8c,0xde,0x97,0x61,0xbe,0x05,0xa7,0x3c,0x87,0xbb,0x6b,0x1b,0x98,0xef,0x6a,
|
|
0xb7,0xe1,0x57,0xb1,0x7d,0x30,0xf7,0x3b,0xe6,0x07,0xd1,0x37,0xc0,0x7c,0x8b,0xbd,
|
|
0x1b,0xaa,0x37,0x70,0xbf,0x67,0x6e,0x0e,0xad,0x60,0x44,0xc7,0xa0,0xf3,0xcc,0xc5,
|
|
0x2e,0x5f,0xe1,0x0e,0x72,0x73,0x9e,0xde,0x89,0xf2,0xbb,0x96,0x3e,0x0f,0x2a,0xe1,
|
|
0x1e,0x79,0x49,0xd0,0x59,0x37,0x82,0xdf,0x85,0xd8,0x77,0xa2,0xdb,0x34,0x49,0xe0,
|
|
0xa6,0xce,0x41,0xa7,0x3b,0x1a,0xa0,0x5e,0xad,0x40,0x83,0xd7,0x73,0x3f,0x87,0x14,
|
|
0xdc,0x95,0xbb,0x05,0x9d,0x26,0xd0,0x11,0xfb,0x87,0xe8,0x35,0x37,0x70,0x6d,0xbb,
|
|
0x07,0x9d,0x89,0xe8,0x21,0x7d,0xe3,0xfb,0xd1,0xe5,0x41,0x27,0xb6,0x07,0x7d,0x3c,
|
|
0xf6,0xa9,0x68,0x36,0xda,0x99,0xba,0xf8,0x3e,0xc7,0xcc,0xc6,0x1e,0x31,0xca,0x71,
|
|
0x0a,0x70,0xf3,0xad,0x87,0xce,0xa5,0xff,0x79,0xa6,0x57,0xd0,0x99,0x0b,0xf7,0x10,
|
|
0xe6,0xe1,0x64,0xb7,0x7d,0x47,0xc2,0xa3,0xe3,0x69,0xcf,0x84,0xbb,0x0b,0xfb,0x6d,
|
|
0xf0,0x08,0xcc,0xa1,0x1f,0x9c,0x65,0x14,0x16,0xc2,0x0e,0xa8,0xd3,0x27,0x98,0xbb,
|
|
0x36,0xc2,0x59,0x63,0xb8,0xe6,0xf0,0x3c,0xc4,0xc2,0x42,0xf8,0x7c,0x8c,0xfb,0xed,
|
|
0x76,0x5b,0x74,0x15,0xbc,0x05,0x39,0x90,0xd6,0x37,0xe8,0xf4,0xe9,0x47,0x9a,0xd0,
|
|
0xaa,0x3c,0xac,0xec,0x27,0xcc,0x01,0x38,0x65,0x2c,0xe1,0x06,0x07,0x9d,0xcb,0xd1,
|
|
0x6a,0x03,0x82,0xce,0xa5,0xec,0xeb,0x0a,0xb3,0xb0,0xaf,0xcb,0xe6,0x18,0xec,0xad,
|
|
0xb5,0x06,0x45,0x2f,0xe8,0x0d,0xd3,0x60,0x1c,0x14,0xbe,0x99,0xfe,0xed,0x26,0xf7,
|
|
0xdb,0xe6,0xca,0xd0,0x07,0x6e,0x82,0x0d,0x1c,0xf3,0x29,0x1a,0x18,0x47,0x5f,0x84,
|
|
0xbd,0x8b,0xd6,0x04,0xef,0x35,0x34,0xe8,0x6c,0x40,0x3f,0x81,0x54,0x1e,0x96,0x0e,
|
|
0xa1,0xaf,0x70,0xaf,0x7a,0x61,0x78,0xd0,0xe9,0x79,0x75,0xd0,0x59,0x84,0xdf,0x0a,
|
|
0x98,0xac,0x6f,0xa1,0xcd,0x77,0xd0,0x66,0xbd,0xf0,0xa9,0x23,0x82,0xce,0x74,0x74,
|
|
0x29,0x94,0xe6,0x19,0x61,0x18,0x54,0xbf,0x21,0xe8,0x44,0xe6,0x0b,0x3a,0xab,0xb1,
|
|
0xbf,0x0a,0xfb,0xe0,0x13,0xdc,0xef,0xdd,0xe9,0x7e,0x37,0xbd,0x6e,0x6c,0xd0,0xd9,
|
|
0x03,0xf7,0xf2,0x9c,0xb1,0x1f,0x8a,0xf1,0xbc,0x10,0x7f,0x73,0xd0,0x29,0x8d,0xd6,
|
|
0xbc,0x9b,0x34,0xc2,0x46,0xf3,0x4d,0x35,0x1c,0xbc,0x87,0xfb,0xe3,0xbd,0xa4,0xe7,
|
|
0xb6,0xa0,0x73,0xdb,0x44,0xda,0x09,0x0f,0x6f,0xf3,0x26,0x9a,0xf3,0x04,0x9d,0x1d,
|
|
0xd8,0x5f,0xbb,0x8f,0xeb,0x48,0xff,0x1d,0x7b,0x3f,0xf5,0x82,0xfb,0xec,0x19,0x77,
|
|
0xd3,0xcf,0xf3,0x20,0x35,0x14,0xb6,0xe0,0x97,0xff,0xde,0xa0,0x33,0x1b,0xfb,0x7d,
|
|
0xa8,0xf9,0x1e,0xdb,0x70,0x2e,0xbc,0x34,0x31,0xe8,0x6c,0x45,0x93,0x79,0x08,0x3c,
|
|
0x77,0x12,0xd7,0x1d,0x96,0xc1,0xcf,0xf0,0x36,0x7e,0x09,0x0f,0x05,0x73,0xbf,0xdb,
|
|
0xce,0x78,0x98,0xfb,0x03,0xbc,0xcd,0x83,0xe2,0x1e,0xe8,0xf5,0x08,0xf6,0xc9,0x41,
|
|
0xe7,0x07,0xec,0xa1,0x29,0x41,0xa7,0xf0,0xe3,0x41,0xe7,0x2e,0x30,0x6b,0x8f,0xb7,
|
|
0x6f,0xe9,0xae,0x39,0xfe,0x33,0x84,0x1e,0x73,0x9c,0x22,0x70,0x8a,0xd6,0x1c,0xcf,
|
|
0x9d,0x30,0x40,0xb1,0x07,0x23,0x22,0x43,0x51,0xd1,0xf9,0x62,0xf2,0x17,0x28,0x58,
|
|
0xa8,0x30,0x41,0x72,0x97,0xda,0x2d,0x5e,0xa2,0x64,0xa9,0x53,0xe8,0x37,0x9d,0x23,
|
|
0xdb,0x69,0xa7,0x73,0xcf,0x74,0xfe,0x17,0x5b,0x69,0xe7,0xcc,0xb3,0xca,0x94,0xfd,
|
|
0x83,0x23,0x75,0xff,0xaa,0x55,0x85,0xd8,0xb3,0x5d,0xe7,0x39,0x74,0x1e,0x95,0x2a,
|
|
0x9f,0x5b,0xa5,0x6a,0xb5,0xb8,0xf8,0xea,0x09,0x89,0x49,0xc9,0x4e,0x4a,0x6a,0xee,
|
|
0x63,0xda,0x1f,0xb4,0xd5,0xf0,0x1e,0xf5,0xfe,0xb0,0xad,0xd6,0xb1,0x3c,0x6b,0xd7,
|
|
0x39,0xca,0x59,0xb7,0x66,0x3d,0x77,0x3e,0x57,0x03,0x27,0xbc,0x85,0xb7,0xf0,0x16,
|
|
0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,
|
|
0x78,0x0b,0x6f,0xff,0xd2,0x6d,0xc7,0xb1,0xb6,0x9d,0x39,0x6c,0x3b,0x37,0x9a,0xff,
|
|
0x73,0x56,0xad,0x3a,0xf2,0xbf,0xb6,0x80,0xd9,0x8c,0xc5,0x0b,0xbf,0x6f,0x87,0xeb,
|
|
0xc8,0xc9,0x71,0x72,0xff,0xc7,0x41,0x14,0x3b,0xbe,0xd8,0xb5,0xcb,0xfc,0x3b,0x2a,
|
|
0xea,0x70,0x89,0x1f,0xfb,0x12,0x84,0x8b,0x41,0x5b,0x6e,0xa5,0x32,0xff,0x7d,0xa2,
|
|
0xea,0xe5,0xd6,0xb9,0x5c,0xbf,0x4f,0xb6,0xef,0xc8,0x7d,0x47,0x59,0xc4,0xbc,0x9e,
|
|
0xcc,0x7d,0x3f,0x79,0xaa,0x79,0x29,0xb9,0x23,0xc7,0x29,0xfe,0x47,0xb7,0x87,0x32,
|
|
0x65,0xcb,0x9d,0xec,0xa1,0xa5,0xcd,0x3b,0xca,0x72,0xe5,0x2b,0x98,0x24,0xef,0x50,
|
|
0x2e,0x72,0xfc,0x81,0x62,0xff,0xcc,0x56,0xed,0x5a,0x72,0x72,0xd5,0x39,0x56,0x6a,
|
|
0x8e,0xb1,0x9d,0x7d,0x9c,0x98,0xdd,0x2b,0x61,0xae,0x88,0xf9,0x97,0x1b,0xbd,0x6b,
|
|
0x76,0xfc,0x4d,0xba,0xba,0x9c,0x23,0x09,0xcd,0xf9,0x4f,0x41,0x8f,0x74,0x8d,0xce,
|
|
0xaf,0xae,0x93,0xa9,0xc7,0x39,0x39,0xbf,0x2b,0xb1,0xea,0x5e,0x4f,0x32,0x7b,0x39,
|
|
0x76,0xb7,0xac,0xd4,0xeb,0x8a,0xb9,0x7b,0xa9,0xa4,0xaa,0x99,0x39,0xbf,0xbb,0xdf,
|
|
0x89,0xf6,0x7b,0xc4,0xa8,0x82,0xfc,0x49,0x17,0xf4,0x98,0xe7,0x3f,0xb9,0x52,0xfe,
|
|
0x1f,0x9f,0xdf,0x09,0x9f,0xff,0x8f,0xdc,0xfe,0x2a,0xf9,0xbf,0xb0,0xd3,0xbf,0xa1,
|
|
0xfc,0x63,0x62,0xfe,0x52,0xd7,0xff,0xcf,0x3d,0x79,0xaf,0x5e,0x47,0x9f,0xaf,0x0f,
|
|
0xdb,0x9f,0x79,0xfe,0xa1,0x43,0x8f,0x3e,0xff,0x35,0xd7,0x98,0x19,0x70,0x7f,0xe0,
|
|
0x63,0xd8,0x7f,0xba,0x7b,0xe5,0x60,0x36,0xfe,0xc6,0x88,0x47,0x8d,0x76,0x6e,0xcc,
|
|
0xb5,0x8c,0x66,0xe3,0x7f,0xee,0x5b,0x31,0xce,0xef,0xbd,0x65,0xe4,0xfc,0xd9,0x95,
|
|
0x2d,0xfa,0x18,0xb5,0xff,0x0f,0x28,0xf4,0x7f,0xde,0x2f,0x9b,0xbf,0x63,0xb2,0x8f,
|
|
0x77,0x69,0x63,0xfe,0xda,0xa9,0xff,0xa3,0x1e,0x6f,0xfe,0x5a,0xdb,0xf6,0xbf,0x58,
|
|
0x7a,0x3e,0xd9,0xf1,0x4f,0x6b,0xad,0x47,0xff,0xfc,0xf8,0x6f,0xde,0x95,0x8f,0xbc,
|
|
0x0c,0x3a,0xe9,0xd3,0x1c,0xfd,0x4a,0xc0,0xc9,0xc9,0xb1,0x7f,0x6d,0xff,0x49,0xdd,
|
|
0x4d,0xf4,0x6f,0xeb,0x0f,0x76,0xe4,0xfc,0xae,0x77,0x60,0xbf,0xe7,0x86,0x13,0xfd,
|
|
0x07,0xc5,0x93,0xf7,0xa3,0xe7,0x5f,0xe9,0x96,0x13,0xf0,0xaa,0x87,0xf9,0xdf,0x09,
|
|
0xb8,0x9b,0x75,0x7f,0xdd,0x91,0x1b,0xee,0x9f,0x72,0x8b,0xcd,0xf9,0xf5,0xbd,0xc6,
|
|
0x8e,0x5d,0x1f,0xe4,0xac,0xda,0x71,0x22,0xdb,0xce,0xed,0xdb,0x73,0x3e,0xda,0xf1,
|
|
0x45,0xce,0x3f,0xaf,0x0f,0xdb,0xb1,0x23,0x10,0x30,0x39,0x0c,0x18,0xf1,0x2e,0x36,
|
|
0xf6,0x9c,0x1d,0x7a,0x65,0xed,0xfc,0xab,0xb7,0xbf,0xda,0x13,0x59,0xcc,0x9f,0x90,
|
|
0xe1,0xff,0xb8,0x9d,0x78,0x4c,0x1f,0x6d,0xdf,0xf9,0xc9,0x96,0x2d,0x7f,0x5a,0xc9,
|
|
0xe4,0xcb,0xf7,0x8f,0xac,0x7f,0x47,0x5f,0x93,0xe3,0x5f,0xbd,0x3f,0xbe,0x3e,0xfc,
|
|
0xf6,0x6a,0xf8,0x57,0x7d,0xee,0x8f,0x39,0xa9,0xfa,0xff,0x3b,0x5e,0x09,0xe4,0xfc,
|
|
0x25,0x8a,0x29,0xfa,0xef,0xf3,0x5b,0xec,0xbf,0xd1,0x80,0x72,0x87,0x71,0x74,0x19,
|
|
0xcd,0xb8,0xc4,0x5f,0xb2,0xdb,0xfd,0xfb,0x35,0x94,0x63,0x6e,0x67,0x38,0xff,0xf6,
|
|
0x6d,0x87,0x3d,0x08,0x9b,0x13,0x1e,0xa7,0xfe,0x47,0x6d,0x39,0xe1,0x2c,0xfe,0x0f,
|
|
0x5b,0xd5,0x5f,0xb1,0xb0,0x4e,0x38,0x51,0x3b,0x02,0x39,0x7f,0x9f,0x1b,0xc9,0xef,
|
|
0xfc,0x99,0x1b,0x9e,0x9f,0xf3,0x17,0x69,0x34,0x7f,0x78,0x7d,0xcf,0xc9,0xf9,0xa3,
|
|
0x22,0x72,0x27,0xc2,0xfc,0x96,0x08,0x77,0xfc,0x03,0xde,0xc2,0xc4,0xfc,0xd6,0x90,
|
|
0xbf,0xbd,0xff,0x88,0x89,0xfe,0x83,0x2a,0xd5,0x49,0xd7,0xaa,0xdf,0xfb,0x02,0x35,
|
|
0xfa,0xbf,0x53,0xf2,0x7f,0xe2,0x2b,0xd9,0x98,0xe8,0xbf,0x5f,0x15,0x8d,0xfe,0xc3,
|
|
0x6f,0x55,0xd1,0x27,0x3e,0xff,0xe2,0xc8,0x4f,0xef,0x7f,0xde,0x64,0xcf,0x98,0xff,
|
|
0x50,0xf7,0x76,0x84,0x2b,0xe3,0x3f,0x3b,0xf3,0x31,0xff,0xa2,0x6c,0xc7,0x38,0xe1,
|
|
0x2d,0xdc,0xec,0xfe,0xff,0x93,0xc0,0x5f,0xba,0x20,0x62,0xfe,0x9c,0x38,0x63,0xfe,
|
|
0xa5,0xad,0x2d,0xdc,0x27,0xfc,0x77,0xa6,0xc2,0xc5,0xfc,0xcd,0xfa,0x80,0xf0,0xf6,
|
|
0x37,0xd9,0x7e,0x9d,0x0b,0xf2,0xdb,0x7f,0x2f,0x86,0x5f,0x07,0xfd,0x8d,0xb7,0xa8,
|
|
0xa8,0xbf,0x55,0x6d,0xfd,0x67,0x14,0xfa,0xc6,0x8d,0x6e,0xa3,0xdb,0xba,0xd1,0x6c,
|
|
0x9e,0xaf,0xf7,0x39,0xe9,0xaf,0x93,0xfa,0x8e,0xdf,0xf2,0xfe,0x8a,0x99,0xfb,0x7b,
|
|
0xf7,0x06,0xd6,0x27,0x6e,0xfe,0x69,0x02,0x47,0x76,0xfd,0x79,0x6f,0x2d,0xc2,0x1d,
|
|
0xeb,0x7f,0xb1,0x78,0xfe,0xed,0x37,0xae,0x9d,0x3b,0xff,0xf9,0xd3,0xff,0x7e,0xed,
|
|
0x53,0xff,0xf4,0x3e,0x24,0xfc,0x3e,0xe0,0xef,0xf9,0x40,0x9c,0xbb,0xfa,0x67,0x28,
|
|
0x14,0x1d,0xca,0x17,0x93,0x3f,0x14,0x2a,0x10,0xfa,0x75,0x2b,0x18,0x0a,0x15,0x2a,
|
|
0x1c,0x2a,0x52,0x34,0x64,0x6f,0xc5,0x42,0xff,0xec,0xad,0x78,0x89,0x50,0xc9,0x52,
|
|
0xa7,0x60,0x39,0x35,0x14,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,
|
|
0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0x7f,0xc8,0x16,
|
|
0x70,0xfe,0x57,0x26,0xc2,0x09,0x39,0xd1,0xb9,0xa6,0x92,0x13,0xe7,0xd4,0x70,0x1a,
|
|
0x3a,0x3d,0x9c,0x5e,0xce,0x55,0xce,0x18,0x67,0x8a,0xf3,0x84,0xf3,0xbc,0xb3,0xc0,
|
|
0x59,0xec,0xbc,0xeb,0xec,0x77,0xbe,0xc5,0x84,0x02,0x25,0x02,0xe5,0x03,0x4d,0x02,
|
|
0x2d,0x02,0x1d,0x02,0x9d,0x02,0xfd,0x02,0x57,0x1f,0x65,0x26,0x05,0x1e,0x0b,0x4c,
|
|
0x0b,0xcc,0x0d,0x6c,0x08,0x7c,0x18,0xf8,0x3c,0xf0,0x7d,0xa0,0x44,0xf0,0xd4,0x60,
|
|
0xf9,0x60,0x5c,0x30,0x39,0x98,0x15,0xec,0x11,0xec,0x8d,0xb9,0x3a,0x78,0x73,0xf0,
|
|
0xfe,0xe0,0xc2,0xe0,0xd2,0xe0,0x3b,0xc1,0xf5,0xc1,0xcf,0x83,0x07,0xfe,0x8b,0xe6,
|
|
0xe0,0x6f,0x30,0x81,0x88,0x40,0x44,0x44,0x44,0x28,0x22,0x26,0xa2,0x40,0xae,0x29,
|
|
0xf1,0xab,0x29,0xf5,0xab,0x39,0x2b,0x22,0x36,0xe2,0x1c,0x4c,0x25,0x99,0xea,0x96,
|
|
0xa9,0x81,0x49,0x8f,0xa8,0x1d,0x51,0x3f,0xa2,0x41,0xae,0x69,0xf6,0xab,0x69,0xf1,
|
|
0xab,0x69,0x1b,0xd1,0x31,0xa2,0x13,0xe6,0x52,0x99,0x1e,0x47,0x99,0x7e,0x11,0x57,
|
|
0xfd,0x47,0x73,0x75,0xc4,0x75,0x7f,0xba,0x19,0x15,0x31,0x36,0x4f,0x73,0x73,0xc4,
|
|
0x2d,0xbf,0x9a,0xdb,0x22,0xee,0x38,0xca,0x8c,0x8f,0xb8,0x2b,0xe2,0x9e,0x88,0x89,
|
|
0x27,0x68,0xee,0xff,0xdd,0x66,0x4a,0xc4,0xf4,0xff,0x60,0xe6,0x46,0x2c,0x3e,0xca,
|
|
0x2c,0xfd,0x53,0xcc,0x6b,0x11,0x6f,0xfc,0x8f,0xcc,0x8a,0x88,0x37,0x23,0x56,0x47,
|
|
0xac,0xf9,0xd5,0xbc,0x13,0xf1,0xee,0x3f,0xc2,0xac,0x0f,0x9b,0x7f,0xb5,0xf9,0x54,
|
|
0xe6,0x0b,0xcc,0x01,0x4c,0x20,0xf2,0x88,0x89,0xc1,0x14,0x90,0x39,0x55,0xa6,0x7c,
|
|
0xae,0x89,0xc5,0x9c,0x93,0x6b,0x52,0x65,0xea,0x62,0x9a,0x61,0x3a,0x5a,0xa6,0x2b,
|
|
0xa6,0x87,0xcc,0x55,0x32,0xa3,0x22,0x6f,0x8e,0xbc,0x23,0xd7,0x8c,0x97,0xb9,0xe7,
|
|
0x4f,0x33,0x13,0x8f,0x61,0x26,0xe5,0x9a,0x87,0x30,0x53,0x22,0x9f,0x8a,0x7c,0x26,
|
|
0x72,0x06,0x66,0x96,0xcc,0x9c,0x5f,0xcd,0x2b,0x32,0x0b,0x65,0x16,0x63,0x96,0xe6,
|
|
0x9a,0x37,0x72,0xcd,0x0a,0xcc,0x9a,0xc8,0x77,0x23,0xd7,0x47,0x6e,0xc2,0x7c,0x2c,
|
|
0xb3,0xf9,0x57,0xf3,0xb9,0xcc,0x17,0x32,0xbb,0x31,0x7b,0xfe,0x9f,0xd9,0xfb,0x3b,
|
|
0xcc,0xfe,0xc8,0x03,0xff,0x08,0xf3,0x6d,0xe4,0xf7,0xff,0xd1,0x1c,0x8c,0xfc,0xf1,
|
|
0xa4,0x4c,0x78,0x28,0xf0,0xdf,0xbe,0xfd,0x18,0xf9,0xc7,0x9a,0x40,0xe8,0xf7,0x1a,
|
|
0x1e,0x89,0xff,0x65,0xbf,0xc7,0xa2,0x8f,0x6b,0x62,0x72,0x4d,0x81,0xbf,0x89,0x29,
|
|
0xe4,0x33,0x45,0x72,0x4d,0xb1,0xb0,0x39,0x21,0x53,0xea,0x5f,0x6f,0x4a,0xff,0x25,
|
|
0xcd,0x59,0x7f,0x92,0x29,0x1f,0x8a,0xfd,0x97,0x9b,0x73,0xfe,0x75,0xa6,0xd2,0x51,
|
|
0x26,0x4e,0xa6,0xfa,0xbf,0xd6,0x24,0x87,0x52,0xc3,0xe6,0xb8,0xa6,0x76,0xae,0xa9,
|
|
0xfb,0x17,0x34,0xf5,0xc3,0xe6,0x6f,0x6e,0x1a,0x60,0x1a,0x62,0xb2,0x30,0x4d,0x30,
|
|
0xcd,0x64,0x5a,0xfc,0xe1,0xa6,0x25,0xa6,0x15,0xa6,0x4d,0xa8,0x6d,0xae,0x69,0x17,
|
|
0x36,0xff,0x12,0xd3,0x21,0xd4,0xf1,0x0f,0x31,0x9d,0x42,0x97,0x1e,0x65,0x3a,0x87,
|
|
0xba,0xfe,0xcf,0x4c,0x8f,0x50,0xef,0x93,0x32,0x7d,0x42,0xfd,0x4e,0xc8,0x0c,0x08,
|
|
0x0d,0xfc,0x93,0xcc,0xd5,0xa1,0x51,0xa1,0x31,0xa1,0xb1,0xa1,0x9b,0x43,0xb7,0x84,
|
|
0x6e,0x0b,0xdd,0x11,0x9a,0x18,0x7a,0x24,0xf4,0x58,0x68,0x4a,0xe8,0x89,0xd0,0x53,
|
|
0xa1,0x67,0x42,0xd3,0x42,0xcf,0x87,0x66,0x1d,0x65,0xe6,0x86,0x16,0x1c,0x65,0x96,
|
|
0x86,0xde,0x0c,0xad,0x0e,0xad,0x09,0xbd,0x13,0x7a,0x37,0xb4,0x3e,0xf4,0x7e,0xe8,
|
|
0xe3,0xd0,0x67,0xa1,0xcf,0x43,0x5f,0x84,0x76,0x87,0xf6,0x84,0xf6,0x86,0xf6,0x87,
|
|
0xbe,0x0f,0xfd,0x74,0x94,0x89,0x88,0x8a,0x39,0xca,0x14,0x8a,0x2a,0x76,0x94,0x29,
|
|
0x15,0x75,0xfa,0x51,0xa6,0x6c,0xd4,0x39,0x3e,0x53,0xf5,0x28,0x93,0x1c,0x55,0x3b,
|
|
0xaa,0x6e,0x54,0xfd,0xa8,0x06,0x51,0x0d,0xa3,0xb2,0xa2,0x9a,0x44,0xb5,0x8a,0xea,
|
|
0x10,0xd5,0x31,0xaa,0x53,0xd4,0xa5,0x51,0x9d,0xa3,0xba,0x46,0x75,0x8f,0xea,0x21,
|
|
0xd3,0xcb,0x67,0x7a,0xff,0x0f,0x4c,0x9f,0xff,0x67,0x06,0x1e,0x65,0x06,0xff,0x97,
|
|
0xcd,0x55,0x3e,0x73,0x6d,0xd8,0x9c,0x80,0xb9,0x0e,0x73,0x03,0x66,0xd4,0xff,0xc8,
|
|
0x8c,0xc1,0x8c,0xc5,0xdc,0xfc,0x5f,0x36,0xb7,0xfc,0x6a,0x6e,0xcb,0x35,0x77,0x9c,
|
|
0xa4,0x19,0x8f,0xb9,0xeb,0xa4,0xcc,0x3d,0x47,0x99,0x89,0x98,0xfb,0x73,0xcd,0xa4,
|
|
0x5f,0xcd,0x43,0x27,0x68,0x1e,0xc9,0x35,0x8f,0x45,0x4d,0xc9,0xd3,0x3c,0x11,0xf5,
|
|
0x54,0xae,0x79,0x26,0x6a,0x5a,0xae,0x99,0x1e,0xf5,0x7c,0xd4,0x8c,0xa8,0x59,0xbf,
|
|
0x9a,0x39,0x51,0x73,0x73,0xcd,0xbc,0xa8,0x05,0xc7,0x30,0xaf,0x44,0x2d,0x3c,0x8e,
|
|
0x59,0x6c,0x99,0xa5,0x51,0xaf,0x61,0xde,0x38,0xca,0xac,0x88,0x7a,0x33,0x6a,0x75,
|
|
0xd4,0x9a,0xb0,0x39,0xae,0x79,0xe7,0x57,0xf3,0x2e,0x66,0x3d,0xe6,0x7d,0xcc,0x06,
|
|
0xcc,0x87,0x98,0x4d,0x98,0x8f,0x31,0x9b,0x31,0x9f,0x62,0xb6,0x61,0x3e,0xc3,0x7c,
|
|
0x9e,0x6b,0xbe,0xc0,0xec,0xc6,0xec,0x39,0xca,0xec,0xcf,0x35,0xdf,0xe6,0x9a,0x83,
|
|
0xb9,0xe6,0xa7,0x5c,0x13,0x88,0xfe,0xfd,0x26,0xe2,0xff,0x99,0x23,0x2f,0x72,0xcd,
|
|
0x16,0x83,0x29,0x80,0x29,0x84,0x29,0x82,0x29,0x86,0x29,0x81,0x29,0x85,0x39,0x15,
|
|
0x73,0x3a,0xa6,0x34,0xe6,0xac,0x5c,0x53,0x16,0x53,0x1e,0x13,0x7b,0x94,0xa9,0x94,
|
|
0x6b,0xaa,0xe6,0x9a,0xea,0xb9,0x26,0x39,0xd7,0xd4,0x38,0x41,0x93,0x1e,0x5d,0x3b,
|
|
0xba,0x6e,0x74,0xfd,0x63,0x9a,0x06,0x61,0xf3,0x1b,0x4d,0x43,0x4c,0xd6,0x31,0x4c,
|
|
0x93,0xb0,0xc9,0xc3,0x34,0x8b,0x6e,0x11,0x36,0x61,0x73,0x82,0xa6,0x55,0xd8,0x84,
|
|
0xcd,0x3f,0xde,0xb4,0x0b,0x9b,0x7f,0xb5,0xe9,0x10,0xdd,0xf1,0x5f,0x6b,0x3a,0x85,
|
|
0xcd,0x5f,0xd0,0x84,0x67,0x49,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,
|
|
0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,
|
|
0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,
|
|
0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,
|
|
0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,
|
|
0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,
|
|
0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,
|
|
0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,
|
|
0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0xdb,0xdf,
|
|
0x6f,0xab,0x19,0xe1,0x38,0xfd,0x2b,0xb8,0xda,0x45,0x3a,0x00,0x75,0xd0,0x25,0x48,
|
|
0x00,0x5d,0x8a,0x06,0xd1,0x65,0xc6,0x1b,0x7d,0x0d,0x8d,0x8c,0x30,0x3b,0x1d,0x27,
|
|
0x0a,0x0d,0xa2,0xd1,0x68,0xc5,0xa0,0xe3,0xe4,0x43,0x5f,0x67,0x57,0x0c,0xfa,0x78,
|
|
0x19,0xc7,0xc9,0x8f,0xbe,0x81,0xbb,0x20,0xba,0x86,0x70,0x45,0xcc,0x71,0x84,0x2b,
|
|
0x66,0x8e,0x43,0x63,0xd1,0xc9,0x84,0x3b,0xc7,0xf8,0xa3,0x95,0xd1,0x48,0xc5,0x17,
|
|
0x2c,0xe3,0xee,0x8f,0x44,0x13,0xd1,0xa8,0x32,0x6e,0x7a,0xa2,0x02,0x6e,0x7a,0xf2,
|
|
0x29,0x5c,0xfe,0x80,0x1b,0x7f,0x41,0xb4,0x12,0xba,0xc2,0x91,0x7f,0x19,0xd7,0xbf,
|
|
0x70,0xc0,0x8d,0xa7,0x60,0x19,0x77,0x7f,0x51,0x34,0x0e,0x2d,0xae,0x78,0x0b,0x97,
|
|
0x71,0xf3,0xbb,0x52,0xf9,0x7d,0x53,0xf9,0x5d,0xa5,0xfc,0xbe,0x5a,0xc6,0xcd,0x6f,
|
|
0x71,0xe5,0xb7,0xa4,0xce,0x7b,0x4a,0xc0,0xcd,0xef,0x6a,0xe5,0xf7,0x65,0x9d,0xef,
|
|
0x0c,0xe5,0x33,0x52,0xf9,0x8c,0x52,0x3e,0xe7,0xeb,0xfc,0x95,0x83,0x6e,0x3e,0x4f,
|
|
0x0b,0xb8,0xe9,0x38,0x0d,0xff,0x04,0x73,0x5c,0x19,0x37,0xde,0x32,0xca,0xe7,0x37,
|
|
0xca,0xe7,0x99,0x01,0xf7,0xfc,0xe5,0xca,0xb8,0xe7,0x2f,0xa3,0xf3,0x97,0x53,0xbe,
|
|
0x77,0x28,0xdf,0x15,0x14,0xfe,0x6c,0xed,0xaf,0x50,0xc6,0x4d,0x5f,0x45,0xa5,0xab,
|
|
0x8c,0xd2,0x71,0xb6,0x97,0x0e,0x34,0x1e,0xad,0xa2,0xfc,0xbf,0xa5,0xfc,0xaf,0x51,
|
|
0xfe,0xdf,0x56,0xfe,0x2b,0xeb,0xfc,0x55,0x94,0xff,0x6a,0x8a,0x3f,0x41,0xf9,0x7f,
|
|
0x47,0xf9,0x5f,0xa9,0xf3,0xbc,0xa3,0xfc,0xe7,0x53,0xfe,0xf3,0xeb,0xbc,0xab,0x74,
|
|
0x7d,0xe3,0x03,0x6e,0x7e,0xab,0x95,0x71,0xcf,0x93,0x12,0x70,0xcf,0x9b,0xa0,0xe3,
|
|
0x77,0xea,0x7a,0x25,0x29,0x9d,0x69,0x01,0xf7,0x3a,0xa5,0xa8,0x5c,0xd2,0x95,0xef,
|
|
0xba,0x0a,0x97,0xa6,0x70,0xb5,0x55,0x9e,0x75,0x74,0x5d,0x6b,0x29,0x7c,0x3d,0x95,
|
|
0x6b,0x86,0xea,0x53,0xa6,0xf2,0xfb,0x83,0xce,0xdb,0x30,0xe0,0xe6,0xf3,0x5d,0xd5,
|
|
0x9b,0x46,0x4a,0x47,0x13,0xc5,0xdf,0x58,0xf1,0x67,0x29,0xfe,0xe6,0x8a,0xbf,0xa9,
|
|
0xe2,0x59,0xa7,0x72,0x5b,0xaf,0x72,0x7b,0x4f,0xe5,0xf6,0xbe,0xda,0xc9,0x79,0x2a,
|
|
0xb7,0xf3,0x55,0x6e,0xf1,0x6a,0x27,0x1f,0xa8,0xdc,0xde,0x26,0x9e,0x02,0x68,0x6b,
|
|
0xe5,0xeb,0x5d,0x95,0x5f,0x41,0x95,0x5f,0x61,0xb4,0xb4,0x69,0x27,0x4a,0xcf,0x5b,
|
|
0x2a,0xc7,0x5d,0x4a,0xff,0x85,0xca,0x5f,0x7b,0xe5,0xf7,0x42,0x9d,0xe7,0x22,0xe5,
|
|
0xe3,0x22,0xc5,0x57,0x54,0xf1,0x15,0xd7,0xf5,0xb8,0x58,0xf9,0x6a,0xaf,0xf2,0xbd,
|
|
0x4c,0xc7,0x5f,0xac,0x7a,0x74,0x89,0xe2,0xe9,0xa2,0x78,0xba,0xe8,0xfc,0xdd,0x70,
|
|
0x57,0x34,0xf5,0x36,0xe8,0x1e,0x7f,0x99,0xc2,0x5d,0xa9,0x70,0x97,0x2b,0x5c,0x5f,
|
|
0x85,0x3b,0x43,0xe1,0xba,0xa9,0xfc,0xb2,0x55,0x7e,0xfd,0x55,0x7e,0x1f,0xaa,0xfc,
|
|
0x3e,0x52,0xf9,0x6d,0x52,0xf9,0x5d,0xa1,0x7a,0x77,0xa5,0xca,0xaf,0xaf,0xea,0x5b,
|
|
0x8e,0xca,0x6d,0x87,0xfa,0x97,0xfe,0x01,0xb7,0xfc,0xb2,0x55,0x7e,0xeb,0x95,0xdf,
|
|
0x92,0xca,0xef,0x29,0x2a,0xbf,0x19,0x4a,0xd7,0x76,0x8e,0x3b,0x1b,0x1d,0xa4,0x72,
|
|
0x1c,0xa4,0x74,0x0d,0x55,0x3b,0x1c,0x52,0xc6,0x3d,0xff,0x08,0xd5,0x97,0xeb,0x95,
|
|
0xce,0x91,0x2a,0x9f,0xd1,0xaa,0xb7,0x43,0x94,0xef,0x9b,0xd4,0xce,0x6e,0x54,0xf8,
|
|
0x71,0xba,0x1e,0xb7,0xca,0xff,0x76,0x1d,0xff,0xb5,0x8e,0xff,0x58,0xf9,0x1c,0xaa,
|
|
0x7a,0xf7,0x83,0xfa,0x97,0xa4,0xa0,0x7b,0xdc,0x9d,0x3a,0x6e,0x78,0xc0,0xcd,0xe7,
|
|
0x77,0x8a,0xf7,0x1b,0x1d,0x7f,0xb5,0xae,0xcf,0x04,0x9d,0xe7,0x5a,0xe5,0xfb,0x3a,
|
|
0xe5,0xef,0x6e,0x95,0xef,0xbd,0x3a,0xef,0x16,0x95,0xef,0xa7,0x3a,0xef,0x56,0x95,
|
|
0xef,0x36,0xd5,0xcf,0x80,0xca,0x37,0x42,0xf9,0xa9,0xa4,0xfa,0xb9,0x5d,0xe5,0xfc,
|
|
0x84,0xca,0xf9,0x33,0xf5,0xe3,0x6f,0xab,0x7c,0x03,0x2a,0xdf,0x08,0xd5,0xa7,0x29,
|
|
0xea,0xc7,0x03,0x2a,0xd7,0x90,0xe2,0x8b,0x50,0xfa,0x43,0x4a,0x57,0xb4,0xf2,0x11,
|
|
0xad,0x7c,0xc4,0x28,0x5c,0x01,0xe5,0xa3,0x90,0xfa,0xb3,0xcf,0xd5,0x1e,0x0b,0xa8,
|
|
0x5e,0x15,0x51,0xfe,0x0a,0xa9,0xde,0x16,0x53,0x3f,0x5e,0x42,0xf1,0x16,0x51,0x7e,
|
|
0x77,0x2a,0xbf,0x5f,0x28,0xbf,0xbb,0x94,0xdf,0x85,0x2a,0xe7,0x12,0xca,0x6f,0x29,
|
|
0x9d,0xf7,0x54,0xd5,0xab,0xdd,0xca,0xef,0x2b,0x3a,0x5f,0x69,0xe5,0x33,0xa4,0x7c,
|
|
0x46,0x2b,0x9f,0x0b,0x74,0xfe,0x73,0xd5,0x8f,0x9f,0xae,0xfa,0x73,0xba,0xea,0x4f,
|
|
0x69,0x5d,0x97,0xb2,0xca,0xe7,0xb7,0xca,0xe7,0x59,0xaa,0xcf,0xe5,0xd5,0x8f,0x97,
|
|
0xd5,0xf9,0xcb,0x2b,0xdf,0x9f,0x2b,0xdf,0xb1,0x0a,0x7f,0x8e,0xf6,0xc7,0xaa,0x3e,
|
|
0x54,0x52,0xba,0xca,0x2a,0x1d,0xe7,0x78,0xe9,0x50,0x3f,0x5e,0x55,0xe5,0x70,0x9f,
|
|
0xca,0xe1,0x4b,0x95,0xc3,0x1e,0x95,0xc3,0x57,0x2a,0x87,0x73,0x95,0x8e,0xaa,0x2a,
|
|
0x87,0x38,0xe5,0x7f,0xaf,0xf2,0xff,0xa6,0xce,0xb3,0x56,0xf9,0x8f,0x51,0xfe,0x0b,
|
|
0xe8,0xbc,0xab,0x75,0x7d,0xab,0xab,0x1f,0x8f,0x53,0x7b,0x48,0x55,0x3e,0xf6,0xa9,
|
|
0x5f,0x4a,0x54,0x3c,0x5f,0xe8,0xba,0x25,0x2b,0xbd,0x35,0xd4,0xdf,0xa4,0xaa,0x7c,
|
|
0x6a,0xe9,0xb8,0x7a,0x0a,0x57,0x43,0xe1,0xea,0xa8,0x5c,0xeb,0x2a,0x5f,0xb5,0x15,
|
|
0xbe,0xbe,0xca,0xb7,0x81,0xea,0x55,0x43,0xe5,0xf7,0xa0,0xce,0xdb,0x48,0xed,0x6a,
|
|
0xbf,0xea,0x4f,0x96,0xd2,0xd1,0x54,0xf1,0x37,0x51,0xfc,0x8d,0x15,0x7f,0x0b,0xc5,
|
|
0xdf,0xcc,0x6b,0xa7,0x2a,0xb7,0x03,0x2a,0xb7,0x6f,0x54,0x6e,0xdf,0xaa,0xbd,0xb4,
|
|
0x54,0xb9,0xb5,0xd2,0xf5,0xa9,0xae,0xf6,0xf2,0x9d,0xca,0xef,0x1d,0xf5,0xe7,0x6d,
|
|
0x94,0xaf,0x75,0x2a,0xc7,0x42,0x2a,0xc7,0x22,0xea,0x8f,0xa6,0x28,0x3d,0x6b,0x54,
|
|
0x9e,0xbb,0x95,0xfe,0x76,0xca,0x5f,0x07,0xe5,0xb7,0x9d,0xce,0xd3,0x51,0xf9,0xe8,
|
|
0xa8,0xf8,0x8a,0x29,0xbe,0x12,0xba,0x2e,0x9d,0x94,0xaf,0x0e,0x2a,0xdf,0xce,0x3a,
|
|
0xbe,0x93,0xea,0xd3,0xa5,0x8a,0xa7,0xab,0xe2,0xe9,0xaa,0xf3,0x77,0x57,0x3f,0x7d,
|
|
0xba,0xfa,0xe9,0xce,0x0a,0xd7,0x47,0xf5,0xee,0x7e,0x85,0xef,0xa1,0xf0,0xfd,0x14,
|
|
0xbe,0xb4,0xc2,0x77,0x57,0x39,0x0e,0x54,0x39,0x0e,0xf0,0xae,0x87,0xca,0xf1,0x90,
|
|
0xca,0xf1,0x47,0x95,0x63,0x6f,0xd5,0xbf,0x3e,0x2a,0xc7,0x7e,0xaa,0x7f,0x87,0x55,
|
|
0x7e,0x9f,0xab,0xbf,0x19,0xa0,0x7e,0x7d,0xa0,0xca,0xf1,0x3d,0xe5,0xbb,0x94,0xf2,
|
|
0x7d,0xaa,0xca,0x71,0xa6,0xd2,0xf5,0x99,0xfa,0xf5,0xc1,0x2a,0xcf,0xc1,0x4a,0xd7,
|
|
0x30,0xb5,0xcb,0xab,0xd4,0xaf,0x5f,0xa7,0x7a,0x73,0x83,0xd2,0x39,0x4a,0xe5,0x34,
|
|
0x46,0xf5,0xf8,0x2a,0xe5,0xff,0x66,0xe5,0x7f,0xac,0xd2,0xf3,0x80,0x8e,0xbb,0x45,
|
|
0xd7,0xe7,0x36,0xed,0xbf,0x43,0xf1,0x1c,0x50,0x3c,0x3f,0x29,0xbf,0xc3,0x54,0x0f,
|
|
0x0f,0xaa,0xdf,0x49,0x56,0xff,0x3e,0x5e,0xc7,0xfd,0xa2,0xfc,0x7e,0xaf,0xf8,0x27,
|
|
0x29,0xfe,0x6f,0x15,0xcf,0x35,0xba,0x6e,0x77,0xe9,0x7c,0x23,0x54,0x0e,0xd7,0x2b,
|
|
0xbf,0xf7,0xa8,0xbc,0x27,0xea,0xfc,0x7b,0xca,0xba,0xc7,0x8d,0x35,0xcf,0x38,0xe6,
|
|
0xb9,0xbd,0xac,0xeb,0xff,0xb4,0xe2,0x7b,0x52,0xf9,0x7f,0xb6,0x8c,0x7b,0xde,0xa9,
|
|
0x4a,0xd7,0x27,0xaa,0x77,0x87,0xa4,0x87,0x75,0x7d,0xb6,0xca,0x9d,0x4f,0xf1,0x2f,
|
|
0x51,0x3c,0x8b,0x14,0xcf,0xeb,0x8a,0x67,0x99,0xfc,0xe3,0xbd,0xe7,0x21,0xb9,0xd7,
|
|
0x2a,0xdc,0x07,0x0a,0xf7,0x9e,0xfc,0xcf,0xd3,0x79,0xab,0xa9,0xdd,0x9c,0x2f,0x77,
|
|
0x95,0xa0,0xbb,0xff,0xe7,0x80,0x1b,0xcf,0x26,0x9d,0x7f,0x83,0xd2,0xf3,0xbe,0xf2,
|
|
0xff,0xa1,0xf6,0x3f,0xa3,0xf8,0x9e,0xd2,0x79,0xa6,0xeb,0x3c,0xd3,0x14,0xdf,0x66,
|
|
0x1d,0xff,0xa3,0xf4,0x27,0xc5,0xb3,0x4d,0xee,0x18,0xa5,0x77,0xa9,0xe2,0x59,0xac,
|
|
0x78,0xde,0x50,0x3c,0xaf,0xc9,0xbf,0xba,0xc2,0xad,0x97,0xfb,0x5d,0x85,0xdb,0xa0,
|
|
0x70,0xef,0xcb,0xbf,0xa5,0xce,0x1b,0xa7,0x7c,0xb5,0x92,0xbb,0xaa,0xf2,0xf5,0x8b,
|
|
0xd2,0x9d,0xa3,0xf3,0x6f,0x54,0x7a,0x3e,0x50,0xbe,0x3e,0xd2,0xfe,0x99,0x8a,0xef,
|
|
0x05,0x9d,0xe7,0x45,0x9d,0x67,0xb6,0xd2,0x31,0x4b,0xfb,0x67,0x68,0xff,0x5c,0xed,
|
|
0x9f,0xa3,0xfd,0x25,0xb5,0xff,0x14,0xb9,0x4b,0xc9,0x7d,0xaa,0xdc,0xad,0xe5,0xbe,
|
|
0x40,0xee,0x36,0x72,0xb7,0x55,0x3d,0xbb,0x5c,0xda,0x43,0xda,0x53,0xda,0x4b,0xe1,
|
|
0x86,0x7b,0xcf,0x21,0xaa,0xc7,0xd7,0x48,0xaf,0x55,0xb8,0x87,0x14,0x6f,0x8e,0xc2,
|
|
0x7d,0xa4,0x74,0x6e,0x51,0x3a,0x3f,0x51,0x3d,0xdf,0xaa,0x70,0x1f,0x2b,0xdc,0x26,
|
|
0x85,0xfb,0x54,0xe1,0x36,0x2b,0xdc,0x36,0x85,0xdb,0xa5,0x70,0x3b,0x15,0xee,0x2b,
|
|
0x85,0xfb,0x52,0xe1,0xf6,0x29,0xdc,0x6e,0x85,0xfb,0x42,0xe1,0xf6,0x2a,0xdc,0x1e,
|
|
0x85,0xdb,0xaf,0xfe,0xec,0x2b,0x95,0xff,0x97,0xd2,0x3d,0xd2,0x2d,0xd2,0x4f,0xd5,
|
|
0x3f,0x9d,0xa9,0xfb,0xf5,0x59,0xba,0x9e,0x09,0x41,0x57,0x13,0x83,0x6e,0x3c,0x7b,
|
|
0x75,0xdd,0x5e,0x56,0xfb,0xbb,0x29,0xc2,0xdd,0xbf,0xa0,0xac,0x7b,0xdc,0x7c,0xb4,
|
|
0x84,0x69,0x47,0x68,0x49,0x53,0xef,0xd0,0x2c,0xf3,0xbb,0x52,0xed,0x73,0xa5,0x8e,
|
|
0x1b,0x17,0xe1,0x86,0x3b,0x4d,0xe1,0x4e,0xd7,0xfe,0x55,0xda,0x7f,0x8b,0xf6,0x57,
|
|
0xd6,0xfe,0x73,0x15,0xcf,0x5b,0x0a,0xf7,0x91,0xc2,0xdd,0xaa,0xf3,0x7f,0xa8,0xf3,
|
|
0x6f,0x2c,0xeb,0x5e,0x9f,0x67,0x75,0x7c,0x4d,0x1d,0x9f,0xae,0xe3,0x7e,0xd0,0x71,
|
|
0xb7,0x6b,0x7f,0x53,0xed,0x6f,0x26,0xfd,0x52,0xe1,0x76,0x29,0xdc,0x9d,0x8a,0xff,
|
|
0x0b,0xc5,0xbf,0x53,0xf1,0x4f,0x8f,0x70,0xc3,0x77,0x54,0xf8,0x43,0x0a,0x3f,0x5e,
|
|
0xf1,0x5e,0xa1,0xf8,0x7a,0x2b,0xdd,0x87,0xa5,0x2f,0x4a,0x5f,0xd7,0x71,0xd9,0x3a,
|
|
0xee,0x39,0x9d,0x67,0x96,0xce,0x33,0x53,0xe5,0xe8,0x28,0x9e,0x40,0x59,0xb7,0x9f,
|
|
0x7b,0x49,0xc7,0xcf,0xd1,0xf1,0x83,0x74,0xfc,0xf3,0x3a,0x6f,0x51,0x85,0x2f,0xa6,
|
|
0xfd,0x43,0xb4,0xff,0x05,0xed,0x2f,0xa7,0xfd,0xe5,0x15,0xdf,0x72,0xc5,0xf7,0x9a,
|
|
0xc2,0x0f,0x55,0xf8,0x19,0x4a,0xcf,0xbb,0x4a,0xcf,0x5a,0xe5,0x7b,0x95,0xe2,0x49,
|
|
0x50,0x3c,0x89,0x8a,0xe7,0x03,0x1d,0x3f,0x5c,0xc7,0xbf,0xa5,0x70,0x19,0x0a,0xd7,
|
|
0x40,0xf9,0xd9,0x2e,0xf7,0x67,0x0a,0x7f,0x8d,0xc2,0xaf,0xd1,0xf9,0x3e,0xd5,0xf9,
|
|
0xb6,0xe8,0x7c,0xab,0x15,0x4f,0x6b,0x1d,0xd7,0x46,0xe7,0xdb,0xa1,0xe3,0x47,0xe8,
|
|
0xf8,0xb7,0x15,0xae,0x8b,0xc2,0x75,0x55,0xb8,0xef,0x94,0xbf,0x03,0x0a,0xbf,0x4e,
|
|
0xe1,0x27,0xe8,0xbe,0xb1,0x41,0xfe,0x5b,0xe5,0x3f,0x53,0xfe,0x9f,0xeb,0xb8,0x6f,
|
|
0xe4,0xbf,0x3e,0xc2,0x4d,0xcf,0x7b,0xd2,0xe8,0x48,0x95,0x4b,0xa4,0xeb,0x5e,0x17,
|
|
0xe9,0x86,0x8b,0x88,0x74,0xe3,0x73,0xb4,0xff,0x03,0xed,0x0f,0xc8,0xbd,0x54,0xee,
|
|
0x1c,0xe9,0x27,0x0a,0x5f,0x28,0x52,0xf7,0x21,0x85,0x3b,0x5d,0xfb,0xb7,0x2b,0xde,
|
|
0x82,0x72,0xef,0x50,0xb8,0xaf,0x14,0xae,0xb0,0xfc,0xf7,0x45,0xba,0xcf,0x0f,0x5f,
|
|
0xcb,0xfd,0x8d,0xf4,0x07,0xe9,0x97,0x0a,0xff,0xae,0xdc,0xeb,0x15,0x6f,0x5b,0x9d,
|
|
0xbf,0xb5,0xf6,0x6f,0xd0,0xfe,0x36,0x72,0x2f,0x93,0xfb,0x63,0xe9,0x66,0x85,0xbf,
|
|
0x54,0xe9,0xd8,0xa6,0x70,0xe9,0xda,0xff,0x99,0xe2,0xbd,0x44,0xee,0xcf,0x15,0x6e,
|
|
0xaf,0xc2,0x5d,0x26,0xff,0xfd,0x4a,0xef,0x01,0xb9,0xbf,0x95,0x1e,0x94,0xee,0x91,
|
|
0x76,0x88,0x74,0x9f,0x83,0x86,0x4a,0x87,0xc9,0xff,0x23,0xe9,0x26,0xe9,0x2e,0xe9,
|
|
0x6e,0xb4,0x6d,0x94,0xe3,0x54,0x80,0x0b,0x21,0x16,0xda,0xc1,0x39,0x72,0x9f,0x2d,
|
|
0xad,0x28,0x5d,0x26,0x5d,0x2f,0x5d,0x02,0x75,0x62,0xe8,0x6f,0x62,0x5c,0x4d,0x94,
|
|
0xa6,0xc0,0x22,0x58,0x0d,0x1b,0xe0,0x2d,0xa8,0x57,0x80,0xe7,0x69,0x68,0x0f,0x4d,
|
|
0xa1,0x03,0x9c,0x07,0x1b,0xe0,0x5e,0x58,0x04,0xab,0xe4,0x7e,0x4b,0xee,0xd5,0x26,
|
|
0x7c,0x41,0xc2,0xc3,0xfb,0xb0,0x04,0x96,0xc1,0x2a,0xb9,0x57,0xc0,0x07,0xb0,0x52,
|
|
0xee,0xd5,0x50,0xaf,0x90,0xe3,0x34,0x87,0x0e,0x70,0x5e,0x21,0xd7,0xdd,0x02,0x56,
|
|
0xc1,0x47,0xf0,0x0e,0xe4,0xc0,0x66,0xf8,0x44,0xfe,0x1f,0x43,0x7c,0x51,0xf2,0x09,
|
|
0xa9,0xa5,0x29,0xfb,0xd2,0xae,0xe6,0x93,0xe6,0x97,0x16,0x94,0x16,0x96,0x16,0x97,
|
|
0xd6,0x96,0xd6,0x95,0x66,0x48,0x1b,0x48,0x1b,0x96,0x76,0xaf,0x6b,0x4d,0xdd,0x27,
|
|
0xd2,0xa5,0x97,0x48,0x2f,0xd5,0xfd,0xf1,0x0a,0x69,0x6f,0x3d,0x6f,0x3e,0xa7,0xfb,
|
|
0xcb,0x4b,0x72,0x3f,0x2f,0xf7,0x3c,0xb9,0x97,0x4b,0x57,0x48,0x37,0x4a,0x3f,0xd4,
|
|
0xfd,0x2e,0xa8,0xf6,0x18,0xa9,0xf6,0x1d,0xa5,0x76,0x3a,0x52,0xed,0x38,0x42,0xfb,
|
|
0x43,0xda,0x1f,0xad,0xfd,0xa3,0xa4,0xa3,0xa5,0x63,0xa4,0x37,0x4a,0xc7,0x4a,0x6f,
|
|
0x92,0xde,0xac,0xf8,0xf2,0x2b,0xbe,0x82,0x8a,0xaf,0xb0,0xf6,0x8f,0xd3,0xfe,0x02,
|
|
0xda,0x5f,0x48,0xfb,0x8b,0x68,0xff,0x2d,0xd2,0x5b,0xa5,0xb7,0x49,0x6f,0x97,0xde,
|
|
0x21,0xbd,0x53,0x3a,0x5e,0xf1,0x15,0x57,0x7c,0x25,0xe5,0x2e,0x21,0x77,0x29,0xb9,
|
|
0xcf,0x90,0xfb,0x4c,0xb9,0x4b,0xcb,0x7d,0x96,0xdc,0x15,0xe4,0x3e,0x5b,0xe9,0xa9,
|
|
0xa8,0xf8,0x27,0x68,0x7f,0xac,0xf6,0x9f,0xa3,0xfd,0x95,0xb4,0xff,0x2e,0xe9,0xdd,
|
|
0xd2,0x7b,0xa4,0xf7,0x4a,0x27,0x4a,0xef,0x93,0xde,0xaf,0xf8,0xaa,0x28,0xbe,0x6a,
|
|
0x8a,0x2f,0x5e,0xfb,0x1f,0xd0,0xfe,0xaa,0xda,0x1f,0xa7,0xfd,0xd5,0xb5,0x7f,0x92,
|
|
0xf4,0x41,0xe9,0x43,0xd2,0x87,0xa5,0x8f,0x48,0x1f,0x95,0x3e,0xa6,0xf8,0x92,0x14,
|
|
0x5f,0x8a,0xe2,0x4b,0x93,0x7f,0xb2,0xfc,0x53,0xe5,0x5f,0x43,0xfe,0xb5,0xe4,0x5f,
|
|
0x47,0xfe,0xf5,0xe4,0x5f,0x5b,0xfe,0x75,0xe5,0x5f,0x5f,0xfe,0x99,0xf2,0x6f,0x24,
|
|
0x77,0x43,0xb9,0xb3,0xe4,0x6e,0x2e,0xf7,0x79,0x72,0xb7,0x90,0xbb,0xa5,0xdc,0x17,
|
|
0xc8,0x7d,0xa1,0xe2,0x6d,0x2f,0xff,0xb6,0xf2,0x6f,0x27,0xff,0x0e,0xf2,0xef,0x24,
|
|
0xff,0x4b,0xe5,0xdf,0x59,0xfe,0xdd,0xe4,0x7f,0xb9,0xfc,0x7b,0xaa,0x1c,0x26,0x6b,
|
|
0x7f,0x77,0xed,0xef,0xa1,0xfd,0xbd,0xb4,0x7f,0x8a,0xf4,0x71,0xe9,0x13,0xd2,0x27,
|
|
0xa5,0x4f,0x49,0x9f,0x96,0x3e,0xa3,0xf8,0xae,0x54,0x7c,0x7d,0x15,0x5f,0x7f,0xed,
|
|
0x9f,0xaa,0xfd,0x7d,0xb4,0xbf,0x9f,0xf6,0x0f,0xd0,0xfe,0x69,0xd2,0x67,0xa5,0xd3,
|
|
0xa5,0xcf,0x49,0x9f,0x97,0xbe,0x20,0x9d,0x21,0x9d,0x2d,0x5d,0x26,0xfd,0x5a,0x3a,
|
|
0x4f,0xe7,0x5b,0xe3,0xdd,0xd7,0x75,0xbe,0x77,0xb4,0x7f,0x85,0xf4,0x7b,0x85,0xfb,
|
|
0x58,0xe1,0x3e,0x51,0xb8,0xcd,0x65,0xdd,0x71,0x9d,0x07,0xcb,0xbb,0xfa,0x90,0xf4,
|
|
0x05,0xe9,0x1a,0xe9,0x3b,0xd2,0xb7,0xa5,0x91,0x1a,0x0f,0x8a,0x91,0x16,0x94,0x9e,
|
|
0x2d,0xad,0x28,0x6d,0x20,0x6d,0x24,0x6d,0x22,0x6d,0x26,0xed,0x27,0xed,0x26,0xcd,
|
|
0x96,0x0e,0x94,0x0e,0x91,0x5e,0x25,0x1d,0x2e,0xbd,0x5a,0x3a,0x52,0x3a,0x4a,0xba,
|
|
0x45,0xfa,0xa9,0xf4,0x46,0xe9,0x58,0xe9,0x38,0xe9,0x2d,0xd2,0xad,0xd2,0x6d,0xd2,
|
|
0xe7,0xa4,0xcf,0x4b,0x5f,0x90,0xce,0x90,0xee,0x92,0xee,0x96,0x7e,0x29,0xdd,0x83,
|
|
0x4e,0x4a,0xa0,0xfd,0x27,0xb8,0x7a,0x9e,0xf4,0x7c,0x69,0x6b,0xe9,0x05,0xd2,0x0b,
|
|
0xa5,0xed,0xa5,0x17,0x49,0x2f,0x96,0x5e,0x22,0xbd,0x4c,0xda,0x45,0xda,0x4d,0xda,
|
|
0x43,0xda,0x4b,0xda,0x5b,0x9a,0x0d,0x0f,0xc2,0x40,0xb9,0x07,0xcb,0x3d,0x44,0xee,
|
|
0xa1,0x72,0x0f,0x93,0xfb,0x6a,0xb9,0xaf,0x91,0x7b,0x84,0xdc,0xd7,0xc9,0xfd,0xa8,
|
|
0xf4,0x1b,0xe9,0x73,0xd2,0x17,0xa4,0x33,0xa5,0xb3,0xa5,0x2f,0x4a,0x5f,0x92,0xce,
|
|
0x97,0xbe,0x2c,0x7d,0x55,0xba,0x48,0xba,0x44,0xba,0x4c,0xfa,0x86,0x74,0x85,0xf4,
|
|
0x4d,0xe9,0x5a,0xa5,0xeb,0x5d,0xb9,0xd7,0xcb,0xfd,0x9e,0xdc,0x1f,0xc8,0xbd,0x41,
|
|
0xee,0x0f,0xe5,0xfe,0x48,0xee,0x1c,0xb9,0x3f,0x96,0xfb,0x7b,0xe9,0x0f,0xd2,0x83,
|
|
0xd2,0x43,0xd2,0x9f,0x4d,0x9a,0x8b,0x06,0x9c,0x07,0xc1,0xe8,0xc3,0xd2,0xe9,0x50,
|
|
0xa9,0x58,0xc0,0x89,0x2f,0xe6,0x6a,0x75,0xa8,0x57,0x22,0xe0,0xb4,0x80,0x0e,0x70,
|
|
0x1e,0xcc,0x2c,0x19,0x70,0x5e,0x85,0x97,0xe1,0x15,0x58,0x08,0x8b,0x60,0x46,0x29,
|
|
0xfc,0x4a,0xb9,0xfa,0x0a,0x24,0x9c,0x1e,0x70,0x6a,0x02,0xa7,0x72,0xd2,0xa1,0x01,
|
|
0x5c,0x0c,0x9d,0x45,0x57,0xb8,0x06,0x9e,0x15,0x73,0xc5,0x3c,0xf1,0xb2,0x30,0x63,
|
|
0xb1,0x66,0xbc,0x68,0xa3,0xe3,0xbe,0x67,0xfc,0xc1,0xf8,0xf3,0xbb,0xf3,0x15,0xf1,
|
|
0x2a,0x2c,0x86,0x25,0xf0,0x1a,0xbc,0x0e,0xf7,0xf0,0xfb,0xf4,0x5e,0x98,0x08,0xf7,
|
|
0xc1,0x0c,0x98,0x09,0x4b,0x61,0x39,0xbc,0x0b,0x5b,0x60,0x3b,0x7c,0x29,0xbe,0x12,
|
|
0xa6,0x1f,0x19,0x60,0xda,0xaa,0x79,0x8f,0x66,0xda,0xa8,0x18,0x6a,0x9e,0x37,0xcd,
|
|
0x6f,0x14,0x71,0xad,0x79,0x9f,0x66,0xde,0xa5,0x89,0x9b,0xc4,0xcd,0x62,0x9c,0x7e,
|
|
0x8f,0xde,0x2e,0xcc,0x6f,0xc7,0x29,0xa6,0x0f,0x36,0xcf,0xb7,0xa6,0xcf,0x32,0xed,
|
|
0x9a,0xe7,0xd3,0x31,0x70,0x33,0xdc,0x0a,0xd5,0x43,0x3c,0x63,0x42,0x7b,0xe8,0x28,
|
|
0xba,0xc0,0x38,0xb8,0x0b,0x16,0xc2,0x62,0xb1,0x14,0x96,0xc1,0xeb,0xf0,0x06,0xac,
|
|
0x10,0x6b,0x61,0x17,0xec,0x85,0xaf,0xa1,0x28,0xcf,0xb0,0x67,0x40,0x39,0xa8,0x0f,
|
|
0x19,0xa2,0x01,0x34,0x87,0x16,0xd0,0x19,0xba,0x40,0x6f,0xe8,0x0f,0x03,0x20,0x5b,
|
|
0x0c,0xd4,0xf3,0xf0,0xfb,0xe2,0x03,0xc8,0x81,0xcd,0xb0,0x1d,0x3e,0x83,0x1d,0xf0,
|
|
0x39,0xec,0x84,0x5d,0xb0,0x07,0xbe,0x82,0xbd,0xb0,0x0f,0x0e,0xc2,0x21,0x38,0x0c,
|
|
0xbf,0x88,0xa2,0xd1,0x2e,0xc5,0x44,0x71,0xa8,0x0e,0x09,0xd0,0x1c,0x5a,0xc2,0x53,
|
|
0xf0,0x34,0xcc,0x84,0x59,0x62,0x09,0xbc,0x09,0xab,0x60,0x17,0xec,0x86,0x03,0xf0,
|
|
0x0d,0x7c,0x0b,0x87,0xc4,0x4f,0xc2,0xc9,0xc7,0xf3,0x12,0x9c,0x02,0xa7,0xc3,0x19,
|
|
0xa2,0x34,0xc4,0xc2,0xd9,0xe2,0x1c,0xa8,0x04,0x95,0xc5,0xb9,0x10,0x07,0x19,0x70,
|
|
0x11,0x74,0x84,0x4e,0xd0,0x05,0xae,0x84,0x6c,0xb8,0x19,0x6e,0x81,0xf1,0x70,0x3f,
|
|
0x3c,0x06,0x93,0x61,0x25,0xbc,0x29,0x56,0xc1,0xa7,0xb0,0x0d,0x82,0xfc,0x4e,0x88,
|
|
0x10,0x91,0x90,0x0e,0xb5,0x44,0x6d,0x51,0x47,0xd4,0x15,0xf5,0x20,0x03,0x1a,0x40,
|
|
0x53,0x68,0x06,0xe7,0x41,0x4b,0x71,0x3e,0xb4,0x82,0xd6,0xa2,0x0d,0x74,0x80,0x8b,
|
|
0xa0,0x2b,0x74,0x83,0xee,0xd0,0x13,0x06,0xc0,0x40,0x31,0x08,0x46,0xc2,0x28,0x31,
|
|
0x1a,0xc6,0xc0,0x58,0xb8,0x1d,0xc6,0xc3,0x04,0xb8,0x07,0xa6,0xc2,0xb3,0x30,0x13,
|
|
0x66,0x8b,0x97,0x60,0x01,0xbc,0x2a,0x16,0x0a,0xf3,0xbb,0x68,0x09,0x2c,0x85,0xd7,
|
|
0x61,0x05,0xac,0xd4,0x6f,0x25,0xf3,0x3b,0x69,0x8d,0x78,0x5b,0x6c,0x10,0x39,0xf0,
|
|
0x31,0x6c,0x86,0x4f,0x61,0x2b,0x6c,0x83,0x1d,0xb0,0x17,0xf6,0xc1,0x7e,0x38,0x2c,
|
|
0x7e,0x16,0x81,0xfc,0x94,0x2b,0x44,0x88,0x10,0xe4,0x87,0x22,0x50,0x14,0x4a,0x40,
|
|
0x65,0xa8,0x02,0x09,0x90,0x04,0xc9,0x90,0x0a,0x69,0x50,0x13,0xd2,0xa1,0x8e,0xa8,
|
|
0x07,0x19,0xd0,0x00,0x32,0xa1,0x09,0x34,0x85,0x16,0xd0,0x12,0xda,0x88,0x8e,0x70,
|
|
0x09,0x5c,0x26,0x7a,0xc2,0x00,0xc8,0x86,0x81,0x30,0x08,0x86,0xc0,0x55,0x62,0x14,
|
|
0x8c,0x86,0x31,0x62,0x2c,0xdc,0x01,0xe3,0xe1,0x2e,0xb8,0x07,0xa6,0xc2,0xb3,0x30,
|
|
0x13,0x66,0xc3,0x1c,0x98,0x0b,0x0b,0xe0,0x55,0xb1,0x50,0x2c,0x82,0x25,0xb0,0x14,
|
|
0xde,0x80,0x15,0xb0,0x12,0xde,0x14,0xab,0xe1,0x2d,0x58,0x23,0xd6,0x8a,0x2d,0xf0,
|
|
0x29,0x6c,0x85,0x6d,0xb0,0x03,0xf6,0xc2,0x41,0x71,0x08,0x7e,0x81,0x40,0x01,0x97,
|
|
0x20,0x44,0x40,0x08,0x0a,0x42,0x11,0x28,0x0a,0x25,0xa0,0x32,0x54,0x81,0x04,0x48,
|
|
0x82,0x64,0x48,0x85,0x74,0xa8,0x23,0xea,0x8a,0x7a,0xa2,0xbe,0xc8,0x10,0x0d,0xa0,
|
|
0x11,0x34,0xd1,0xef,0xe6,0x16,0xfa,0xdd,0xdc,0x52,0xb4,0xd3,0x6f,0xea,0x0e,0xe2,
|
|
0x12,0xb8,0x14,0x3a,0x43,0x57,0xe8,0x06,0xdd,0xa1,0x27,0x0c,0x80,0x81,0x62,0xb4,
|
|
0x18,0x23,0xc6,0xc2,0xad,0x70,0x27,0x4c,0x80,0xbb,0x61,0x22,0x4c,0x82,0x07,0xe1,
|
|
0x61,0xf1,0x28,0x3c,0x06,0x4f,0xc0,0x93,0x30,0x15,0x9e,0x85,0x17,0x60,0x81,0x7e,
|
|
0xb7,0x2f,0x86,0x25,0x62,0x29,0x2c,0x83,0xe5,0xb0,0x52,0xbf,0xf1,0xcd,0xef,0xfb,
|
|
0x35,0x62,0xad,0xd8,0x20,0x76,0xc0,0xde,0x02,0x66,0x40,0xd9,0x25,0x00,0x11,0x10,
|
|
0x29,0x42,0x50,0x10,0x0a,0x43,0x51,0x28,0x0e,0x95,0xa1,0x0a,0xa4,0x43,0x1d,0x51,
|
|
0x57,0xd4,0x83,0x0c,0x68,0x00,0x8d,0xa0,0xb1,0xde,0x27,0x34,0x87,0x96,0xd0,0xae,
|
|
0xa0,0xfb,0x8e,0xe1,0x22,0xb8,0x18,0x2e,0x81,0x4b,0xa1,0x0b,0x74,0x85,0x6e,0xd0,
|
|
0x1d,0x7a,0xc2,0x00,0x18,0x29,0x46,0x89,0xd1,0x30,0x06,0xc6,0xc2,0xed,0x70,0x27,
|
|
0x4c,0x80,0xbb,0x61,0x2a,0x3c,0x0b,0x73,0x60,0x2e,0x2c,0x80,0x57,0xc5,0x42,0xb1,
|
|
0x48,0x2c,0x16,0xe6,0x1d,0xc7,0xeb,0xb0,0x5c,0xac,0xd0,0xfb,0x8d,0x55,0x7a,0xbf,
|
|
0xf1,0x16,0xac,0xd1,0xfb,0x0e,0xf3,0xee,0x23,0x07,0x3e,0x81,0x2d,0xf0,0x29,0x6c,
|
|
0x85,0x6d,0xb0,0x03,0xf6,0xc2,0x7e,0xf8,0x1a,0x0e,0x08,0xa7,0x10,0x65,0x0a,0x41,
|
|
0x88,0x80,0x48,0x28,0x08,0x85,0xa1,0x28,0x14,0x87,0x5a,0x50,0x1b,0xea,0x40,0x5d,
|
|
0x61,0xde,0xa3,0x64,0x40,0x03,0x68,0x04,0x8d,0xa1,0xa9,0xde,0xb5,0x98,0xf7,0x2c,
|
|
0x2d,0xc5,0xf9,0xe2,0x42,0x68,0xaf,0xf7,0x30,0x86,0xce,0xd0,0x15,0xba,0x41,0x77,
|
|
0xe8,0x09,0x03,0xe0,0x1a,0xb8,0x01,0x46,0x89,0xd1,0x30,0x06,0xc6,0xc2,0x7d,0xf0,
|
|
0x20,0xcc,0x82,0x39,0xf0,0x0a,0x2c,0x14,0x4b,0x60,0xb9,0xde,0xdf,0xac,0xd2,0x7b,
|
|
0x9d,0x77,0x61,0x1d,0xbc,0x07,0x1f,0x88,0x8d,0x7a,0xd7,0xb3,0x03,0xf6,0xc2,0xd7,
|
|
0x70,0xc0,0x94,0x41,0x61,0xda,0x25,0x24,0x8a,0x24,0x48,0x86,0x14,0xa8,0x05,0x19,
|
|
0x90,0x05,0x8d,0x45,0x13,0x38,0x1f,0x5a,0x43,0x47,0x18,0x05,0xa3,0xe1,0x46,0x71,
|
|
0x13,0xdc,0x0a,0xb7,0xc3,0x13,0xf0,0x94,0x78,0x06,0x66,0xc2,0x2c,0x31,0x1b,0xe6,
|
|
0xc0,0x8b,0xf0,0x2a,0x2c,0x14,0x4b,0xe0,0x75,0x58,0x2e,0x56,0xc2,0xdb,0xb0,0x16,
|
|
0x3e,0x84,0x1c,0xd8,0x0c,0x4e,0x11,0x97,0xd3,0xe0,0x74,0x28,0x07,0xe7,0x42,0xaa,
|
|
0xa8,0x21,0xd2,0x45,0x3d,0xa8,0x0f,0x19,0xd0,0x04,0x9a,0x41,0x5f,0x18,0x08,0xd7,
|
|
0xc3,0x0d,0x62,0x24,0xdc,0x08,0x37,0xc1,0xcd,0x30,0x0e,0x6e,0x87,0x3b,0xe0,0x7e,
|
|
0x98,0x04,0xaf,0xc2,0x72,0xe1,0x14,0xa5,0xcd,0x41,0x55,0xa8,0x06,0x71,0x90,0x00,
|
|
0x89,0x22,0x09,0x6a,0x40,0x4d,0x91,0x0e,0xb5,0xa0,0x36,0xd4,0x81,0xba,0x50,0x0f,
|
|
0xea,0x8b,0x0c,0x68,0x06,0xad,0xa1,0x1d,0xb4,0x87,0x0e,0x70,0x11,0x74,0x84,0x8b,
|
|
0xe1,0x52,0xb8,0x0c,0xba,0x40,0x57,0xd1,0x0d,0x2e,0x87,0x1e,0xd0,0x13,0x7a,0x41,
|
|
0x3f,0xe8,0x0f,0xd9,0x30,0x10,0x86,0xc0,0x55,0x30,0x0a,0x46,0x8b,0x31,0x70,0x23,
|
|
0x8c,0x85,0x9b,0xe0,0x66,0xb8,0x1d,0xee,0x10,0x77,0x8a,0xf1,0x62,0x02,0x4c,0x82,
|
|
0x07,0xe1,0x61,0x78,0x44,0x4c,0x86,0x37,0x60,0x85,0x58,0x23,0xd6,0xc2,0x21,0x38,
|
|
0x2c,0x7e,0x82,0x5f,0xc0,0x29,0x46,0xbb,0x29,0x4e,0xbb,0x81,0x96,0xd0,0x1a,0xda,
|
|
0xc3,0x45,0xe2,0x62,0xb8,0x14,0xba,0xc0,0x38,0xb8,0x15,0xee,0x80,0x09,0x30,0x13,
|
|
0x66,0xc3,0x5c,0x98,0x0f,0x8b,0x60,0x89,0x58,0x06,0x6f,0xc0,0x4a,0xf8,0x00,0x36,
|
|
0x42,0xd1,0x12,0xb4,0x67,0x28,0x05,0xa7,0xc1,0xc5,0x70,0x29,0x74,0x86,0xde,0x30,
|
|
0x10,0x46,0xc2,0x78,0x98,0x0c,0xdf,0xc2,0x0f,0xf0,0x13,0x04,0x4a,0x52,0x4f,0x4e,
|
|
0xa1,0x8d,0xc2,0x0d,0x30,0x0a,0x1e,0x84,0xc9,0xb0,0x0b,0xbe,0x82,0x7d,0xb0,0x1f,
|
|
0x7e,0x00,0xe7,0x54,0xb2,0x06,0xc5,0xa1,0x24,0x94,0x12,0x65,0x21,0x11,0x92,0x20,
|
|
0x19,0x52,0x44,0x06,0xb4,0x81,0x0b,0xa0,0x2d,0x74,0x81,0xbe,0xd0,0x1f,0xb2,0x61,
|
|
0x10,0x0c,0x86,0x91,0x30,0x07,0x5e,0x84,0xb9,0xf0,0x92,0x98,0x07,0x0b,0x61,0x11,
|
|
0xbc,0x01,0xcb,0xc5,0x0a,0x58,0x09,0x6f,0xc2,0x7a,0xd8,0x20,0x72,0xc4,0xc7,0x62,
|
|
0x0b,0x7c,0x01,0x05,0x4e,0xa3,0x4b,0x84,0x22,0xa2,0x28,0x9c,0x0e,0xe5,0x20,0x13,
|
|
0x1a,0x8a,0x46,0x30,0x1c,0x46,0xc2,0x8d,0x30,0x16,0x6e,0x82,0x9b,0x61,0x2a,0x4c,
|
|
0x13,0xcf,0x8a,0x99,0xf0,0x2d,0x38,0xa7,0x3b,0x4e,0x19,0x28,0x07,0x15,0x20,0x16,
|
|
0x2a,0x42,0x25,0xa8,0x0c,0xe7,0x42,0x55,0x48,0x80,0x44,0x48,0x12,0xc9,0x50,0x13,
|
|
0xd2,0xa1,0x36,0x34,0x86,0x56,0xd0,0x1a,0xfa,0x41,0x36,0x0c,0x81,0x91,0x30,0x1d,
|
|
0x66,0xc2,0x9b,0xb0,0x16,0x3e,0x84,0x8f,0x84,0x73,0x06,0xcf,0xf6,0x70,0x2a,0x9c,
|
|
0x06,0xa7,0xc3,0x19,0x50,0x5a,0x94,0x83,0x0b,0xa1,0x9d,0x68,0x2f,0x3a,0x88,0x8b,
|
|
0xe0,0x32,0xe8,0x22,0xba,0x8a,0x6e,0xa2,0x3b,0x5c,0x0e,0x3d,0xa0,0x2f,0xf4,0x83,
|
|
0x41,0x30,0x18,0x46,0xc0,0x0d,0x62,0x24,0xdc,0x02,0x13,0x60,0x12,0x3c,0x23,0x66,
|
|
0xc2,0x42,0x58,0x0c,0x1f,0xc3,0x16,0xd8,0x0d,0x4e,0x69,0xee,0x4f,0xe6,0xbd,0xb9,
|
|
0x08,0x41,0x32,0xa4,0x88,0x54,0x91,0x06,0xb5,0xf4,0x0e,0xde,0x50,0x47,0xd4,0xd5,
|
|
0xfb,0xf7,0x4c,0x61,0xde,0xc1,0x37,0x82,0x2c,0x38,0x0f,0x5a,0x43,0x47,0xe8,0x03,
|
|
0x83,0x61,0x24,0x8c,0x82,0xd1,0x62,0x0c,0x4c,0x86,0x29,0xe2,0x71,0x78,0x0a,0x9e,
|
|
0x86,0x67,0x60,0x2a,0x4c,0x83,0x67,0xc5,0x74,0x78,0x1e,0x5e,0x80,0x19,0x30,0x13,
|
|
0x16,0xc0,0xcb,0xf0,0x19,0xec,0x10,0x9f,0x8b,0x9d,0xf0,0x05,0xec,0x82,0x2f,0x61,
|
|
0x8f,0xf8,0x4a,0xec,0x85,0xfd,0xf0,0x35,0x1c,0x00,0xe7,0x4c,0xea,0x0e,0x9c,0x0d,
|
|
0x55,0xa1,0x1a,0x24,0x43,0x0a,0xa4,0x42,0x1a,0xd4,0x80,0x0c,0x68,0x06,0x2d,0xa1,
|
|
0x15,0xb4,0x86,0x8e,0x70,0x31,0x0c,0x83,0xe1,0x70,0x1d,0x8c,0x84,0x5b,0x61,0x02,
|
|
0xbc,0x0c,0x0b,0x61,0x31,0xac,0x85,0x75,0xf0,0x1e,0x6c,0x81,0x4f,0xc5,0x56,0xd8,
|
|
0x09,0x5f,0xc0,0x97,0xb0,0x47,0x7c,0x05,0x07,0xe0,0x1b,0xf1,0x2d,0x7c,0x07,0xdf,
|
|
0x8b,0x1f,0xe0,0x20,0x1c,0x12,0xce,0x59,0xa4,0x1f,0xaa,0xc1,0x95,0xd0,0x07,0x86,
|
|
0xc1,0x70,0x71,0x35,0x3c,0x08,0x0f,0xc1,0x62,0x58,0x02,0xbf,0x9c,0xe5,0xce,0x01,
|
|
0x37,0xef,0xf5,0xcd,0x18,0xb8,0x79,0x7f,0x6f,0xc6,0x66,0xcd,0x7b,0x66,0x33,0x26,
|
|
0x6d,0xde,0x27,0x9b,0x31,0x4f,0xf3,0x9e,0xb8,0xa3,0xe8,0x24,0x2e,0x15,0xe6,0x5d,
|
|
0xf1,0x75,0x65,0xdd,0xb1,0x0f,0x33,0xae,0x6c,0xc6,0x86,0xcd,0x38,0xfb,0x22,0x61,
|
|
0xde,0xad,0x9a,0x71,0x66,0x33,0xc6,0x6b,0xc6,0xcd,0xcd,0x18,0xee,0xfa,0xb2,0xee,
|
|
0x58,0xed,0xa6,0xb2,0xee,0x18,0xab,0x19,0xef,0x36,0xef,0x5e,0xcd,0x38,0xa7,0x19,
|
|
0x2b,0x35,0xe3,0xd4,0x05,0xcb,0xd1,0x7f,0x40,0x7d,0xc8,0x80,0x0b,0xc5,0x40,0x71,
|
|
0x83,0x98,0x00,0x0f,0xc3,0x5a,0xc8,0x81,0x4f,0xc5,0x67,0xb0,0x0f,0x82,0xe5,0x5d,
|
|
0xa2,0x45,0x7e,0x28,0x01,0xa5,0xc4,0x69,0xe2,0x74,0x38,0x0b,0xce,0x16,0x15,0x45,
|
|
0x65,0x51,0x05,0xe2,0x20,0x5e,0x54,0x87,0x14,0x48,0x35,0xef,0x6e,0x21,0x5d,0xd4,
|
|
0x81,0xfa,0x90,0x05,0xcd,0xe0,0x7c,0xd1,0x05,0x46,0xc3,0x18,0xb8,0x11,0xc6,0xc2,
|
|
0x38,0x70,0xaa,0x39,0xce,0xb5,0x30,0x02,0xae,0x83,0xeb,0x61,0x3b,0xec,0x86,0xaf,
|
|
0x60,0x2f,0xec,0x87,0xaf,0xe1,0x00,0x38,0x71,0x8e,0x73,0x0e,0x54,0x12,0x71,0x22,
|
|
0x01,0x7a,0xc1,0x00,0x71,0x83,0x18,0x09,0xf7,0xc1,0x64,0x78,0x1a,0xa6,0xc2,0x0b,
|
|
0x30,0x13,0x5e,0x82,0xf9,0xb0,0x08,0x96,0xc0,0x72,0x58,0x09,0x6f,0xc3,0x5a,0xf8,
|
|
0x00,0x36,0xc2,0x27,0xb0,0x05,0x7e,0x81,0x50,0x82,0x4b,0x94,0x88,0x16,0xe5,0xe1,
|
|
0x5c,0xa8,0x02,0x71,0x10,0x0f,0xd5,0x21,0x11,0x52,0xa1,0x26,0xd4,0x82,0xda,0xa2,
|
|
0x8e,0x68,0x00,0xf7,0xe9,0xfd,0xa0,0x79,0x97,0xf8,0x10,0x3c,0x0c,0x8f,0xe8,0x3d,
|
|
0xe9,0x63,0x62,0x8a,0xde,0x23,0xfe,0x28,0x0e,0xeb,0x7d,0xe2,0x2f,0x22,0x94,0xc8,
|
|
0xf9,0x20,0x11,0xee,0x84,0xc9,0xb0,0x18,0xf6,0xc1,0x2f,0xe0,0xa4,0xe0,0x6e,0x89,
|
|
0x9e,0xcf,0x7d,0x74,0x32,0xd7,0x5e,0x9c,0x02,0xb7,0x3f,0x49,0x7e,0xe1,0x7b,0xf8,
|
|
0x01,0x7e,0x02,0xe7,0x29,0xee,0x61,0x4f,0x53,0x0f,0x45,0x51,0x28,0x0b,0xe5,0xe0,
|
|
0x5c,0xa8,0x02,0x55,0x21,0x03,0xfa,0x41,0x7f,0x31,0x40,0x0c,0x81,0xeb,0xe0,0x06,
|
|
0x31,0x12,0x1e,0x82,0x87,0xe1,0x11,0x78,0x14,0x1e,0x83,0xc9,0xf0,0x19,0xec,0x80,
|
|
0xbd,0xb0,0x0f,0xf6,0xc3,0xa9,0xcf,0x70,0x3e,0xa8,0x00,0x03,0x20,0x5b,0x0c,0x84,
|
|
0x9b,0x61,0x9c,0xb8,0x0d,0xee,0x84,0xf1,0x62,0x02,0xe4,0xc0,0x7e,0xf8,0x06,0xbe,
|
|
0x85,0xef,0xe0,0x7b,0xf1,0x03,0x1c,0x84,0x43,0xe2,0x47,0x08,0x4c,0xa5,0x8d,0x88,
|
|
0x08,0x08,0x41,0x94,0x88,0x86,0xfc,0x50,0x40,0x14,0x84,0x0a,0x10,0x0b,0x67,0xc3,
|
|
0x39,0x50,0x11,0x2a,0x89,0x6a,0x22,0x03,0x06,0xc3,0x48,0x18,0x05,0xa3,0x61,0x0e,
|
|
0xbc,0x08,0xaf,0xc1,0xeb,0xf0,0x06,0xac,0x85,0x0f,0x61,0x0b,0xec,0x87,0xaf,0xe1,
|
|
0x7b,0xf8,0x51,0xfc,0x04,0x3f,0xc3,0x2f,0xc2,0x99,0xe6,0x38,0x31,0x90,0x1f,0xce,
|
|
0x81,0x8a,0x10,0x07,0x09,0xd0,0x18,0x9a,0x40,0x1b,0xb8,0x00,0xda,0x42,0x17,0x18,
|
|
0x01,0x23,0x61,0x34,0x8c,0x11,0x37,0xc2,0x6c,0x98,0x23,0x5e,0x84,0xb9,0xf0,0x12,
|
|
0x2c,0x80,0x97,0xe1,0x15,0x78,0x15,0x16,0xc2,0x22,0x58,0x02,0xef,0x88,0xb5,0xf0,
|
|
0x21,0x6c,0x81,0xed,0xf0,0x99,0xd8,0x21,0x3e,0x87,0xbd,0xb0,0x0f,0x0e,0xc2,0x21,
|
|
0xf8,0x79,0x9a,0xfb,0xd2,0xb9,0x32,0x9c,0x0b,0xf1,0x50,0x1d,0x12,0x20,0x11,0x92,
|
|
0x20,0x19,0x52,0x20,0x15,0xd2,0x20,0x03,0x32,0xa1,0xa1,0x68,0x04,0x2d,0xe0,0x3c,
|
|
0xd1,0x52,0xb4,0x86,0x8e,0xd0,0x05,0x06,0x40,0xb6,0x18,0x08,0x43,0xe1,0x1a,0x71,
|
|
0xad,0x18,0x21,0xae,0x13,0xd7,0xc3,0x0c,0x98,0x29,0x66,0x89,0xd9,0xf0,0x22,0xcc,
|
|
0x85,0x97,0x60,0x1e,0xcc,0x87,0x05,0xb0,0x10,0x16,0xc1,0x62,0x58,0x22,0x96,0x8a,
|
|
0x65,0x62,0x13,0xe4,0xc0,0xc7,0x62,0x0b,0xec,0x82,0xdd,0xe2,0x4b,0xd8,0x03,0x5f,
|
|
0xc1,0x5e,0xf8,0x5a,0x1c,0x80,0x6f,0xe0,0x5b,0xf1,0x9d,0x08,0x4c,0xa7,0x5e,0x42,
|
|
0x0c,0x14,0x86,0x62,0x70,0x0a,0x94,0x83,0x8a,0x50,0x19,0xe2,0x21,0x01,0x2e,0x86,
|
|
0x4b,0xa0,0x33,0x74,0x81,0x2b,0xa0,0xb7,0xc8,0x86,0xc5,0xb0,0x04,0xb6,0xc2,0x36,
|
|
0xd8,0x0e,0x9f,0x89,0x1d,0xf0,0x39,0xec,0x14,0x5f,0xc0,0x2e,0xf8,0x52,0xec,0x11,
|
|
0xfb,0xe0,0x20,0x38,0xcf,0xf1,0xfb,0x74,0x03,0x65,0x07,0xcb,0x61,0x35,0xfc,0x08,
|
|
0x66,0x52,0x6e,0xbf,0x43,0x9c,0x0f,0x3e,0x34,0x13,0x73,0x7f,0x24,0xfd,0x50,0x02,
|
|
0x4e,0x85,0xb3,0x44,0x19,0x51,0x16,0x2a,0x43,0x15,0x48,0x83,0x9a,0x50,0x07,0xea,
|
|
0x89,0x0c,0x68,0x00,0x0d,0xa1,0x11,0x34,0x86,0x59,0xb0,0x1e,0xea,0xfe,0x44,0x3d,
|
|
0x80,0xf1,0x70,0x37,0xac,0x80,0x7d,0xf0,0xa3,0x99,0x20,0xfb,0x33,0xcf,0xe1,0x50,
|
|
0x0e,0xaa,0x43,0x32,0xa4,0x40,0x4b,0x68,0x05,0xd9,0x30,0x04,0x86,0xc2,0x61,0x28,
|
|
0xfa,0x0b,0xf7,0x44,0x28,0x0f,0xb5,0xa0,0xbe,0x68,0x00,0x17,0x43,0x0f,0xd1,0x13,
|
|
0x06,0x40,0xb6,0x18,0x08,0x8f,0xc0,0xa3,0xf0,0x18,0x4c,0x86,0x45,0xb0,0x0c,0x56,
|
|
0xc0,0x2a,0x78,0x07,0xd6,0xc1,0x06,0xf8,0x08,0x72,0xcc,0xc4,0x5c,0x27,0xe0,0x14,
|
|
0x80,0x42,0x50,0x11,0x2a,0x43,0x2d,0xa8,0x03,0x75,0xa1,0x3e,0xb4,0x84,0xd6,0x70,
|
|
0x29,0x8c,0x84,0x43,0x90,0x11,0x08,0x38,0x43,0xe0,0x27,0x31,0x32,0x18,0x70,0x1e,
|
|
0x86,0xc9,0xb0,0x16,0xb6,0x08,0xf3,0xb1,0x45,0x59,0x88,0x83,0x0c,0x68,0x20,0x32,
|
|
0xa1,0x19,0x34,0x17,0xad,0xe1,0x2a,0x18,0x0a,0xd7,0xc0,0x48,0x78,0x04,0x26,0xc3,
|
|
0x6b,0xb0,0x12,0xde,0x81,0x77,0xe1,0x7d,0xf3,0x01,0x47,0x64,0xc0,0x69,0x05,0xad,
|
|
0xe1,0x11,0x98,0x0c,0xd3,0x60,0x26,0xac,0x87,0x8d,0xf0,0xa3,0xf9,0xc0,0x2e,0x14,
|
|
0x70,0x2a,0x41,0x02,0x74,0x87,0x6c,0xb8,0x06,0x46,0xc0,0xad,0x70,0x3b,0xdc,0x0d,
|
|
0xf7,0xc2,0x44,0xb8,0x1f,0xa6,0xc0,0x13,0x30,0x0b,0xe6,0xc0,0x02,0x78,0x05,0x5e,
|
|
0x85,0x25,0x70,0xc0,0x7c,0xf0,0x11,0x15,0x70,0xd2,0xa2,0xc9,0x13,0xb4,0x83,0x2e,
|
|
0xd0,0x0b,0x46,0xc2,0x58,0xb8,0x19,0x66,0xc2,0x6c,0x78,0xd9,0x7c,0x00,0x92,0x2f,
|
|
0xe0,0x84,0x20,0x9f,0xc8,0x0f,0xa9,0x50,0x03,0x6a,0x42,0x1d,0x51,0x1f,0xda,0x41,
|
|
0x17,0x18,0x0a,0x23,0xe1,0x51,0xd8,0x02,0x5f,0xc3,0x37,0xf0,0xad,0xf9,0x20,0x30,
|
|
0x26,0xe0,0x94,0x82,0x72,0x90,0x0e,0x19,0xd0,0x11,0x46,0xc2,0x3c,0x58,0x04,0x8b,
|
|
0xcd,0x07,0x27,0xf9,0x5d,0x02,0x10,0x01,0x21,0x88,0x82,0x82,0x50,0x04,0x8a,0x42,
|
|
0x09,0x28,0x05,0xa7,0xc2,0xe9,0x90,0x0a,0x35,0xa1,0x16,0xd4,0x17,0x5d,0x60,0x04,
|
|
0x8c,0x84,0x87,0x61,0x09,0xac,0x80,0x37,0x61,0x3b,0x7c,0x06,0x3b,0xcc,0xb9,0x0a,
|
|
0x70,0x3c,0x64,0x40,0x3b,0xe8,0x02,0x83,0x60,0x24,0xdc,0x95,0xfb,0xe1,0x4b,0xc0,
|
|
0x69,0x0a,0x23,0x61,0x36,0x2c,0x81,0xaf,0xcd,0x07,0x8d,0x85,0x02,0x4e,0x2c,0x9c,
|
|
0x0d,0x95,0x20,0x01,0xd2,0x21,0x03,0x9a,0x41,0x73,0x68,0x09,0xe7,0x8b,0x56,0xa2,
|
|
0x35,0xf4,0x80,0xde,0xd0,0x0f,0x06,0x88,0x6c,0x18,0x0b,0x23,0x0b,0x53,0x2f,0x60,
|
|
0x3a,0x3c,0x07,0x33,0x61,0x16,0x2c,0x83,0xd7,0xe1,0x0d,0xb1,0x1c,0x56,0xc0,0x21,
|
|
0xf8,0xc5,0x7c,0x48,0x59,0x24,0xe0,0x9c,0x09,0x95,0x44,0x02,0x64,0x41,0x63,0x68,
|
|
0x0d,0xd9,0x30,0x0a,0x46,0xc3,0x58,0x98,0x09,0xaf,0xc3,0x16,0xf8,0xce,0x7c,0xc0,
|
|
0x53,0xd4,0x25,0x20,0x82,0x22,0x02,0x6a,0x40,0x4d,0x68,0x0c,0x3d,0x61,0x00,0x64,
|
|
0x8b,0x81,0x30,0x08,0x06,0xc3,0x10,0xb8,0x4a,0xdc,0x00,0xa3,0x60,0xb4,0x18,0x03,
|
|
0x33,0x60,0x26,0xcc,0x86,0x39,0xf0,0x12,0xcc,0x83,0xf9,0xb0,0x40,0x63,0xbc,0xcb,
|
|
0xc4,0x5a,0xd8,0x09,0xfb,0xe0,0xa0,0x49,0x5b,0x31,0xd2,0x03,0x11,0x50,0x51,0xe3,
|
|
0xbf,0x55,0xa1,0x9a,0x88,0x83,0x14,0x48,0x83,0xfa,0xd0,0x48,0x64,0x41,0x63,0x68,
|
|
0x22,0x5a,0xc3,0x20,0x18,0x2c,0x86,0x8a,0x91,0x30,0x0a,0x46,0x8b,0x31,0x30,0x1b,
|
|
0xe6,0xc0,0x5c,0x78,0x09,0x16,0xc1,0x62,0x58,0x02,0x4b,0xe1,0x75,0x78,0x13,0xde,
|
|
0x82,0xb7,0xc5,0x3b,0x62,0x2d,0x7c,0x08,0x1f,0x89,0x1c,0x61,0x3e,0x56,0x2d,0x06,
|
|
0x25,0xa0,0x2a,0x54,0x83,0x78,0xa8,0x0e,0x89,0x90,0x04,0xc9,0x90,0x22,0x52,0x45,
|
|
0x1a,0xd4,0x80,0x7a,0xa2,0x3e,0x64,0x40,0x03,0x31,0x12,0x6e,0x82,0x71,0xe2,0x56,
|
|
0xb8,0x03,0xc6,0xc3,0x23,0xf0,0x18,0x4c,0x85,0x99,0xf0,0x09,0x6c,0x16,0x5b,0x60,
|
|
0x2b,0x6c,0x83,0x5d,0xb0,0x0f,0x0e,0x9a,0x0f,0x6a,0x4b,0x50,0x0f,0x20,0x08,0x11,
|
|
0x10,0x82,0x82,0x50,0x04,0x8a,0x42,0x09,0xa8,0x0c,0x55,0x20,0x01,0x92,0x20,0x19,
|
|
0x52,0x21,0x1d,0x6a,0x43,0x1d,0xa8,0x2b,0xcc,0x38,0x7d,0x7d,0xc8,0x10,0x0d,0xa0,
|
|
0x11,0x34,0x81,0xa6,0x1a,0xc3,0x6f,0x09,0xad,0x45,0x07,0x71,0x29,0x74,0x85,0x6e,
|
|
0xd0,0x1d,0x7a,0x42,0x5f,0xc8,0x86,0x21,0x30,0x12,0x6e,0x81,0xdb,0xc4,0x9d,0x62,
|
|
0x02,0xcc,0x85,0x79,0x62,0x3e,0xbc,0x0c,0xaf,0xc0,0x12,0x58,0x26,0xde,0x10,0x2b,
|
|
0x60,0x15,0xbc,0x05,0x6b,0xe0,0x6d,0xf1,0x8e,0x58,0x2b,0xde,0x15,0xeb,0xc4,0x7a,
|
|
0xf1,0x29,0x6c,0x35,0x1f,0xb0,0x95,0xe4,0xba,0x41,0x2a,0xd4,0x80,0x9a,0x50,0x1f,
|
|
0x32,0xa0,0x01,0x64,0x42,0x23,0xc8,0x12,0x8d,0x45,0x13,0x68,0x0e,0xad,0xa1,0x23,
|
|
0x5c,0x26,0x3a,0x43,0x57,0x18,0x69,0xe6,0x30,0x94,0x74,0xe7,0x37,0xcc,0x86,0x39,
|
|
0x30,0x1f,0x16,0x88,0x97,0xad,0x39,0x0f,0x66,0xbe,0xc3,0x62,0x58,0x02,0x4b,0xc5,
|
|
0x32,0x78,0x0d,0x5e,0x87,0x37,0x60,0x85,0x58,0x0b,0x1f,0x9a,0xf8,0x4b,0x05,0x9c,
|
|
0x17,0x34,0x3f,0x62,0x16,0xcc,0x86,0xb9,0x30,0x5f,0xf3,0x25,0x5e,0x85,0x85,0xb0,
|
|
0x48,0x2c,0x86,0x25,0xb0,0x11,0x36,0x41,0x0e,0x7c,0x6c,0x3e,0xdc,0x3b,0x85,0xba,
|
|
0x0c,0x09,0x90,0x04,0xc9,0x50,0x0b,0x6a,0x43,0x1d,0xa8,0x2b,0xea,0x89,0xfa,0x90,
|
|
0x01,0x8d,0x44,0x6b,0xe8,0x08,0x23,0xe1,0x59,0x98,0x2e,0x9e,0x13,0xcf,0x8b,0x17,
|
|
0x60,0x06,0xcc,0x84,0xb9,0xf0,0x92,0x98,0x27,0xe6,0x8b,0x25,0xf0,0x26,0xac,0x85,
|
|
0x6d,0xe6,0xc3,0xf0,0x53,0x03,0xce,0x19,0x70,0x96,0x28,0x23,0xca,0x8a,0x72,0x50,
|
|
0x1e,0x2a,0xc0,0x39,0x50,0x51,0x54,0x82,0xaa,0x90,0x00,0xe9,0x90,0x01,0x8d,0xcd,
|
|
0x07,0x8a,0xa7,0xe1,0x0f,0xd5,0x20,0x1e,0xaa,0x43,0x0d,0xa8,0x29,0xd2,0xa1,0x16,
|
|
0x4c,0x86,0xcd,0xb0,0x05,0xbe,0x80,0x5f,0x20,0xea,0xf4,0x80,0x13,0x23,0x0a,0x42,
|
|
0x09,0x28,0x05,0xa7,0xc0,0x69,0x50,0xfd,0x74,0x77,0x9e,0x4a,0x2a,0xd4,0xd0,0x7c,
|
|
0x95,0xda,0x50,0x07,0xea,0x8a,0x7a,0xa2,0xbe,0xc8,0x10,0x0d,0x44,0xa6,0x68,0x28,
|
|
0x5a,0x43,0x47,0x98,0x0c,0xcf,0xc0,0xb3,0xb0,0x16,0xde,0x85,0xf5,0xf0,0x1e,0x6c,
|
|
0x80,0x8f,0x60,0x13,0xe4,0xc0,0x66,0xd8,0x22,0x3e,0x15,0xdb,0xc4,0x76,0x91,0xfb,
|
|
0x71,0x3d,0x04,0x20,0x3f,0x14,0x80,0x24,0x48,0x86,0x9a,0x90,0x2e,0x6a,0x89,0xda,
|
|
0x50,0x0f,0x9a,0x88,0xd6,0xa2,0x0d,0xb4,0x87,0x0e,0x70,0x11,0x74,0x84,0x4e,0x70,
|
|
0x09,0xdc,0x02,0xb7,0xc2,0x7d,0x70,0xbf,0x78,0x00,0x26,0xc1,0x23,0x62,0x26,0xfc,
|
|
0x00,0x5d,0x4a,0xbb,0x74,0x15,0xdd,0xe0,0x72,0xe8,0x21,0x7a,0x8a,0x5e,0x62,0x09,
|
|
0x6c,0x81,0x7d,0x70,0xd0,0x7c,0x60,0x7a,0x26,0xcf,0x3d,0x90,0x1f,0xe2,0xa1,0xba,
|
|
0x48,0x80,0x34,0xa8,0x09,0x75,0xa1,0x9e,0xa8,0x2f,0x32,0x44,0x6b,0xe8,0x08,0x83,
|
|
0x60,0x3c,0xdc,0x0d,0xcf,0xc0,0x34,0xf1,0x2c,0xcc,0x84,0x59,0x62,0x36,0xcc,0x81,
|
|
0x17,0xc5,0x5c,0x78,0xc9,0x2c,0x30,0x70,0x16,0xf5,0x04,0xf2,0x41,0x0c,0x14,0x80,
|
|
0x04,0x48,0x84,0x34,0xa8,0x25,0xea,0x40,0x5d,0xa8,0x0f,0x59,0xd0,0x58,0x34,0x11,
|
|
0xad,0xa1,0x23,0x74,0x81,0x1e,0xd0,0x0b,0xae,0x80,0x2b,0xe1,0x16,0xb8,0x15,0xee,
|
|
0x84,0x09,0x70,0x17,0xdc,0x03,0xf7,0xc2,0x44,0x71,0x9f,0xb8,0x5f,0x3c,0x20,0x26,
|
|
0xc3,0x34,0x98,0x09,0x1b,0xe1,0x43,0xf1,0x11,0x6c,0x82,0x2d,0xf0,0x85,0xd1,0x32,
|
|
0x3c,0x37,0xc1,0x01,0xf8,0x06,0xbe,0x85,0xef,0xcc,0x82,0x09,0x65,0xa9,0x33,0x10,
|
|
0x14,0x11,0x22,0x12,0x8a,0x42,0x71,0x48,0x86,0x14,0x48,0x85,0x34,0xa8,0x05,0xf5,
|
|
0xa0,0x3e,0x64,0x88,0x06,0x22,0x53,0xb4,0x86,0x8e,0x70,0xb1,0x98,0x29,0xcc,0xe2,
|
|
0x0c,0x93,0xcc,0x87,0xbc,0x67,0x07,0x9c,0xfe,0x30,0x12,0x1a,0x9e,0x43,0xbe,0xab,
|
|
0x73,0xed,0x73,0x3f,0x9c,0xe5,0x3a,0xa7,0x10,0xa7,0x68,0x00,0x8d,0xa1,0x09,0xb4,
|
|
0x83,0x2e,0x70,0xc8,0x2c,0x4c,0xd0,0x08,0x7f,0xf3,0xa1,0x6a,0x57,0xfa,0x11,0x28,
|
|
0x03,0xe7,0x42,0x15,0xa8,0x06,0x71,0x50,0x1d,0x12,0x20,0xdd,0x7c,0xd0,0x79,0x05,
|
|
0x75,0xe6,0x4a,0xe2,0x84,0xcb,0xa0,0x0b,0xf4,0x86,0x6c,0x58,0x04,0x4b,0xe0,0x4d,
|
|
0x58,0x0b,0x7b,0x60,0x1f,0x7c,0x63,0x3e,0xb0,0xef,0x43,0x3c,0x90,0x00,0x69,0x90,
|
|
0x01,0x0d,0xa1,0x35,0x74,0x84,0xee,0x30,0x0c,0xae,0x83,0xf1,0x66,0x7f,0x3f,0xf2,
|
|
0x0f,0x0d,0xe1,0x4a,0xe8,0x03,0x7d,0x21,0x1b,0xae,0x86,0x8c,0xfe,0x3c,0x9b,0xc1,
|
|
0x64,0x98,0x0f,0xaf,0xc0,0x7a,0xf3,0xa1,0xfe,0x00,0xee,0x3f,0xd0,0x4a,0xb4,0x16,
|
|
0x6d,0xe0,0x66,0x18,0x0f,0x77,0xc3,0x3d,0xf0,0x18,0x6c,0x81,0x4f,0x61,0x9b,0xd8,
|
|
0x2e,0xf6,0xc1,0x7e,0xf8,0x1a,0x0e,0xc0,0x37,0xf0,0x9d,0xf9,0x60,0x34,0x9b,0xdf,
|
|
0x41,0xb7,0xd3,0xef,0x41,0x99,0x3b,0x28,0x77,0xf8,0x1a,0xf6,0xcd,0x20,0x1c,0x7c,
|
|
0x0b,0x3f,0xc2,0x4f,0xf0,0xb3,0x59,0x10,0x60,0x26,0x7d,0xf0,0x2c,0xfa,0x10,0xd1,
|
|
0x1a,0x2e,0x80,0x76,0xe2,0x72,0xe8,0x05,0xd9,0xf0,0xe3,0x6c,0x77,0xa2,0xdd,0x95,
|
|
0x90,0x0d,0x23,0x60,0x24,0x8c,0x83,0x09,0x30,0x09,0x1e,0x81,0x47,0x61,0xdf,0x5b,
|
|
0xb4,0x6f,0x30,0x8b,0x61,0xc4,0x41,0x02,0x34,0x86,0x1e,0xef,0xd2,0x1f,0x40,0x2f,
|
|
0xe8,0x0d,0xfd,0x60,0x10,0x5c,0x0b,0xa3,0x61,0x2c,0xdc,0x06,0xcf,0xc2,0xf3,0x90,
|
|
0xb9,0x8e,0xfb,0x95,0xf9,0x80,0xf8,0xbd,0x80,0x73,0x21,0xb4,0x87,0x87,0xe1,0x51,
|
|
0x78,0x0c,0x1e,0x17,0x4f,0xc1,0xd3,0x30,0x0d,0x9e,0x83,0x17,0x60,0x01,0xbc,0x22,
|
|
0x16,0xc2,0x6b,0xf0,0x06,0x84,0xde,0x0f,0x38,0xd1,0x90,0x1f,0x0a,0x41,0x49,0x38,
|
|
0x05,0xce,0x84,0x32,0x90,0x0e,0xb5,0xa1,0x1e,0x64,0x40,0x23,0x68,0x2c,0x9a,0x43,
|
|
0x6b,0xb8,0x00,0x9e,0xfa,0x80,0x67,0x3d,0x58,0x02,0xcb,0xe0,0x23,0xc8,0x81,0x43,
|
|
0x70,0x18,0x4a,0x6e,0x20,0x5e,0x48,0x81,0x34,0x38,0x1f,0x5a,0x43,0x7f,0xc8,0x86,
|
|
0x71,0x70,0x2b,0x4c,0x85,0x67,0x61,0x19,0xbc,0x0e,0xab,0xe1,0x6d,0xf8,0xc5,0x7c,
|
|
0xf8,0xf9,0x11,0xc7,0x42,0x6d,0xe8,0x0b,0x57,0x89,0x1b,0xc5,0x43,0xf0,0x18,0x4c,
|
|
0x81,0x19,0xe6,0x03,0xca,0xcd,0xf4,0x5f,0x90,0x5f,0x14,0x80,0x32,0x70,0x0e,0x54,
|
|
0x31,0x1f,0x84,0x6e,0xa1,0x9f,0x83,0x7c,0x70,0x1a,0x94,0x86,0xf2,0x10,0x0b,0x67,
|
|
0x43,0x45,0xa8,0x02,0x09,0xd0,0x0f,0xc6,0x0b,0xf3,0x31,0x60,0x35,0x48,0x80,0x34,
|
|
0xa8,0x01,0x75,0x21,0x03,0x9a,0xc1,0xf9,0x62,0xc2,0x56,0xae,0x1b,0xbc,0x20,0x96,
|
|
0xc0,0x6e,0xf8,0x12,0xf6,0xc2,0x3e,0x38,0x08,0x6b,0xb7,0xf3,0x1c,0x0c,0xbb,0xc5,
|
|
0x97,0xb0,0x17,0xf6,0xc1,0x41,0x58,0xfb,0x19,0xed,0x13,0xbe,0x82,0xbd,0xb0,0x4f,
|
|
0xec,0x87,0x43,0xb0,0x64,0x07,0xcf,0xd7,0xb0,0x05,0xb6,0xc2,0x36,0xb1,0x1d,0x3e,
|
|
0x83,0x1d,0xe2,0x73,0xd8,0x03,0x5f,0xc1,0x5e,0xd8,0x07,0xdf,0xc0,0xb7,0xe2,0x67,
|
|
0xf1,0x8b,0xd8,0xf2,0x39,0xc7,0xc1,0x4e,0xd8,0x0d,0x7b,0xe0,0x2b,0xd8,0x07,0x3f,
|
|
0x9b,0x05,0x0a,0x76,0x72,0x8d,0x60,0x2d,0x7c,0x60,0x16,0x6a,0xf9,0x82,0x3e,0x00,
|
|
0x1a,0x41,0x73,0x68,0x21,0x5a,0x43,0x47,0xf3,0xe1,0xff,0x57,0xf4,0xb3,0x10,0x82,
|
|
0xb2,0x50,0x1e,0x2a,0xc0,0xd9,0xa2,0x92,0x38,0x17,0x92,0x20,0x05,0x6a,0x40,0xba,
|
|
0xa8,0x2d,0x32,0x45,0x13,0xd1,0x4c,0xb4,0x10,0x2d,0xa1,0x15,0xb4,0x81,0x0b,0xe0,
|
|
0x42,0xd1,0x41,0x74,0x14,0x9d,0xc4,0xa5,0xa2,0xb3,0xe8,0x0a,0xdd,0xe0,0x72,0xd1,
|
|
0x0b,0xae,0x84,0xbe,0x30,0x08,0x86,0xc0,0x30,0xb8,0x1a,0x46,0xc0,0xf5,0x62,0x24,
|
|
0xdc,0x02,0xb7,0xc1,0x43,0x30,0x05,0x9e,0x80,0xa7,0x60,0x1a,0x4c,0x87,0x57,0x60,
|
|
0xdf,0x8f,0x5c,0x57,0xf3,0x21,0xb2,0x13,0x74,0x36,0x3f,0x1d,0x74,0x9c,0x67,0x82,
|
|
0xce,0x59,0xf3,0x83,0x4e,0x39,0x78,0xfe,0xed,0xa0,0x33,0x13,0xb6,0xec,0x0e,0x3a,
|
|
0xfb,0xe0,0x52,0x33,0x01,0xf7,0x07,0xf6,0x1f,0x72,0x27,0xe2,0x36,0x2f,0x11,0xc1,
|
|
0x6f,0x95,0x08,0xe7,0xea,0x94,0x88,0xdc,0x09,0x2d,0x7b,0xc1,0x9b,0x47,0x9c,0xd7,
|
|
0xfc,0xe1,0xff,0xd5,0xbc,0xe1,0xdf,0x3a,0x5f,0xf8,0x44,0xe7,0x09,0x1f,0x6f,0x7e,
|
|
0xb0,0x7f,0xde,0x6f,0x5e,0xf3,0x7d,0xbd,0xf9,0xbd,0xfe,0x79,0xbd,0xde,0x3c,0x5e,
|
|
0x6f,0xde,0x6e,0x5e,0xf3,0x75,0xbd,0x79,0xba,0xde,0xfc,0x5c,0x6f,0x5e,0xae,0x37,
|
|
0x1f,0xd7,0x3f,0x0f,0xd7,0x9b,0x7f,0xeb,0xcd,0xbb,0xf5,0xe6,0xdb,0x7a,0xf3,0x6c,
|
|
0xbd,0xf9,0xb5,0x79,0xcd,0xab,0xf5,0xcf,0xa7,0xf5,0xe6,0xcd,0x7a,0xf3,0x63,0xbd,
|
|
0x79,0xaf,0xde,0x7c,0x57,0xff,0xfc,0xd6,0x93,0x9d,0xcf,0xea,0xcd,0x63,0xf5,0xe6,
|
|
0xa7,0xfa,0xe7,0xa5,0xfa,0xe7,0xa1,0xfe,0xd6,0xf9,0xa6,0xfe,0xf9,0xa3,0xde,0x7c,
|
|
0xd1,0x93,0x9d,0x17,0xea,0xcd,0x07,0xf5,0xcf,0xef,0xf4,0xe6,0x73,0x9e,0xec,0xbc,
|
|
0x4d,0x6f,0xbe,0xa6,0x7f,0x9e,0xa5,0x37,0xaf,0xf2,0x8f,0x9e,0x4f,0xe9,0xcd,0x8f,
|
|
0x3c,0xde,0xbc,0x47,0x6f,0xbe,0x63,0x5e,0xf3,0x18,0xbd,0x79,0x8b,0x27,0x3a,0x4f,
|
|
0xd1,0x9b,0x9f,0xe8,0x9f,0x5f,0xe8,0xcd,0x27,0xcc,0x6b,0xde,0xa0,0x37,0x5f,0xd0,
|
|
0x3f,0x0f,0xd0,0x9b,0xff,0xe7,0xcd,0xf7,0x3b,0xd1,0xf9,0x7d,0xde,0x3c,0x3d,0x6f,
|
|
0x7e,0x9e,0x7f,0x5e,0xde,0xc9,0xce,0xc3,0xf3,0xe6,0xdf,0xe5,0x35,0xef,0xce,0x3f,
|
|
0xcf,0xce,0x3f,0x6f,0xce,0x9b,0x17,0xe7,0xcd,0x7f,0xf3,0xe6,0xaf,0x79,0xf3,0xd6,
|
|
0xbc,0x79,0x6a,0xde,0xfc,0x34,0x6f,0x5e,0x9a,0x37,0x1f,0xcd,0x9b,0x87,0xe6,0xcd,
|
|
0x2f,0xfb,0xbb,0xcd,0x1f,0xfb,0xa3,0xe7,0x8b,0x79,0xf3,0xc3,0xbc,0xf9,0x60,0xfe,
|
|
0x79,0x60,0xde,0xfc,0x2f,0xff,0x3c,0xae,0x93,0x9d,0x9f,0x95,0xd7,0xbc,0xac,0xe3,
|
|
0xcd,0xa7,0xf2,0xe6,0x4f,0x79,0xf3,0xa4,0xbc,0x79,0x4b,0xde,0x7c,0x24,0x6f,0x3e,
|
|
0x91,0x37,0x5f,0xc8,0x9b,0xff,0xe3,0xcd,0xfb,0xf1,0xe6,0xed,0x78,0xf3,0x71,0x4e,
|
|
0x74,0x1e,0x8e,0x37,0xcf,0xc6,0x9b,0x5f,0xe3,0xcd,0xab,0xf9,0xad,0xf3,0x68,0xfe,
|
|
0xaa,0xf3,0x67,0xf2,0x9a,0x27,0xf3,0x77,0x9f,0x0f,0x73,0xb2,0xf3,0x60,0xfe,0xa8,
|
|
0xf9,0x2f,0xc7,0x9b,0xf7,0x72,0xa2,0xf3,0x5c,0x8e,0x37,0xbf,0xe5,0x7f,0x35,0xaf,
|
|
0x25,0xaf,0xf9,0x2c,0x79,0xcd,0x5f,0xf1,0xcf,0x5b,0xf9,0xb3,0xe7,0xab,0x78,0xf3,
|
|
0x54,0xbc,0xf9,0x29,0xde,0xbc,0x14,0x6f,0xde,0x89,0x37,0xdf,0x24,0xaf,0xf9,0x24,
|
|
0xde,0xfc,0x11,0x6f,0xde,0x88,0x37,0x4f,0xc4,0x9b,0x17,0xe2,0xcd,0xf3,0xf0,0xe6,
|
|
0x77,0xf8,0xe7,0x75,0xf8,0xe7,0x73,0x78,0xf3,0x34,0xbc,0xf9,0x19,0xc7,0x9b,0x87,
|
|
0xe1,0xcd,0xb7,0xf0,0xe6,0x59,0x78,0xf3,0x2b,0xbc,0x79,0x15,0xde,0x7c,0x8a,0xe3,
|
|
0xcd,0xa3,0xf0,0xcf,0x97,0xf8,0x6f,0xcd,0x8f,0xf8,0xbd,0xf3,0x1b,0xfe,0x5b,0xf3,
|
|
0x1a,0xfc,0xf3,0x16,0xbc,0xf9,0x0a,0xde,0x3c,0x85,0xbf,0xca,0xfc,0x04,0xff,0xbc,
|
|
0x84,0x93,0x9d,0x8f,0x70,0xb2,0xf3,0x10,0xc2,0xf3,0x0f,0x8e,0x3d,0xff,0x20,0xaf,
|
|
0x79,0x06,0xc7,0x9b,0x57,0xf0,0x7b,0xe7,0x13,0x1c,0x6f,0xde,0x40,0x5e,0xf3,0x05,
|
|
0x8e,0x37,0x4f,0x20,0xaf,0xf9,0x01,0xde,0xbc,0x00,0xff,0x7c,0x00,0x6f,0xdc,0xdf,
|
|
0x1b,0xdf,0xf7,0xc6,0xf5,0xbd,0x71,0x7c,0x6f,0x7c,0xde,0x1b,0x8f,0xf7,0xc6,0xdb,
|
|
0xfd,0xe3,0xec,0xde,0xf8,0xba,0x37,0x9e,0xee,0x8d,0x9b,0x1f,0x6f,0x5c,0xdc,0x1b,
|
|
0xdf,0x3e,0xd9,0x71,0xed,0x93,0x1d,0xa7,0xf6,0xc6,0xa7,0xbd,0x71,0x67,0x6f,0xbc,
|
|
0xf9,0x44,0xc7,0x95,0xbd,0xf1,0x60,0x6f,0x1c,0xd8,0x1b,0xff,0xf5,0xc6,0x73,0xfd,
|
|
0xe3,0xb7,0xfe,0xf1,0x57,0x6f,0xdc,0xd5,0x1b,0x47,0xf5,0xc6,0x4f,0xbd,0xf1,0x50,
|
|
0x6f,0x1c,0xd4,0x1b,0xcf,0xf4,0xc6,0x2f,0xfd,0xe3,0x8f,0xde,0xf8,0xe2,0x89,0x8e,
|
|
0x2b,0x7a,0xe3,0x85,0xde,0x38,0xa1,0x7f,0x3c,0xd0,0x3f,0xce,0xe7,0x8d,0xef,0x79,
|
|
0xe3,0x7a,0xde,0x38,0x9e,0x37,0x6e,0xe7,0x8d,0xcf,0xf9,0xc7,0xe1,0xbc,0x71,0x35,
|
|
0xff,0x78,0x9a,0x37,0x4e,0xe6,0x8d,0x8f,0xe5,0x35,0xce,0xe5,0x8d,0x63,0xe5,0x35,
|
|
0x6e,0xe5,0x8d,0x43,0xe5,0x39,0xfe,0xa4,0x71,0x27,0x6f,0x7c,0xc9,0x3f,0xae,0x74,
|
|
0xb2,0xe3,0x42,0xde,0x78,0x50,0x5e,0xe3,0x40,0xfe,0x71,0x1e,0x6f,0x7c,0xc7,0x1b,
|
|
0xd7,0xf1,0xc6,0x73,0xbc,0x71,0x9c,0x13,0x1d,0xbf,0x39,0xde,0xb8,0x8d,0x37,0x5e,
|
|
0x93,0xd7,0xf8,0xcc,0x5f,0x6d,0x3c,0xe6,0xdf,0x36,0x6e,0x72,0xbc,0xf1,0x0f,0x6f,
|
|
0x5c,0xc3,0x1b,0xcf,0xf0,0xc6,0x31,0xfc,0xe3,0x17,0xde,0xb8,0x85,0x7f,0x9c,0xc2,
|
|
0x1b,0x97,0xf0,0xc6,0x23,0xfc,0xe3,0x10,0xde,0xf8,0x83,0x37,0xee,0xe0,0x8d,0x37,
|
|
0xfc,0xd6,0x71,0x06,0x6f,0x7c,0xc1,0x1b,0x57,0x08,0x8f,0x27,0xb8,0xe3,0x09,0xbf,
|
|
0x7b,0x1c,0xc1,0xac,0x3d,0x0b,0xf9,0xc1,0xfb,0x0c,0xbb,0x10,0x14,0x76,0x5f,0x65,
|
|
0x98,0x25,0x16,0x1d,0x7e,0x9e,0x3b,0xe6,0x27,0x70,0x2c,0x54,0x84,0xaa,0xee,0xcf,
|
|
0x61,0xf3,0x53,0xd7,0x89,0x07,0xb3,0xa6,0x49,0x2d,0xa8,0xad,0x75,0x4d,0x3a,0x69,
|
|
0x3c,0xe2,0x5a,0xb8,0x01,0xc6,0xc2,0x4d,0xc0,0x4f,0x3f,0x67,0x0a,0x3c,0x0e,0x4f,
|
|
0x6b,0x9c,0xc2,0x3c,0xc2,0x3f,0x0f,0x2f,0xc0,0x4c,0x98,0x0d,0x2f,0x6a,0xec,0xe2,
|
|
0x25,0x58,0xa0,0xf1,0x8b,0x57,0x34,0x86,0xb1,0x41,0x63,0x18,0xdf,0x6b,0x0c,0x63,
|
|
0x01,0x59,0x7a,0x05,0x96,0xc1,0x5a,0x58,0xa7,0x31,0x89,0xcf,0x34,0x0e,0xb1,0x57,
|
|
0x6b,0x98,0x64,0x5b,0xe3,0x10,0x66,0xfc,0xe1,0x7a,0x8d,0x3b,0xdc,0x68,0xad,0x53,
|
|
0x32,0xce,0x1a,0x73,0x30,0xe3,0x0d,0xdf,0x69,0xbc,0x61,0x8c,0xc6,0x1b,0x12,0x35,
|
|
0xc6,0x70,0x2b,0xdc,0x01,0xe3,0xb5,0x0e,0xc9,0x22,0xad,0x41,0xb2,0x44,0xeb,0x90,
|
|
0xbc,0xa6,0x75,0x48,0x96,0x5b,0x6b,0x90,0x98,0x71,0x08,0x27,0x8a,0x7f,0x90,0x0f,
|
|
0x62,0xa0,0x00,0x14,0x84,0x42,0x50,0x38,0xca,0x5d,0x9b,0xa4,0x34,0x94,0xd1,0x3a,
|
|
0x24,0x66,0x0d,0x92,0x2b,0xa1,0x0f,0xf4,0xb3,0xd6,0x1f,0x31,0x6b,0x8e,0x7c,0x0c,
|
|
0x9f,0x68,0xdd,0x91,0xcf,0xb4,0xde,0xc8,0x17,0x5a,0x6f,0xe4,0x2b,0xad,0x33,0x62,
|
|
0xc6,0x2c,0x8a,0x58,0xeb,0x89,0x24,0x68,0x9c,0xe2,0x69,0x6b,0xed,0x90,0xdd,0x1a,
|
|
0xa3,0xf8,0xce,0x5a,0x27,0xe4,0xe7,0x68,0x77,0x7d,0x10,0x6f,0x5d,0x10,0x6f,0x3d,
|
|
0x10,0x6f,0x1d,0x90,0x04,0x8d,0x53,0x98,0x35,0x40,0x2e,0xd3,0x58,0x85,0x19,0x97,
|
|
0x78,0x09,0xd6,0xc3,0x56,0xad,0xef,0x11,0x61,0xad,0xe5,0xe1,0xad,0xe1,0xd1,0x40,
|
|
0x6b,0x76,0x78,0x6b,0x75,0xb4,0xd1,0x58,0x85,0x59,0x97,0xe3,0x72,0x6b,0xed,0x8d,
|
|
0xb1,0x1a,0xa3,0xb8,0x47,0x63,0x13,0xde,0x98,0x84,0xb7,0xb6,0xc6,0x52,0xad,0xa5,
|
|
0xb1,0xda,0x5a,0x3f,0xc3,0x5b,0x37,0x63,0xb3,0xd6,0xcb,0x30,0x6b,0x65,0x7c,0x0d,
|
|
0xdf,0xc0,0x8f,0xd6,0x3a,0x19,0x01,0x6b,0x6d,0x8c,0x22,0x1a,0xa3,0xa8,0xa2,0xb1,
|
|
0x89,0x54,0x8d,0x49,0x78,0x6b,0x5f,0x34,0xd0,0x9a,0x17,0x2d,0xac,0x75,0x2e,0xbc,
|
|
0xf5,0x2d,0xb2,0x35,0x4e,0x61,0xd6,0xb3,0x18,0xaa,0x35,0x2d,0xbc,0xb5,0x2c,0xc6,
|
|
0x6b,0xac,0xe2,0x59,0x8d,0x51,0xcc,0xb5,0xd6,0xab,0x58,0xaa,0xf5,0x29,0xbc,0x75,
|
|
0x29,0xd6,0x58,0x63,0x15,0x5b,0xb5,0x06,0xc5,0x7e,0x6b,0xfd,0x09,0x6f,0xdd,0x89,
|
|
0x90,0xc6,0x2d,0x4a,0x68,0xbc,0x22,0x49,0xe3,0x14,0xde,0xba,0x12,0xf5,0xad,0x35,
|
|
0x24,0x9a,0x68,0xed,0x08,0x6f,0xcd,0x08,0x6f,0xad,0x88,0xce,0x5a,0x23,0xa2,0xa7,
|
|
0xb5,0x1e,0xc4,0x58,0x8d,0x5b,0xdc,0xad,0xf1,0x0a,0x6f,0x9c,0xe2,0x09,0x8d,0x4f,
|
|
0xbc,0xa0,0x75,0x1e,0xbc,0xf5,0x1d,0x96,0x6b,0x5d,0x87,0x35,0xd6,0x5a,0x0e,0x66,
|
|
0x1d,0x87,0x03,0x70,0x10,0x0e,0x15,0x38,0xb2,0x96,0x83,0xb7,0x86,0x43,0x61,0x8d,
|
|
0x61,0x54,0xb1,0xd6,0x69,0x68,0xa0,0xf5,0x19,0x9a,0x6b,0x5d,0x86,0x8b,0x34,0x7e,
|
|
0xd1,0x4d,0xeb,0x2f,0x0c,0x83,0xe1,0x70,0x83,0xb5,0xf6,0xc2,0x9d,0x1a,0xc3,0x78,
|
|
0x56,0x63,0x17,0xde,0xda,0x0a,0xcb,0xb5,0x66,0xc2,0x5b,0x5a,0x2b,0xc1,0x1b,0xc3,
|
|
0xd8,0xaa,0xb5,0x11,0xf6,0xab,0x63,0x0b,0x6a,0x0c,0xa3,0xb8,0xd6,0x3c,0xa8,0xab,
|
|
0x35,0x0e,0x1a,0x6b,0x6d,0x83,0x96,0xd6,0x38,0x46,0x37,0xad,0x5b,0xe0,0xad,0x53,
|
|
0x30,0x56,0xe3,0x17,0x73,0xac,0x31,0x0b,0x6f,0x2d,0x82,0x75,0xd6,0xfa,0x03,0x3b,
|
|
0xb4,0xee,0x40,0xc0,0x5a,0x6b,0xc0,0xac,0x33,0x50,0x5f,0xe3,0x19,0x66,0x6d,0x81,
|
|
0x56,0x1a,0xcb,0xf0,0xc6,0x30,0x6e,0xb7,0xc6,0x2d,0xbc,0x75,0x03,0x5e,0xb4,0xc6,
|
|
0x2c,0xbc,0x35,0x02,0xd6,0x6a,0xcc,0xc2,0x5b,0x13,0xe0,0x0c,0xad,0x03,0x90,0xa6,
|
|
0x75,0x00,0x6a,0x6a,0x1d,0x80,0x5a,0x5a,0x0b,0xa0,0x99,0xbe,0xfd,0xf7,0xbe,0xf9,
|
|
0x1f,0xab,0x6f,0xfe,0xc7,0xe9,0x5b,0x7f,0xf3,0x9d,0xff,0x22,0x7d,0xe3,0xbf,0x02,
|
|
0xde,0xd6,0x58,0x47,0x9c,0xf5,0x5d,0xbf,0xf7,0x3d,0x7f,0x6d,0x7d,0xc7,0x5f,0x5f,
|
|
0xdf,0xe9,0x5f,0xac,0xef,0xf3,0xbb,0xea,0xbb,0xfb,0xab,0xac,0x6f,0xed,0xc7,0xea,
|
|
0x1b,0x7b,0xef,0xdb,0x7a,0xf3,0xed,0xfc,0xa3,0xd6,0x98,0x87,0x19,0xef,0x68,0xae,
|
|
0xf1,0x0c,0x6f,0x1c,0xa3,0x8b,0xc6,0x2f,0x26,0x68,0xdc,0x62,0xbe,0x35,0x56,0xb1,
|
|
0x52,0x63,0x14,0xc5,0x35,0x36,0x61,0xbe,0x6b,0xef,0xa2,0xf1,0x89,0x09,0x1a,0x9f,
|
|
0x30,0x63,0x13,0x4e,0x49,0x77,0x6c,0x62,0xa4,0xc6,0x24,0x1e,0xd2,0x98,0x84,0x19,
|
|
0x7f,0x28,0xac,0xef,0xd5,0xcb,0xe9,0xfb,0xf4,0x54,0x8d,0x43,0x5c,0xa0,0x71,0x88,
|
|
0xfe,0xff,0x57,0xd9,0xb9,0x40,0x47,0x59,0x98,0x69,0x78,0x26,0x4c,0x92,0x49,0xc2,
|
|
0x25,0x56,0x11,0xaf,0x88,0x82,0x02,0xa2,0x24,0x87,0x84,0x8b,0x5c,0xe3,0x0a,0xca,
|
|
0xd9,0x2e,0x27,0x41,0x2b,0x95,0x65,0x95,0xb8,0x8a,0x56,0x6a,0x0b,0xd5,0x54,0xad,
|
|
0x5a,0x8c,0xa0,0x45,0x50,0x2c,0xa7,0xab,0xed,0xd1,0xe2,0x82,0x6b,0xbd,0x50,0x45,
|
|
0xc2,0xa2,0xd6,0xae,0x0a,0x51,0xcb,0x6a,0xab,0x14,0x14,0xad,0xbb,0x5a,0x05,0xb4,
|
|
0xed,0x52,0x95,0xca,0x4d,0x91,0x9b,0xd9,0xf7,0x9b,0xff,0xf9,0x92,0x2f,0x63,0x50,
|
|
0x3b,0x39,0x6f,0x12,0x26,0x21,0x33,0xf9,0x33,0x13,0x7e,0xde,0xef,0x7d,0x9f,0x8f,
|
|
0x1e,0x7a,0x23,0xfd,0x73,0xef,0x9d,0xaf,0x0a,0x5d,0x73,0xeb,0x99,0xbf,0x26,0xbd,
|
|
0x15,0xfa,0xe5,0xd6,0x2d,0xdf,0x26,0xa5,0x8e,0x48,0xfa,0xe5,0x5d,0xe9,0x95,0xf7,
|
|
0x62,0x3e,0x71,0x33,0x73,0x89,0xa5,0x61,0x26,0x91,0xa2,0x23,0xde,0x9b,0x6e,0x78,
|
|
0x7f,0x3a,0xe1,0xde,0x05,0xb7,0x1e,0x78,0x8d,0x34,0x96,0x2e,0xf8,0x4c,0x66,0x15,
|
|
0x4d,0x74,0xbe,0xdf,0x61,0x56,0xd1,0x83,0x8e,0xb7,0x75,0xbb,0x7b,0x86,0x2e,0xf7,
|
|
0x79,0xa1,0xbf,0xed,0xbd,0xed,0x69,0xf4,0xb5,0xaf,0x0c,0x1d,0x6d,0xeb,0x67,0x2f,
|
|
0xa1,0x97,0x9d,0xa2,0x7b,0x5d,0x1d,0xba,0xd6,0x23,0x42,0xbf,0xda,0x7b,0xd5,0x75,
|
|
0xf4,0xa8,0x1b,0xe8,0x51,0xcf,0xa6,0x2f,0xfd,0x00,0x3d,0x69,0xef,0x47,0x3f,0x1a,
|
|
0x3a,0xd0,0x5b,0xe8,0x3e,0x6f,0x0d,0x7d,0x67,0xeb,0x3a,0xef,0x3f,0x3a,0xe9,0x36,
|
|
0x57,0xd3,0x69,0x1e,0xc1,0xec,0x64,0x21,0xb3,0x11,0xeb,0x27,0x6f,0xa0,0x9f,0xec,
|
|
0xbd,0xe4,0xbf,0x86,0x2e,0xb2,0x77,0x90,0x3f,0x0d,0x73,0x12,0xeb,0x10,0xef,0x63,
|
|
0x06,0x72,0x04,0xb3,0x8f,0xf1,0xcc,0x3c,0x26,0x87,0x39,0xc7,0x54,0xe6,0x1b,0x36,
|
|
0xdb,0x78,0x86,0xb9,0xc6,0x6a,0x66,0x1b,0x36,0xd7,0x58,0xcb,0x5c,0xc3,0x66,0x1a,
|
|
0x6f,0x33,0xd3,0xd8,0xca,0x4c,0xc3,0xe6,0x19,0x07,0x38,0x39,0x2a,0x93,0xba,0x4a,
|
|
0xdd,0xa4,0x72,0xa9,0x9f,0xd4,0x5f,0x3a,0x59,0x1a,0x20,0x9d,0x22,0x9d,0x2a,0x0d,
|
|
0x94,0x2a,0xa4,0x4a,0x69,0xb0,0x34,0x56,0x1a,0x27,0x4d,0x95,0xea,0xa5,0x4b,0xa4,
|
|
0x4b,0xa5,0x6f,0x49,0x97,0x49,0xd3,0xa5,0x99,0xcc,0x4b,0x1a,0xa4,0x6b,0xa5,0xeb,
|
|
0x99,0x9b,0x34,0x4a,0xf3,0xa5,0xdb,0x98,0xa1,0x2c,0xa1,0x6b,0x9c,0x62,0x8e,0xd2,
|
|
0x89,0x39,0x4a,0x96,0x59,0xca,0x61,0xcc,0x51,0x0e,0x67,0x86,0xd2,0x93,0xf9,0xc9,
|
|
0x89,0xcc,0x4f,0xfa,0x32,0x3f,0xe9,0xcf,0x0c,0xc5,0x67,0x27,0xc3,0x99,0x95,0xd4,
|
|
0x30,0x2b,0xf9,0x47,0xe6,0x24,0x75,0xcc,0x4a,0xe6,0x49,0x0b,0xa5,0xaf,0x9d,0xa0,
|
|
0x7f,0x97,0xa4,0xc3,0xa4,0x21,0x3a,0x51,0xbc,0x4e,0xba,0x53,0xfa,0xa9,0x54,0xd3,
|
|
0x47,0x9f,0x2b,0xdd,0x22,0x2d,0x92,0xde,0x97,0x1e,0xd1,0x89,0xe4,0x32,0x3b,0x99,
|
|
0xec,0x27,0xf5,0xd7,0xbf,0x9f,0x3a,0xa9,0xfc,0x19,0x27,0x96,0x95,0x52,0xbd,0xf4,
|
|
0x67,0xe6,0x2b,0x1f,0x31,0x5f,0xd9,0xc3,0x49,0x67,0xdf,0x30,0x53,0x99,0x11,0xfa,
|
|
0xc4,0x4b,0x98,0xa3,0x34,0x31,0x3f,0x69,0x66,0x6e,0xb2,0x9e,0x79,0xc9,0x26,0x4e,
|
|
0x58,0x1b,0xa5,0x9f,0xdb,0x89,0x6b,0x85,0x9e,0xb7,0x15,0xc9,0x09,0x6c,0x9a,0x39,
|
|
0x4a,0x96,0xd9,0xc9,0xc9,0x74,0x85,0x2b,0x99,0xa1,0x0c,0x61,0x86,0x32,0x8a,0x99,
|
|
0xc9,0x5d,0xcc,0x4c,0x6c,0x5e,0xb2,0x84,0x39,0x89,0xf7,0x7f,0x0b,0x99,0x8b,0x2c,
|
|
0x94,0x9a,0x99,0x89,0x1c,0x3b,0x48,0x0f,0x15,0xa9,0x4e,0xaa,0x97,0xae,0x97,0x6e,
|
|
0x90,0x56,0x48,0xcd,0xd2,0xcb,0xd2,0x7a,0xe9,0xea,0x2a,0x1d,0x3b,0xe9,0x1d,0x69,
|
|
0x93,0xd4,0x52,0x95,0xcc,0x52,0x9a,0x99,0xa5,0xd8,0x49,0xf4,0x42,0xe6,0x27,0x5d,
|
|
0x98,0x93,0xd4,0xd0,0xed,0xbd,0x92,0x7e,0xef,0x2c,0xe6,0x22,0xff,0xce,0x3c,0xc4,
|
|
0xba,0xbb,0x3b,0xec,0x84,0x9b,0x39,0x88,0xcd,0x3b,0xe6,0x49,0xcf,0x31,0xd7,0xf0,
|
|
0x7e,0xad,0xf7,0x6a,0xbd,0x4f,0x7b,0x22,0xdd,0xd9,0x7e,0x74,0x67,0x2b,0xa5,0x61,
|
|
0xcc,0x32,0x1a,0xe8,0xd0,0x5a,0x5f,0xf6,0xf7,0xf4,0x64,0x77,0x84,0x2e,0xac,0xf5,
|
|
0x5f,0x07,0xd2,0x7b,0xb5,0xce,0xeb,0x54,0xba,0xae,0x73,0x42,0xaf,0xf5,0x09,0xfa,
|
|
0xac,0x4f,0xd3,0x63,0xb5,0xb9,0xc6,0x3b,0xa1,0xaf,0x9a,0xa2,0x8f,0x5a,0x41,0x0f,
|
|
0xb5,0x8a,0xfe,0x69,0x4d,0xe8,0x9c,0xfe,0x53,0xe8,0x99,0xfe,0x4b,0xe8,0x8e,0x36,
|
|
0x85,0x9e,0xe8,0xe3,0xf4,0x43,0x7f,0x4d,0x2f,0xb4,0x39,0x74,0x41,0xdf,0xa2,0xeb,
|
|
0xf9,0xb7,0xd0,0xe3,0x2c,0x61,0x3e,0xd1,0x8b,0xb9,0x84,0xcd,0x24,0xa6,0x33,0x7b,
|
|
0xf0,0x0e,0xa6,0x77,0x2f,0xbd,0x6b,0x69,0x73,0x88,0x26,0xe6,0x0f,0xf6,0x1f,0x94,
|
|
0x99,0xcc,0x1c,0x0e,0x0d,0x3d,0x4a,0x9b,0x35,0xf4,0x67,0xd6,0x30,0x2c,0xcc,0x17,
|
|
0xce,0x60,0xae,0x50,0xc7,0x5c,0x61,0x34,0x73,0x85,0x9f,0x30,0x4f,0x38,0x40,0x4f,
|
|
0xb2,0x9c,0x9e,0x64,0xa5,0x54,0x27,0x4d,0x94,0xce,0x96,0xbe,0x21,0x9d,0x2b,0x4d,
|
|
0x92,0xa6,0x4a,0xf5,0xd2,0xbf,0x4a,0x17,0x4b,0xdf,0x92,0x2e,0x93,0xbe,0x4d,0x97,
|
|
0xd2,0xe6,0x11,0x2d,0x52,0xba,0x45,0x3f,0x73,0xa9,0x48,0x2a,0x93,0x3a,0x4b,0x5d,
|
|
0xa4,0xae,0x2d,0x49,0xc7,0xf2,0x28,0xe9,0x68,0x7a,0x96,0x23,0x98,0x5b,0x4c,0x61,
|
|
0x6e,0xf1,0x1c,0xf3,0x88,0x57,0x99,0x43,0x6c,0x92,0xde,0x95,0xfe,0x2c,0x6d,0x91,
|
|
0xf6,0x30,0x97,0xe8,0xc2,0x3c,0x62,0x24,0x73,0x88,0x3a,0xe6,0x0f,0xb6,0x68,0x2a,
|
|
0x2d,0x15,0x48,0xc5,0xd2,0xd0,0x74,0x32,0x8f,0x58,0x20,0x2d,0x94,0x96,0x48,0xeb,
|
|
0x43,0x6f,0x72,0x09,0x5d,0xc9,0xcd,0xcc,0x27,0x4e,0x65,0xfe,0x70,0x15,0xf3,0x87,
|
|
0xc5,0xcc,0x1d,0x52,0xf4,0x1c,0x9b,0x98,0x2f,0xa4,0x98,0x2b,0xcc,0x60,0x1e,0x50,
|
|
0xc3,0x1c,0x20,0x15,0x3c,0xfe,0xa1,0xc1,0xd7,0xff,0xa6,0xf4,0x20,0x5e,0xbe,0xf9,
|
|
0xf8,0xfb,0xa4,0xe3,0xf0,0xf0,0xc7,0xe0,0xdd,0x3f,0x2d,0xbd,0x5a,0x92,0xf4,0x05,
|
|
0x0b,0xe9,0x09,0x96,0xe3,0xdb,0x1f,0x49,0x2f,0xd0,0xfa,0x80,0x35,0x52,0x1d,0xfe,
|
|
0x7d,0x33,0xfd,0xbf,0x0f,0xf0,0xeb,0x4f,0xc3,0xaf,0x3f,0x4f,0xba,0x46,0xba,0x4b,
|
|
0x5a,0x8a,0x57,0xdf,0x88,0x47,0xbf,0x17,0x8f,0xbe,0x0f,0x5d,0xbf,0xfa,0xae,0x89,
|
|
0xf7,0x6e,0x3d,0xbd,0x65,0xf8,0xef,0x29,0x7c,0x75,0xeb,0xdc,0x4d,0xc4,0x53,0xdf,
|
|
0xd4,0xad,0xad,0x57,0x57,0x40,0x8f,0xee,0x2c,0xe9,0x6c,0xba,0x74,0x37,0xd0,0x8f,
|
|
0x5b,0x49,0x17,0xce,0x7a,0x70,0x4f,0x49,0x6b,0xf1,0xd8,0xb7,0xd1,0x7d,0xeb,0x44,
|
|
0xe7,0xcd,0xbb,0x6e,0x43,0xf0,0xd8,0xad,0xc3,0xd6,0x40,0x7f,0x6d,0x36,0x3d,0xb5,
|
|
0xd5,0xf4,0xd2,0xd6,0x86,0x2e,0xda,0x66,0x3c,0xf6,0x43,0xe9,0x9a,0x0d,0x0a,0xfd,
|
|
0x32,0xeb,0x96,0x0d,0xa3,0x57,0xd6,0x18,0x7c,0xf6,0x1f,0xe3,0xaf,0x37,0x85,0xae,
|
|
0xd8,0x7b,0x74,0xc4,0x52,0x74,0xc3,0x0a,0xf1,0xda,0x0f,0xc5,0x63,0x1f,0x84,0xb7,
|
|
0x3e,0x02,0x5f,0xdd,0xbb,0x5e,0x67,0xd1,0xf1,0xaa,0x0b,0xbd,0xae,0x4b,0xe8,0x71,
|
|
0xa5,0xe8,0x49,0xd5,0xd0,0x8f,0x1a,0x17,0x3a,0x51,0xe7,0x87,0x1e,0x54,0x23,0xbd,
|
|
0xa7,0x5f,0x87,0xae,0xd3,0xea,0xd0,0x6f,0xfa,0x0d,0x7d,0xa6,0x46,0xfa,0x4b,0x4f,
|
|
0xd2,0x5b,0xf2,0xbe,0xd2,0xb3,0xf4,0x94,0x52,0xf4,0x92,0x46,0x84,0x2e,0x92,0xf5,
|
|
0x90,0x4e,0xa7,0x7f,0x54,0x8f,0xef,0xfe,0x70,0xe8,0x1c,0x3d,0x4a,0xd7,0xe8,0x89,
|
|
0xd0,0x2f,0x6a,0xc6,0x8f,0x3f,0x96,0xde,0xd0,0x09,0xa1,0x2b,0x54,0x89,0x37,0x5f,
|
|
0x11,0x7a,0x40,0x23,0xf0,0xe9,0xcd,0xa3,0x77,0x6f,0xbe,0x3b,0x9e,0xfc,0x50,0xba,
|
|
0x3d,0xa3,0x42,0x9f,0xc7,0xfa,0x3a,0x63,0xe9,0xec,0x2c,0xc1,0x9b,0x7f,0x8d,0x6e,
|
|
0xce,0x1f,0x43,0x1f,0xc7,0x7b,0x37,0xc5,0x52,0x09,0x1e,0x7d,0x15,0x7d,0x1b,0xeb,
|
|
0xd9,0x8c,0x09,0x1d,0x9b,0x89,0x74,0x6b,0x26,0xe3,0xd9,0xcf,0x0f,0x3d,0x9a,0xbb,
|
|
0xcd,0xaf,0x3f,0x2a,0xf1,0xea,0x4b,0xe9,0xba,0x0c,0xa3,0xdf,0x62,0x7d,0x96,0x99,
|
|
0xf4,0x58,0xbc,0xbf,0xe2,0xbd,0x15,0xef,0xab,0xa4,0xf0,0xef,0xcb,0xe8,0xa7,0x78,
|
|
0x2f,0x65,0x4c,0xe8,0xa2,0xd4,0xe1,0xe5,0x5f,0x8a,0x87,0xbf,0x90,0xae,0xc9,0x9d,
|
|
0xa1,0x5f,0xe2,0xbd,0x92,0x4d,0xf4,0x45,0xac,0x2b,0x62,0x1e,0x7d,0xb3,0xf4,0xba,
|
|
0xf4,0xb6,0xb4,0x59,0x6a,0x39,0x2e,0xf1,0xeb,0x67,0xe2,0xd7,0x9b,0x47,0x5f,0x59,
|
|
0x9d,0x78,0xf2,0xe6,0xc3,0xd7,0xd0,0xb3,0xf8,0x2e,0xfe,0xbb,0x75,0x2a,0x3e,0xc6,
|
|
0x83,0xb7,0x3e,0xc5,0x50,0x7a,0x14,0x53,0xf0,0xe1,0xcd,0x83,0xaf,0xc1,0x53,0xf7,
|
|
0x0e,0xc4,0x8f,0xf1,0xd4,0xcd,0x4f,0x7f,0x37,0x74,0x1d,0xb6,0xe1,0xa1,0xa7,0x6e,
|
|
0x91,0x16,0x24,0xfe,0x78,0x1d,0x3e,0xb8,0x79,0xe0,0x29,0xbc,0xef,0x46,0x3c,0xef,
|
|
0x45,0x74,0x10,0x16,0x4b,0x4b,0xcc,0xff,0xb6,0x25,0x6e,0xaf,0xa4,0x53,0xfd,0xe9,
|
|
0x1c,0x4c,0x97,0xae,0xa4,0x6f,0x30,0x87,0xbe,0xc1,0x6d,0xf4,0x0d,0x1e,0xb5,0xc5,
|
|
0x93,0xaf,0x26,0x9d,0x83,0x71,0xd2,0x26,0xeb,0x1d,0x6c,0xd0,0xf7,0xb6,0x21,0xf1,
|
|
0xd1,0x27,0xe1,0x9f,0xbb,0x6f,0xbe,0x14,0xbf,0xdc,0x7d,0x72,0xf3,0xc8,0x8b,0xf1,
|
|
0xc6,0x0f,0xc7,0x13,0x1f,0x81,0x17,0xee,0x1e,0xb8,0xf9,0xdf,0xe6,0x7d,0xbf,0x85,
|
|
0xe7,0xdd,0x1d,0xaf,0xbb,0x16,0x8f,0x7b,0x1e,0xde,0xf6,0xf3,0x78,0xda,0xd6,0x03,
|
|
0xc8,0x2d,0x4a,0x7a,0x53,0xc7,0x91,0x1e,0xc0,0x77,0xe8,0x00,0x5c,0x45,0x07,0xe0,
|
|
0x66,0x7a,0x00,0xd6,0x01,0x48,0x91,0xed,0x3f,0x9a,0x4c,0xff,0x49,0x78,0xdd,0x95,
|
|
0x78,0xdd,0x35,0xf8,0xdc,0xcd,0x64,0xf2,0x2d,0x8f,0xdf,0xf2,0x6e,0xe2,0x37,0xbf,
|
|
0x40,0xae,0x3d,0x45,0x9e,0xdd,0x73,0xec,0x17,0x48,0xdf,0xfb,0x50,0x8f,0xfd,0xad,
|
|
0x89,0xff,0x5c,0x88,0xef,0xdc,0x27,0x78,0xcd,0xd5,0xc1,0x5f,0xfe,0x87,0xe0,0x29,
|
|
0xbb,0x97,0x3c,0x31,0xf8,0xc7,0x93,0x83,0x67,0xec,0x5e,0xb1,0x7b,0xc4,0x97,0xe3,
|
|
0x0d,0xff,0x20,0xf8,0xc1,0xb7,0xe2,0x03,0xdf,0x8f,0xff,0xbb,0xcd,0xfc,0xdf,0x6d,
|
|
0xfa,0x9e,0xa4,0x25,0xd2,0x0a,0xe9,0x59,0xe9,0x15,0x5b,0xbc,0xb7,0x5d,0xcf,0x0b,
|
|
0xa9,0x5c,0xaa,0x90,0x2a,0xa5,0xe9,0xd2,0x4c,0x69,0x99,0xf4,0x17,0xfb,0xd8,0x0e,
|
|
0x1d,0x07,0xa9,0x4e,0xaa,0x97,0x52,0x3b,0xf5,0xb3,0xfe,0x44,0x5f,0x57,0x4a,0xed,
|
|
0xd6,0x6d,0x4a,0x9b,0x24,0x5b,0x90,0x5a,0x2e,0xd5,0x49,0xf5,0xd2,0x42,0xa9,0xc9,
|
|
0x96,0xa6,0xee,0x49,0xa7,0xae,0x95,0xd6,0x4a,0xf5,0x7b,0xf5,0xb5,0xa5,0x6b,0xa4,
|
|
0x46,0x69,0xa1,0xd4,0x24,0x35,0x4b,0xeb,0x6d,0xa1,0xd8,0xbe,0x74,0xea,0x8e,0x7d,
|
|
0x49,0xfe,0x3d,0xb7,0xf8,0xf7,0xc1,0x82,0x54,0xcd,0xaf,0x12,0xbf,0xda,0xbc,0x6a,
|
|
0xf3,0xa7,0xcd,0xa8,0x4d,0xa7,0xba,0xea,0xbf,0x54,0x5d,0x13,0xf3,0x24,0x95,0x98,
|
|
0x11,0xd9,0x83,0x78,0xd4,0x47,0x27,0xff,0xc5,0x6b,0xf5,0xa8,0x6d,0x5d,0xf1,0x89,
|
|
0xd2,0xc9,0x79,0x1e,0x75,0x05,0xcc,0x6d,0xf3,0xa8,0x6b,0xc8,0xcb,0xd7,0x93,0x97,
|
|
0x9f,0x25,0xdd,0x84,0x47,0xbd,0x38,0x78,0xd4,0xf7,0x27,0xa7,0xb1,0x39,0x8f,0xfa,
|
|
0x11,0x3c,0xea,0xe5,0xd2,0x0a,0x69,0x65,0xf0,0xa8,0x9f,0x0c,0x1e,0xf5,0x6a,0x32,
|
|
0xf6,0x6f,0x90,0xb1,0x37,0x8f,0x5a,0xdf,0x5e,0xea,0xbf,0xc8,0xcc,0xaf,0x23,0x33,
|
|
0xbf,0x91,0xcc,0xfc,0x56,0x3c,0xea,0x96,0x82,0x84,0xb1,0x6d,0x79,0xf9,0xef,0x93,
|
|
0x93,0xff,0x61,0xf0,0xa8,0x6f,0x0e,0x1e,0xb5,0x67,0xe3,0xef,0x25,0x0f,0x6f,0x1e,
|
|
0xf5,0xec,0x8c,0xce,0xe7,0xc9,0xc3,0x5b,0x16,0x7e,0x1e,0x1e,0xf5,0xed,0x78,0xd4,
|
|
0xcf,0xe4,0x79,0xd4,0xcf,0xe1,0x51,0xaf,0x09,0x1e,0xb5,0x65,0xe5,0x77,0x49,0x85,
|
|
0x45,0xfa,0x3f,0x00,0x1e,0x75,0x69,0x9e,0x47,0xdd,0x0d,0x76,0xf6,0x31,0x64,0xe7,
|
|
0xa7,0xc2,0xc8,0x36,0x8f,0xfa,0xf2,0xc0,0xc9,0x7e,0x1d,0x26,0xb6,0x7b,0xd4,0x7f,
|
|
0x22,0x4b,0xbf,0x05,0x8f,0x7a,0x2b,0x99,0x7a,0xe3,0x60,0x77,0x09,0xdc,0xeb,0x0a,
|
|
0x58,0xd7,0xf7,0x07,0xc6,0xf5,0xfb,0xf0,0xac,0x2d,0x43,0xbf,0x27,0x78,0xd4,0xdd,
|
|
0x03,0xbf,0xda,0xb9,0xd5,0xce,0xab,0x36,0x4e,0xf5,0x68,0x72,0xf4,0x53,0xf0,0xa8,
|
|
0x2d,0x4b,0xff,0x98,0xf4,0x02,0xfc,0xe9,0x77,0xe1,0x4f,0x9f,0x96,0xe7,0x51,0xd7,
|
|
0xc0,0x95,0x76,0xa6,0x74,0x1d,0xfc,0xe8,0x0b,0xe1,0x46,0x3b,0x23,0x7a,0x0e,0x39,
|
|
0xfa,0x85,0xe4,0xe7,0x3d,0x3b,0xef,0x0c,0xe8,0x66,0x78,0xcf,0x2f,0x06,0xce,0xb3,
|
|
0x7b,0xd4,0x6f,0x93,0x9d,0x7f,0x8f,0xec,0xfc,0x4e,0x69,0x2f,0x1e,0xf5,0x01,0x3c,
|
|
0x6a,0x67,0x38,0x97,0x92,0xa3,0xef,0x47,0x7e,0xbe,0x8a,0xdc,0xbc,0x33,0x9a,0x6b,
|
|
0xe0,0x32,0x8f,0x0f,0x3c,0x66,0xcf,0xd1,0xcf,0x80,0xbd,0xdc,0x10,0x3c,0x6a,0x67,
|
|
0x2e,0x2f,0x20,0x4f,0xff,0x10,0x39,0xfa,0x95,0x81,0xab,0xdc,0x0c,0x43,0xd9,0xf9,
|
|
0xc9,0x2f,0x07,0x8f,0x7a,0x33,0x9c,0xe4,0x6d,0xc1,0xa3,0x76,0x3e,0x72,0x27,0xb2,
|
|
0xf5,0xe5,0x64,0xea,0x2b,0xc9,0xd2,0x3b,0xff,0x78,0x74,0xf0,0xa8,0xc7,0xc2,0x37,
|
|
0x76,0xb6,0xb1,0x33,0x8d,0xcf,0x27,0x5f,0x6f,0x0c,0xe3,0xab,0x83,0x47,0x3d,0x9f,
|
|
0x5c,0xfd,0x9d,0x21,0x4f,0xbf,0x98,0x0c,0xfd,0x2f,0xc9,0xce,0x3b,0x87,0xf8,0x39,
|
|
0xd8,0xc3,0x2f,0xe7,0x79,0xd4,0x3b,0xa4,0x4f,0xf3,0x3c,0x6a,0x67,0x0d,0x77,0x26,
|
|
0x67,0xdf,0x2f,0xe4,0xeb,0x6b,0x60,0x08,0x8f,0x87,0x1d,0x3c,0x89,0xac,0xfd,0x85,
|
|
0x30,0x82,0x67,0xe0,0x51,0xcf,0x0a,0x8c,0xe0,0xdb,0xc8,0xd9,0x3f,0x44,0xbe,0xde,
|
|
0x19,0xc0,0xbf,0x81,0xeb,0xfb,0x12,0x3c,0xdf,0x3f,0xe0,0x51,0x6f,0x86,0xdf,0xfb,
|
|
0x11,0x39,0xfb,0x34,0x39,0xfb,0x72,0xf2,0xf5,0x23,0xe1,0xf0,0x8e,0x85,0xbf,0xeb,
|
|
0xec,0xdd,0x5a,0xf2,0xf5,0x17,0x05,0x9e,0xee,0x1c,0x32,0xf6,0x2b,0x42,0xb6,0xde,
|
|
0x99,0xb9,0xaf,0x04,0x4e,0xee,0x46,0xd8,0xb8,0xbb,0xba,0xb4,0x31,0x71,0xab,0xe0,
|
|
0xe0,0x8e,0x21,0x67,0x6f,0xec,0xdb,0x29,0x21,0x6b,0x3f,0x3f,0xe4,0xeb,0x9d,0x6f,
|
|
0xbb,0x32,0x30,0x6d,0x3d,0x53,0xbf,0x16,0x7e,0xad,0x65,0xea,0x7b,0xc0,0xac,0xad,
|
|
0x3e,0x88,0x47,0x3d,0x8a,0xac,0xfd,0xe5,0x81,0x4d,0x7b,0x13,0x1e,0xf5,0x5c,0x72,
|
|
0xf7,0x3f,0x83,0x43,0xbb,0x06,0x8f,0xfa,0x65,0xe9,0xcd,0x6e,0x09,0x83,0xd6,0xf9,
|
|
0xb3,0xce,0x9d,0x1d,0x0e,0x6b,0x76,0x34,0x2c,0xd9,0xc9,0x64,0xf3,0xeb,0xc9,0xe2,
|
|
0x37,0x04,0x26,0xec,0x4d,0x70,0x60,0x9d,0x01,0xeb,0x8c,0xd7,0x35,0xc1,0xa3,0x1e,
|
|
0x4f,0xe6,0xde,0xf3,0xf6,0xe7,0x93,0xb1,0x5f,0x40,0xb6,0xfe,0xf1,0x90,0xa9,0x5f,
|
|
0x43,0x8e,0xbe,0x9c,0xfc,0xfc,0x3f,0xc3,0x5d,0xbd,0x9e,0xfc,0xfc,0x5d,0xe4,0xe7,
|
|
0x0f,0xe0,0x51,0x5b,0x66,0xbe,0x91,0xcc,0xfc,0x22,0x32,0xf2,0x9d,0xc9,0xc8,0x1f,
|
|
0x46,0x46,0xde,0xb8,0xa9,0x43,0xc8,0xc9,0x9f,0x43,0x4e,0x7e,0x26,0x9c,0xd4,0x95,
|
|
0x81,0x8f,0xfa,0x4c,0x60,0xa2,0xbe,0x08,0x07,0xf5,0xcd,0x3c,0x8f,0xda,0xd8,0xa7,
|
|
0x7b,0xa4,0x52,0xf8,0xa7,0x5d,0xe1,0x9e,0x5e,0x43,0x7e,0xfe,0x47,0x81,0x6b,0xfa,
|
|
0x4b,0x32,0xf3,0x3d,0x61,0x98,0x9e,0x04,0xbb,0x74,0x40,0x60,0x96,0x0e,0x83,0x53,
|
|
0x6a,0x1e,0xf5,0x38,0x32,0xf5,0x0d,0x64,0xe9,0x7f,0x0b,0x8b,0xb4,0xe5,0xc8,0x24,
|
|
0x4b,0x7f,0x44,0x60,0x90,0x9e,0x1b,0x3c,0xea,0x0b,0xf2,0x3c,0xea,0x8b,0x61,0x8a,
|
|
0x5e,0x11,0x58,0xa2,0xf3,0xe0,0x87,0x2e,0x93,0x9a,0x8f,0x4a,0x18,0xa1,0x55,0xc1,
|
|
0xa3,0x1e,0x1e,0x3c,0x6a,0xe7,0x7f,0x7e,0x5d,0x9a,0x0e,0xe7,0xf3,0x7a,0x38,0x9f,
|
|
0xf7,0xc2,0xf3,0x7c,0x30,0x70,0x3c,0x97,0x05,0x56,0xe7,0xff,0xc1,0xe7,0xfc,0x30,
|
|
0x78,0xd4,0xdb,0x61,0x71,0x0e,0x80,0xbd,0x39,0x18,0xe6,0xa6,0xf1,0x36,0x6f,0x21,
|
|
0xbf,0xff,0x02,0xfc,0xcc,0x0d,0x81,0x9f,0xb9,0x25,0x30,0x33,0x9d,0x95,0xb9,0x3b,
|
|
0x70,0x31,0x2d,0x9f,0xbf,0x07,0xce,0x65,0x77,0xf2,0xf9,0xe3,0xc8,0xe5,0x7f,0x33,
|
|
0xcf,0xa3,0xfe,0x21,0xf9,0xfb,0xa7,0x83,0x47,0xfd,0x2c,0xd9,0x7b,0xcb,0xdd,0xaf,
|
|
0x23,0x77,0x6f,0x99,0xfb,0x8d,0x64,0xee,0x3f,0x22,0x73,0x6f,0x79,0xfb,0xcf,0xa4,
|
|
0x52,0x98,0x95,0xee,0x51,0xf7,0xfd,0x0a,0x1e,0x75,0xb5,0x74,0x06,0x1e,0xf5,0x05,
|
|
0x78,0xd4,0x17,0x77,0xe0,0x51,0xcf,0x08,0x1e,0xf5,0x0f,0xa4,0xeb,0xa4,0x59,0x78,
|
|
0xd4,0xf3,0xa4,0x5b,0xa5,0xdb,0xc9,0xf8,0xaf,0x86,0x7d,0x99,0xc6,0xa3,0x2e,0xc2,
|
|
0xa3,0x2e,0x21,0xeb,0x7f,0x58,0xc8,0xfa,0x5b,0xc6,0xbf,0xf7,0x17,0x78,0xd4,0x9e,
|
|
0xf1,0xb7,0x2c,0xff,0x08,0xb2,0xfc,0x63,0xc9,0xf2,0x4f,0x90,0x6a,0xa5,0xa9,0x64,
|
|
0xf7,0x6f,0x95,0x0e,0x39,0xa1,0xcd,0xa3,0x1e,0xdc,0x5b,0xe7,0x7e,0xd2,0x1d,0x78,
|
|
0xd4,0x27,0xf5,0xd1,0x79,0x87,0x34,0x57,0xfa,0xb9,0xf4,0x57,0xe9,0xe1,0x93,0x12,
|
|
0x8f,0xba,0xa5,0xaf,0xd4,0x4f,0x8f,0x25,0x9d,0x50,0xde,0x29,0xb5,0x48,0x03,0x75,
|
|
0x62,0x79,0x01,0xf9,0xff,0xf7,0xc9,0xff,0x6f,0x27,0xff,0xdf,0x72,0x4a,0x5b,0xfe,
|
|
0xff,0x54,0x32,0xff,0x33,0xf1,0xa8,0x7f,0x4a,0xd6,0xff,0x51,0x32,0xfe,0xab,0xc8,
|
|
0xf6,0xff,0x9e,0x4c,0xff,0x3b,0xb0,0x2c,0xcf,0x1e,0xa8,0xc7,0xbc,0xb4,0x53,0x7a,
|
|
0x5d,0x27,0xaf,0xfb,0xf0,0xa8,0x33,0x64,0xfb,0x7b,0x91,0xed,0x3f,0x15,0x96,0x65,
|
|
0x25,0x19,0xff,0xa1,0x64,0xfa,0xc7,0x90,0xe9,0xbf,0x9b,0x4c,0xff,0x62,0x3c,0x6a,
|
|
0xe7,0x54,0x5a,0x7e,0xbf,0x82,0xdc,0xbe,0x65,0xf6,0xdf,0x93,0x8e,0x19,0xa4,0xe7,
|
|
0xbb,0x54,0x2b,0x4d,0x95,0xae,0x93,0x66,0x49,0x4d,0xd2,0x6a,0xe9,0x25,0x69,0x9d,
|
|
0x74,0x55,0x95,0x8e,0x9d,0xf4,0xb6,0xb4,0x51,0xfa,0x0c,0x8f,0xda,0xb2,0xfe,0x2d,
|
|
0xd2,0xfe,0xc5,0x49,0xbe,0xff,0xbf,0x7f,0x91,0xe4,0xf8,0xbb,0x91,0xdf,0xb7,0xcc,
|
|
0xfe,0x15,0x78,0xd4,0xce,0x9f,0xbc,0x07,0xd6,0xe4,0x47,0xb0,0x25,0x77,0x4b,0xc7,
|
|
0x87,0x5c,0xfe,0x6a,0xe9,0x77,0x81,0x03,0xe9,0xfc,0x47,0xe7,0x3e,0xf6,0x09,0x8c,
|
|
0xc7,0x01,0x78,0xd4,0x43,0xa5,0xd3,0xc8,0xda,0x5f,0x0d,0xd3,0x71,0x0d,0x2c,0xc7,
|
|
0xed,0x81,0xd9,0x78,0x22,0x7c,0xc6,0x33,0xe1,0x32,0x9e,0x43,0xce,0x7e,0x76,0xe0,
|
|
0x2f,0x3e,0x0e,0x73,0xf1,0x29,0x58,0x8b,0x6b,0x61,0x2b,0x3a,0x57,0xd1,0x72,0xf6,
|
|
0xfd,0xe0,0x25,0x56,0xc2,0x49,0xac,0x86,0x8f,0xe8,0x6c,0xc4,0xaf,0x07,0x8f,0x7a,
|
|
0x72,0x60,0x1c,0x2e,0x0f,0x1e,0xf5,0x63,0x64,0xec,0x9f,0x24,0x63,0xbf,0x3a,0xcf,
|
|
0xa3,0xfe,0x00,0x16,0xa1,0xf3,0x06,0x8b,0xc8,0xd0,0x1f,0x4e,0x76,0x7e,0x20,0xd9,
|
|
0xf8,0x6f,0x07,0x56,0xa0,0x33,0x02,0x9d,0x09,0x68,0x2c,0xc0,0xfb,0xc8,0xc8,0x5b,
|
|
0x3e,0xfe,0x3b,0xe4,0xe2,0x8b,0x42,0x1e,0xbe,0x27,0x59,0xf8,0xfe,0x64,0xe1,0x3d,
|
|
0x07,0x7f,0x3a,0xd9,0xf7,0x5a,0xe9,0x59,0x72,0xef,0x63,0xc8,0xbd,0x5b,0xe6,0x7d,
|
|
0x3f,0x1e,0xb5,0x71,0xfc,0x8e,0x84,0xe3,0x57,0x7b,0x10,0x8f,0xfa,0x02,0x3c,0xea,
|
|
0x0b,0xa5,0x8b,0xa4,0x4b,0xf0,0xa8,0xa7,0xe3,0x51,0x37,0x90,0x97,0x37,0x8f,0xba,
|
|
0xa0,0x45,0x3f,0x73,0xa9,0x34,0xcf,0xa3,0xee,0x06,0x03,0xd0,0x3c,0xea,0x5e,0xe4,
|
|
0xea,0x6b,0x02,0xff,0x6f,0x15,0x99,0xf9,0x75,0x64,0xe5,0x2d,0x27,0xbf,0x59,0xfa,
|
|
0x93,0xf4,0x17,0xe9,0x6f,0xd2,0x01,0xfb,0x9a,0x64,0xe6,0x87,0x93,0x95,0x9f,0x40,
|
|
0x46,0x7e,0x6f,0x9e,0x47,0x5d,0x25,0x8d,0x91,0x6e,0x93,0x6e,0x97,0x16,0xe1,0x51,
|
|
0xef,0xc7,0xa3,0x5e,0x14,0x98,0x7e,0xfb,0xa4,0xde,0x64,0xe4,0xbf,0x0f,0xab,0xef,
|
|
0x1e,0xb2,0xf1,0x96,0x87,0xbf,0x07,0x0e,0xdf,0x06,0xf2,0xef,0x7d,0xc9,0xbd,0x9b,
|
|
0x47,0x3d,0x84,0xac,0xba,0xe5,0xd4,0x3d,0x8b,0x3e,0x38,0xe4,0xcf,0xcf,0x25,0x6b,
|
|
0xbe,0x9c,0xac,0xb9,0xe5,0xcc,0x8f,0x2e,0x49,0x3c,0xea,0xd3,0xf0,0xa8,0x2d,0x5b,
|
|
0xbe,0x8e,0x5c,0x79,0x27,0x58,0x76,0xdd,0xc8,0x96,0xf7,0x20,0x53,0xee,0xdc,0xba,
|
|
0xf1,0xd2,0x79,0xd2,0x62,0xb2,0xe4,0xc6,0xa7,0xfb,0xa4,0x34,0xc9,0x93,0x8f,0x21,
|
|
0x4f,0x7e,0x05,0x39,0xf2,0x45,0xd2,0xf2,0xb2,0x24,0x4b,0xfe,0x9f,0x64,0xc8,0x5b,
|
|
0x3a,0x27,0x19,0xf2,0xbe,0xb0,0xe8,0x66,0x91,0x0d,0x7f,0x04,0x8f,0xda,0xf2,0xe1,
|
|
0x7d,0xc9,0x7d,0x1b,0x13,0x6e,0xb2,0xf4,0x52,0xe0,0xbf,0xa5,0xc9,0x7c,0x1b,0xe7,
|
|
0x6d,0x82,0x34,0x0d,0xd6,0xdb,0x8d,0x30,0xdb,0x9e,0x80,0xd5,0x66,0x9c,0xb6,0x67,
|
|
0xf1,0xa8,0xb7,0xc0,0x67,0x2b,0x20,0x07,0xee,0x4c,0xb6,0x6a,0x72,0xe0,0x57,0x04,
|
|
0xce,0xda,0x8d,0xb0,0xd4,0x8c,0xa3,0xf6,0x62,0xe0,0xa6,0x99,0x47,0xbd,0x51,0xda,
|
|
0x75,0x48,0x92,0x01,0x1f,0x08,0x0b,0xad,0x2a,0x78,0xd4,0xc6,0x3e,0x1b,0x85,0x47,
|
|
0xed,0x79,0xf0,0x05,0x64,0xc0,0x97,0x06,0xa6,0xd9,0xbb,0x70,0xcc,0x8c,0x61,0x96,
|
|
0x86,0x5d,0xd6,0x99,0x2c,0x78,0x3f,0x32,0xe0,0x55,0x64,0xbf,0x47,0x06,0x26,0xd9,
|
|
0x58,0x38,0x64,0x13,0x82,0x47,0x7d,0x11,0xac,0x31,0xe3,0x8c,0x0d,0x85,0xe3,0x75,
|
|
0x7a,0xe0,0x77,0x99,0x47,0x3d,0x25,0x78,0xd4,0x17,0xc2,0xe6,0x7a,0x32,0x78,0xd4,
|
|
0xab,0x02,0x87,0xeb,0x79,0x32,0xdf,0xc6,0xdb,0x5a,0x01,0x5f,0xeb,0xa9,0xc0,0xd5,
|
|
0x6a,0x26,0x03,0x6e,0x1c,0xad,0x41,0x70,0xb3,0x46,0x06,0x8f,0xda,0x39,0x59,0xc6,
|
|
0xc7,0xba,0x3c,0xf0,0xb1,0xdc,0xa3,0x5e,0x1e,0x58,0x58,0xee,0x51,0x1b,0xfb,0xea,
|
|
0x28,0xd8,0x56,0xc7,0x07,0xa6,0x95,0xb1,0xac,0xc6,0xf4,0x48,0x98,0x55,0xce,0xab,
|
|
0x1a,0x8e,0x47,0xbd,0x23,0x64,0xc8,0x0f,0x25,0x37,0x3e,0x18,0xfe,0xd4,0xc8,0xe0,
|
|
0x51,0x3b,0x57,0xea,0x4c,0x98,0x52,0x0f,0xc2,0x90,0x7a,0x03,0x76,0x94,0x73,0xa3,
|
|
0x9c,0x0f,0x55,0x24,0x65,0xe1,0x43,0x0d,0x82,0x0b,0x35,0x1c,0x0e,0xd4,0x99,0xc1,
|
|
0xa3,0x9e,0x04,0xfb,0x69,0x0a,0x99,0x72,0xe7,0x3d,0x19,0xe7,0xe9,0x3f,0xc8,0x95,
|
|
0x67,0xe1,0x31,0x0d,0x81,0xc3,0x34,0x4e,0xba,0x9c,0x2c,0xb9,0x73,0x96,0x9c,0xaf,
|
|
0xe4,0x5c,0x25,0xe3,0x29,0x15,0x91,0x2f,0xaf,0x0c,0xfc,0xa4,0x51,0x81,0x99,0x74,
|
|
0x16,0x9c,0xa4,0x69,0xe4,0xcc,0x6f,0x87,0x87,0x74,0x47,0x07,0x1e,0xb5,0x71,0x8f,
|
|
0x76,0xc0,0x33,0xfa,0x14,0x8f,0xfa,0x35,0xe9,0x8f,0xd2,0x26,0x69,0xfb,0x71,0x49,
|
|
0xa6,0xdc,0xf2,0xe4,0x0d,0xe4,0xc9,0x07,0x56,0xeb,0xfb,0xae,0x4e,0x32,0xe3,0xc3,
|
|
0xc8,0x88,0x1b,0x07,0x68,0x06,0xf9,0xf0,0x5d,0x78,0xd4,0x15,0xf0,0x7e,0xc6,0xc1,
|
|
0xf9,0xb9,0x90,0x9c,0xb8,0x65,0xc4,0xef,0xfe,0x6e,0x1b,0xab,0x67,0x2e,0x5c,0x9e,
|
|
0xc5,0xe4,0xbd,0xa3,0x47,0x6d,0x1c,0x9e,0xdd,0x73,0x93,0x9c,0x77,0x76,0x41,0x3a,
|
|
0xd5,0x93,0xcc,0xf6,0xa5,0x64,0xb4,0xa7,0x93,0xcd,0xbe,0x85,0x4c,0xf6,0x22,0x18,
|
|
0x39,0xe6,0x51,0xdf,0x27,0x7d,0xbc,0x5e,0x8f,0x15,0xb8,0x38,0x97,0xc1,0xc3,0xb9,
|
|
0x16,0x1e,0xce,0x4d,0xf0,0x70,0x96,0xc2,0xc3,0xd9,0x22,0x9d,0x0e,0x13,0xc7,0x3c,
|
|
0xea,0x9d,0xd2,0xa4,0x0d,0xe9,0xd4,0x35,0x1b,0x92,0x9c,0xf7,0xa2,0x90,0xef,0x7e,
|
|
0x80,0x4c,0xb7,0xe7,0xb9,0x9f,0x27,0xc3,0x5d,0x4a,0x76,0xfb,0x18,0x32,0xdb,0xa3,
|
|
0x43,0x56,0xbb,0x8e,0x7c,0xf6,0x9b,0x78,0xd4,0x96,0xc5,0xee,0x4e,0x06,0xbb,0x96,
|
|
0xec,0xf5,0x3c,0x32,0xd7,0xcf,0x93,0xb9,0x36,0x4e,0x4d,0xcb,0xff,0x26,0x9c,0x9a,
|
|
0xe1,0x70,0x6a,0x1a,0xf0,0xa8,0xe7,0xe0,0x51,0xdf,0x0a,0xa7,0xc6,0x18,0x35,0x45,
|
|
0xb0,0x67,0x8e,0x87,0x39,0x63,0xbc,0x99,0x53,0xe0,0xca,0x8c,0x82,0x27,0x53,0xbb,
|
|
0x39,0xc9,0x5f,0x7f,0x04,0x2f,0xc6,0x3c,0x6a,0xcb,0x43,0xaf,0x83,0xbb,0x72,0x46,
|
|
0xe0,0xad,0x18,0x67,0x65,0xaa,0xf4,0xd8,0x87,0xfa,0xfb,0x5b,0x93,0x7c,0xf4,0x71,
|
|
0x21,0x17,0xdd,0x97,0x2c,0xf4,0xd0,0x2f,0xf0,0xa8,0x6b,0x43,0xce,0xb9,0x23,0x8f,
|
|
0xda,0xb3,0xcc,0xd3,0xc9,0x2f,0x5f,0x1d,0x72,0xcb,0xf3,0xc8,0x2a,0xdf,0x47,0x46,
|
|
0xd9,0xf2,0xc9,0xdb,0xa5,0x01,0xdb,0xd2,0xa9,0x7f,0x93,0x1e,0x95,0x56,0x4b,0xeb,
|
|
0xa4,0x8f,0xa5,0xd2,0xed,0xfa,0xb7,0x49,0x1a,0x88,0x47,0x7d,0x99,0x34,0x43,0x7a,
|
|
0x04,0x8f,0xba,0x60,0x87,0xee,0xa3,0x34,0x5e,0x9a,0x28,0x4d,0x93,0xde,0xf8,0x24,
|
|
0x9d,0xfa,0x50,0xda,0x2f,0x5d,0xb9,0x3b,0x9d,0xfa,0x1f,0xe9,0x03,0xa9,0xec,0x53,
|
|
0x7d,0x1f,0xd2,0x64,0x69,0xae,0xb4,0x4c,0x5a,0x21,0x5d,0xb3,0x47,0x3f,0x1b,0xe9,
|
|
0x9c,0xbd,0x69,0x9d,0xf3,0xe8,0xe7,0x21,0x5d,0x2b,0xfd,0x48,0x7a,0x48,0x7a,0x42,
|
|
0x7a,0x4e,0xfa,0x83,0xf4,0x93,0x7d,0xe9,0xd4,0xef,0xe0,0xb3,0xbc,0xfd,0x40,0x41,
|
|
0xaa,0xfa,0x57,0x49,0xa6,0xfa,0x5e,0xb2,0xd4,0x96,0x9f,0xb6,0xec,0xb4,0x79,0xd4,
|
|
0x37,0xa4,0x12,0xfe,0xca,0x81,0x96,0x6e,0x52,0x79,0x2a,0x7d,0x78,0xf7,0xc3,0x3b,
|
|
0x77,0x4f,0xeb,0x55,0xa6,0x2c,0xd3,0xa9,0xa0,0x53,0x41,0x61,0x41,0xa6,0x48,0x2f,
|
|
0xe9,0xee,0xe9,0x02,0x5d,0xa3,0x77,0x32,0x65,0x85,0x7a,0x53,0x58,0x94,0x69,0xff,
|
|
0x92,0xd5,0x2b,0xde,0x2f,0xb2,0x77,0xb2,0xf6,0x3a,0x53,0x96,0x2d,0xf6,0x97,0xe2,
|
|
0xd2,0x4c,0x49,0x59,0x49,0x41,0x49,0x26,0x5b,0x52,0x92,0x2d,0x2d,0x2b,0x2d,0xc9,
|
|
0xea,0x8d,0xfe,0x90,0x95,0x0a,0x4b,0xec,0x4f,0x7a,0xd1,0xe7,0x65,0x8a,0xc3,0xdf,
|
|
0xc9,0x16,0x97,0xd8,0x67,0x67,0x8b,0xda,0xbf,0x24,0x97,0xdc,0x7b,0xd9,0xe4,0xbd,
|
|
0x32,0xbd,0x64,0xfd,0x03,0xf6,0x91,0x6c,0xee,0x4f,0x79,0x9f,0x9e,0x7c,0x7e,0x36,
|
|
0x7e,0x2e,0x9f,0xd1,0xfa,0xd9,0x6d,0x97,0x2c,0xd2,0xb7,0xed,0x1f,0xc8,0x7d,0xdd,
|
|
0xdc,0xb5,0x99,0xd6,0x6b,0x5a,0x95,0x0d,0x77,0xa9,0xf5,0x2b,0x65,0xb9,0x25,0xbd,
|
|
0x2d,0x6b,0x7f,0xc7,0x8b,0xda,0xee,0x5f,0x36,0xd3,0xfa,0x5e,0x36,0x5e,0xdd,0xe1,
|
|
0x77,0x5d,0xd4,0xfe,0x2e,0xe6,0x8e,0x7a,0xe7,0xdc,0x51,0x8f,0x37,0x9e,0xbc,0xd8,
|
|
0x4d,0x66,0x32,0xd9,0x74,0xb8,0xcd,0xe4,0xe3,0x99,0xdc,0x4f,0x29,0xf7,0x5d,0xb4,
|
|
0xde,0x2c,0x77,0x35,0x1b,0x6e,0xb0,0x83,0xfb,0x90,0xf5,0x23,0x1e,0xaf,0x8b,0xf7,
|
|
0x2d,0x93,0xdc,0x25,0xde,0x76,0x4e,0x17,0x15,0x67,0x3a,0x77,0xef,0x51,0xde,0xad,
|
|
0x6b,0x97,0x82,0xb2,0x4c,0x81,0xae,0x38,0xec,0x90,0xaf,0x1d,0x9a,0x2e,0x2c,0x2a,
|
|
0xec,0x94,0xc9,0xa9,0x2c,0x9b,0xc9,0x7f,0x2c,0xe9,0x7e,0xb7,0xbe,0x9f,0xe9,0x54,
|
|
0x96,0xbc,0xf5,0x87,0x5c,0xee,0xae,0xdb,0x1d,0xcf,0xb4,0xfe,0x00,0x38,0x18,0x19,
|
|
0xbb,0x74,0xce,0xf0,0xc1,0xdc,0xdb,0xf0,0x80,0xfc,0xfc,0x4b,0xf2,0x4a,0x8f,0xbf,
|
|
0xe4,0x30,0x64,0x5a,0x0f,0x62,0xee,0x4f,0xd9,0xdc,0xbd,0xe8,0xe0,0x60,0xe4,0x1d,
|
|
0xe3,0xa2,0x0e,0x8f,0x4f,0xdb,0xb1,0xe5,0xa2,0x87,0x72,0xa7,0xe2,0xdc,0xa5,0xa4,
|
|
0x24,0xa3,0x07,0x75,0xc6,0x6e,0xb7,0x20,0xf7,0xa2,0x27,0x9a,0x9e,0x29,0xba,0x32,
|
|
0xdd,0xfe,0x39,0x97,0xfb,0x7b,0x65,0xba,0x2e,0xd3,0x76,0x6c,0x73,0x77,0x3a,0xf7,
|
|
0xe0,0xcb,0x16,0xb6,0xfb,0xee,0x73,0xb7,0xd1,0x76,0xc9,0xe4,0x5e,0xeb,0xd1,0x9a,
|
|
0x7b,0x9d,0x7b,0xdf,0xaf,0xcc,0xdd,0x87,0x6c,0x69,0xa9,0x5d,0x53,0x6c,0xcf,0xb9,
|
|
0x62,0xbe,0xfd,0x6c,0xfb,0x1f,0x6e,0xfb,0x47,0x5e,0xbb,0x07,0xe1,0xe7,0x9e,0x85,
|
|
0x45,0xf1,0x81,0x93,0x7f,0xb0,0xda,0x1d,0x9f,0xcc,0xe7,0x3e,0x14,0x8f,0x52,0xdb,
|
|
0xcd,0x1d,0xec,0xf1,0x17,0x9e,0xaa,0x7c,0x91,0x6c,0xb6,0xfd,0xdd,0xf6,0x27,0x6d,
|
|
0xde,0x13,0xa5,0xdd,0xfd,0xcd,0xe4,0x1d,0xb9,0x6c,0x51,0xf2,0x1c,0x49,0xfb,0x0f,
|
|
0xdf,0x0f,0x7f,0xfe,0xa5,0xed,0xd1,0x53,0xd8,0x76,0xaf,0x92,0x4b,0xeb,0xaf,0xa2,
|
|
0xe2,0xe4,0x77,0x97,0xfd,0xea,0xfa,0xb2,0x4b,0x26,0xb9,0x14,0x66,0xc2,0xaf,0xce,
|
|
0x83,0x5e,0x0a,0xb9,0x0f,0x69,0xdd,0xcb,0xa2,0x54,0xdb,0x4e,0xdb,0x39,0xcc,0xcd,
|
|
0xbe,0xea,0x2e,0x59,0xdf,0x1d,0xeb,0x3b,0x62,0x7d,0x27,0x6c,0xfe,0x0e,0xd8,0xfc,
|
|
0xdd,0xaf,0xbe,0xd3,0xd5,0x77,0xb9,0xfa,0x0e,0x57,0xdf,0xd5,0xea,0xbb,0x59,0x7d,
|
|
0x27,0xab,0xef,0x62,0xf5,0x1d,0xac,0xbe,0x7b,0xd5,0x77,0xae,0x6e,0x08,0x3b,0x54,
|
|
0xbd,0x63,0x31,0x92,0xdd,0xa8,0xb5,0x61,0xe7,0xa9,0xef,0x3a,0xf5,0x79,0x95,0xef,
|
|
0x26,0x5d,0xd5,0xc1,0x2e,0xd2,0xb5,0x61,0xf7,0xa8,0xef,0x1a,0xfd,0x2c,0xaf,0x2f,
|
|
0x11,0x77,0x82,0x7e,0xd1,0x2e,0x50,0xdf,0xf9,0x19,0x77,0x7d,0xce,0x09,0x3b,0x3b,
|
|
0x57,0x85,0x1d,0x9d,0xb1,0x03,0xe1,0x3b,0x38,0xf7,0xe6,0xcd,0x94,0x46,0x86,0xf9,
|
|
0x51,0xfe,0x6e,0xcc,0xd8,0x6f,0xf0,0xdd,0x97,0xbe,0xeb,0x72,0x55,0x07,0xbb,0x28,
|
|
0xd7,0x86,0xdd,0x93,0x29,0x66,0x3f,0xa3,0xbf,0x64,0x57,0xa4,0xef,0x84,0xbc,0x91,
|
|
0xdd,0x8f,0xbe,0xd3,0x71,0x55,0xd8,0xdd,0xe8,0x3b,0x1b,0xe3,0xae,0x46,0xdf,0xcd,
|
|
0x98,0x62,0xf7,0xa2,0xef,0x58,0x1c,0xdd,0xc1,0x4e,0xc5,0x09,0x61,0x77,0xa2,0xef,
|
|
0x4c,0xf4,0x99,0x4e,0xdc,0x79,0xd8,0xd1,0xae,0x43,0xdf,0x71,0xe8,0xbb,0x0d,0x7d,
|
|
0xa7,0xa1,0xef,0x30,0xf4,0x5d,0x84,0xbe,0x83,0xf0,0x45,0xe6,0x34,0xbe,0x53,0xf0,
|
|
0xcb,0x76,0x09,0x7e,0x2f,0x6f,0x57,0xe0,0xc1,0x76,0x04,0x0e,0x60,0xf6,0x32,0x89,
|
|
0xd9,0x8b,0xef,0xee,0xf3,0x9d,0x7d,0xbe,0xab,0xcf,0x77,0xf4,0xcd,0x66,0xf6,0xe2,
|
|
0x3b,0xf7,0xee,0x66,0x06,0xe3,0x3b,0xeb,0x7c,0xb7,0xdc,0x20,0x66,0x21,0xbe,0x3b,
|
|
0xce,0x77,0xc5,0x3d,0xc6,0xac,0xc3,0x77,0xbc,0xf9,0x6e,0x37,0x67,0x01,0xf9,0x8e,
|
|
0xb6,0x5e,0x61,0xe7,0x9a,0xcd,0x2c,0x7a,0x84,0x59,0x84,0xcf,0x20,0xe2,0xee,0xb2,
|
|
0x26,0x66,0x0d,0x31,0x0f,0x3f,0x36,0x6f,0x77,0xd8,0x6c,0x66,0x0a,0xcb,0x98,0x1f,
|
|
0xd8,0x9c,0xa0,0x0f,0xf3,0x81,0xb8,0x53,0x6b,0x4b,0xd8,0x9d,0xb5,0x2b,0x6f,0x16,
|
|
0xd0,0xcc,0x1c,0x60,0x1f,0xb3,0x80,0xf5,0xf8,0xe3,0xbe,0x5b,0xc9,0x77,0x25,0xf9,
|
|
0x8e,0xa3,0x93,0xf1,0x7b,0x7d,0x27,0xd1,0x0c,0x3c,0x55,0xdf,0xe9,0xe3,0xbb,0x7b,
|
|
0x7c,0x57,0x8f,0xef,0xce,0xf1,0x9d,0x39,0xbe,0x2b,0xa7,0x77,0xde,0x4e,0x1c,0xdf,
|
|
0x85,0xf3,0x18,0x5e,0xa9,0xef,0xbc,0xf1,0xdd,0x36,0xbe,0xcb,0xe6,0x2c,0x7c,0xd2,
|
|
0x98,0xe3,0x6d,0x0e,0x3b,0x66,0xfa,0xe3,0x7d,0xfa,0x4e,0x18,0xf7,0x3d,0xaf,0x0b,
|
|
0x99,0xdc,0xa6,0xb0,0xbb,0xc5,0x77,0xb6,0xf8,0xae,0x16,0xdf,0xd1,0xf2,0x01,0x3b,
|
|
0x57,0xdc,0xef,0x7c,0x2f,0xec,0x38,0x31,0x2f,0xd3,0x77,0x92,0xe4,0xef,0x0e,0xf1,
|
|
0x5d,0x1b,0xbe,0x5b,0xc3,0x77,0x65,0x1c,0x6c,0xb7,0x43,0xfe,0x0e,0x07,0xdf,0xd1,
|
|
0xe0,0x3b,0x16,0x7c,0x27,0x82,0xef,0x34,0x48,0x85,0x4c,0xe5,0x99,0x21,0x4b,0xd9,
|
|
0x84,0x47,0xe5,0x3b,0x03,0xfa,0xe2,0x47,0xf9,0x2e,0x00,0x67,0xff,0x7b,0x66,0x72,
|
|
0x25,0x4c,0xff,0xdf,0xe6,0x79,0x52,0xa7,0xe4,0x31,0xf7,0x37,0xe2,0x2d,0xa5,0xf0,
|
|
0x95,0x9c,0x71,0x3f,0xfa,0x20,0x2c,0x7b,0x67,0xd8,0x1f,0x8c,0x5d,0x3f,0x18,0x0f,
|
|
0xc9,0x59,0xef,0x4d,0x78,0x44,0xcb,0x03,0x7b,0xbd,0x39,0xb0,0xd5,0x2b,0xf1,0x80,
|
|
0x1e,0xc6,0xdf,0x39,0x16,0x1f,0xe7,0x14,0xbc,0x9b,0x8e,0x58,0xe1,0xa3,0x03,0x13,
|
|
0xdc,0xfd,0x9a,0x57,0x02,0xe3,0x7b,0x53,0x60,0x78,0x3b,0xbb,0x3b,0x66,0x07,0x23,
|
|
0xa3,0x7b,0x22,0x9e,0xcc,0x7c,0xbc,0x98,0x8a,0xc0,0xc2,0x1e,0x93,0xc7,0xb8,0x36,
|
|
0xaf,0xe5,0xcb,0x18,0xd5,0xce,0xa6,0xee,0x88,0x3d,0x6d,0x1e,0xcb,0x4e,0x18,0xd1,
|
|
0xce,0x42,0x76,0x06,0xb2,0x33,0x8a,0xf3,0xd9,0xc4,0xf9,0x0c,0x62,0x67,0xfe,0x4e,
|
|
0xfb,0x7b,0x99,0xbe,0x7f,0x2f,0xdb,0xf6,0xab,0xb2,0x6b,0xf1,0x12,0x9c,0x39,0xeb,
|
|
0xac,0x56,0x67,0xb4,0x3a,0x43,0xf4,0xff,0x01,
|
|
};
|
|
} // namespace ada::idna::table_blob
|
|
#endif
|
|
/* end file src/table_blob.inc */
|
|
|
|
#include <atomic>
|
|
#include <bit>
|
|
#include <cstdint>
|
|
#include <cstddef>
|
|
#include <new>
|
|
|
|
namespace ada::idna {
|
|
|
|
// table_blob.inc is packed little-endian (see scripts/pack_tables.py). After
|
|
// inflate the multi-byte sections must be converted to host endianness so
|
|
// big-endian platforms (s390x) can load uint16_t/uint32_t/uint64_t natively.
|
|
// CRC is checked on the raw little-endian payload before any conversion.
|
|
namespace detail {
|
|
|
|
template <typename T>
|
|
inline void bswap_inplace(T* data, size_t count) noexcept {
|
|
if constexpr (std::endian::native == std::endian::little) {
|
|
(void)data;
|
|
(void)count;
|
|
return;
|
|
}
|
|
for (size_t i = 0; i < count; ++i) {
|
|
if constexpr (sizeof(T) == 2) {
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
data[i] =
|
|
static_cast<T>(__builtin_bswap16(static_cast<uint16_t>(data[i])));
|
|
#else
|
|
const auto v = static_cast<uint16_t>(data[i]);
|
|
data[i] = static_cast<T>(static_cast<uint16_t>((v >> 8) | (v << 8)));
|
|
#endif
|
|
} else if constexpr (sizeof(T) == 4) {
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
data[i] =
|
|
static_cast<T>(__builtin_bswap32(static_cast<uint32_t>(data[i])));
|
|
#else
|
|
auto v = static_cast<uint32_t>(data[i]);
|
|
v = ((v & 0x000000FFu) << 24) | ((v & 0x0000FF00u) << 8) |
|
|
((v & 0x00FF0000u) >> 8) | ((v & 0xFF000000u) >> 24);
|
|
data[i] = static_cast<T>(v);
|
|
#endif
|
|
} else if constexpr (sizeof(T) == 8) {
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
data[i] =
|
|
static_cast<T>(__builtin_bswap64(static_cast<uint64_t>(data[i])));
|
|
#else
|
|
auto v = static_cast<uint64_t>(data[i]);
|
|
v = ((v & 0x00000000000000FFull) << 56) |
|
|
((v & 0x000000000000FF00ull) << 40) |
|
|
((v & 0x0000000000FF0000ull) << 24) |
|
|
((v & 0x00000000FF000000ull) << 8) |
|
|
((v & 0x000000FF00000000ull) >> 8) |
|
|
((v & 0x0000FF0000000000ull) >> 24) |
|
|
((v & 0x00FF000000000000ull) >> 40) |
|
|
((v & 0xFF00000000000000ull) >> 56);
|
|
data[i] = static_cast<T>(v);
|
|
#endif
|
|
} else {
|
|
static_assert(sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Convert every multi-byte section of the inflated little-endian blob to host
|
|
// order. Single-byte sections are left unchanged. Safe no-op on little-endian.
|
|
inline void convert_table_blob_to_host_endian(uint8_t* buffer) noexcept {
|
|
if constexpr (std::endian::native == std::endian::little) {
|
|
(void)buffer;
|
|
return;
|
|
}
|
|
auto u16 = [&](size_t off, size_t count) {
|
|
bswap_inplace(reinterpret_cast<uint16_t*>(buffer + off), count);
|
|
};
|
|
auto u32 = [&](size_t off, size_t count) {
|
|
bswap_inplace(reinterpret_cast<uint32_t*>(buffer + off), count);
|
|
};
|
|
auto u64 = [&](size_t off, size_t count) {
|
|
bswap_inplace(reinterpret_cast<uint64_t*>(buffer + off), count);
|
|
};
|
|
|
|
u16(table_blob::off_idna_stage1, table_blob::count_idna_stage1);
|
|
u16(table_blob::off_idna_stage2, table_blob::count_idna_stage2);
|
|
u64(table_blob::off_idna_bool_blocks, table_blob::count_idna_bool_blocks);
|
|
u16(table_blob::off_decomposition_block,
|
|
table_blob::count_decomposition_block);
|
|
u32(table_blob::off_decomposition_data, table_blob::count_decomposition_data);
|
|
u16(table_blob::off_composition_block, table_blob::count_composition_block);
|
|
u32(table_blob::off_composition_data, table_blob::count_composition_data);
|
|
u32(table_blob::off_id_continue_flat, table_blob::count_id_continue_flat);
|
|
u32(table_blob::off_id_start_flat, table_blob::count_id_start_flat);
|
|
u32(table_blob::off_dir_start, table_blob::count_dir_start);
|
|
u32(table_blob::off_dir_final, table_blob::count_dir_final);
|
|
u32(table_blob::off_combining_flat, table_blob::count_combining_flat);
|
|
}
|
|
|
|
} // namespace detail
|
|
|
|
// --- Blob layout invariants --------------------------------------------------
|
|
static_assert(table_blob::count_decomposition_index == 4352);
|
|
static_assert(table_blob::count_ccc_index == 4352);
|
|
static_assert(table_blob::count_composition_index == 4352);
|
|
static_assert(table_blob::count_decomposition_block ==
|
|
table_blob::decomposition_block_rows *
|
|
table_blob::decomposition_block_cols);
|
|
static_assert(table_blob::count_ccc_block ==
|
|
table_blob::ccc_block_rows * table_blob::ccc_block_cols);
|
|
static_assert(table_blob::count_composition_block ==
|
|
table_blob::composition_block_rows *
|
|
table_blob::composition_block_cols);
|
|
static_assert(table_blob::count_dir_start == table_blob::dir_table_count &&
|
|
table_blob::count_dir_final == table_blob::dir_table_count &&
|
|
table_blob::count_dir_value == table_blob::dir_table_count);
|
|
static_assert(table_blob::count_id_continue_flat ==
|
|
table_blob::id_continue_count * 2);
|
|
static_assert(table_blob::count_id_start_flat ==
|
|
table_blob::id_start_count * 2);
|
|
static_assert(table_blob::count_combining_flat ==
|
|
table_blob::combining_range_count * 2);
|
|
static_assert(table_blob::off_idna_stage1 % alignof(uint16_t) == 0);
|
|
static_assert(table_blob::off_idna_stage2 % alignof(uint16_t) == 0);
|
|
static_assert(table_blob::off_idna_bool_blocks % alignof(uint64_t) == 0);
|
|
static_assert(table_blob::off_decomposition_block % alignof(uint16_t) == 0);
|
|
static_assert(table_blob::off_decomposition_data % alignof(char32_t) == 0);
|
|
static_assert(table_blob::off_composition_block % alignof(uint16_t) == 0);
|
|
static_assert(table_blob::off_composition_data % alignof(char32_t) == 0);
|
|
static_assert(table_blob::off_id_continue_flat % alignof(uint32_t) == 0);
|
|
static_assert(table_blob::off_id_start_flat % alignof(uint32_t) == 0);
|
|
static_assert(table_blob::off_dir_start % alignof(uint32_t) == 0);
|
|
static_assert(table_blob::off_dir_final % alignof(uint32_t) == 0);
|
|
static_assert(table_blob::off_combining_flat % alignof(uint32_t) == 0);
|
|
static_assert(table_blob::compressed_size == sizeof(table_blob::compressed));
|
|
|
|
// Every section must lie entirely inside the uncompressed buffer.
|
|
#define ADA_IDNA_SECTION_IN_BOUNDS(off, count, width) \
|
|
static_assert((off) + (count) * (width) <= table_blob::uncompressed_size, \
|
|
#off " overflows uncompressed buffer")
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_stage1,
|
|
table_blob::count_idna_stage1, 2);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_stage2,
|
|
table_blob::count_idna_stage2, 2);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_bool_blocks,
|
|
table_blob::count_idna_bool_blocks, 8);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_utf8_mappings,
|
|
table_blob::count_idna_utf8_mappings, 1);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_decomposition_index,
|
|
table_blob::count_decomposition_index, 1);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_decomposition_block,
|
|
table_blob::count_decomposition_block, 2);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_decomposition_data,
|
|
table_blob::count_decomposition_data, 4);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_ccc_index,
|
|
table_blob::count_ccc_index, 1);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_ccc_block,
|
|
table_blob::count_ccc_block, 1);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_composition_index,
|
|
table_blob::count_composition_index, 1);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_composition_block,
|
|
table_blob::count_composition_block, 2);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_composition_data,
|
|
table_blob::count_composition_data, 4);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_id_continue_flat,
|
|
table_blob::count_id_continue_flat, 4);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_id_start_flat,
|
|
table_blob::count_id_start_flat, 4);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_dir_start,
|
|
table_blob::count_dir_start, 4);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_dir_final,
|
|
table_blob::count_dir_final, 4);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_dir_value,
|
|
table_blob::count_dir_value, 1);
|
|
ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_combining_flat,
|
|
table_blob::count_combining_flat, 4);
|
|
#undef ADA_IDNA_SECTION_IN_BOUNDS
|
|
|
|
// --- Mapping -----------------------------------------------------------------
|
|
inline const uint16_t* idna_stage1 = nullptr;
|
|
inline const uint16_t* idna_stage2 = nullptr;
|
|
inline const uint64_t* idna_bool_blocks = nullptr;
|
|
inline const uint8_t* idna_utf8_mappings = nullptr;
|
|
|
|
// --- Normalization (O(1) multi-stage) ----------------------------------------
|
|
inline const uint8_t* decomposition_index = nullptr;
|
|
inline const uint16_t* decomposition_block_flat = nullptr;
|
|
inline const char32_t* decomposition_data = nullptr;
|
|
inline const uint8_t* ccc_index = nullptr;
|
|
inline const uint8_t* ccc_block_flat = nullptr;
|
|
inline const uint8_t* composition_index = nullptr;
|
|
inline const uint16_t* composition_block_flat = nullptr;
|
|
inline const char32_t* composition_data = nullptr;
|
|
|
|
// --- Identifier --------------------------------------------------------------
|
|
// Pointer-to-array alias. CF17 vs CF22 disagree on spacing inside (*)[2].
|
|
// clang-format off
|
|
using range_pair_ptr = const uint32_t(*)[2];
|
|
// clang-format on
|
|
inline range_pair_ptr id_continue = nullptr;
|
|
inline range_pair_ptr id_start = nullptr;
|
|
|
|
// --- Validity (const SoA) ----------------------------------------------------
|
|
inline const uint32_t* dir_start = nullptr;
|
|
inline const uint32_t* dir_final = nullptr;
|
|
inline const uint8_t* dir_value = nullptr;
|
|
inline range_pair_ptr combining_ranges = nullptr;
|
|
|
|
inline constexpr size_t id_continue_count = table_blob::id_continue_count;
|
|
inline constexpr size_t id_start_count = table_blob::id_start_count;
|
|
inline constexpr size_t dir_table_count = table_blob::dir_table_count;
|
|
inline constexpr size_t combining_range_count =
|
|
table_blob::combining_range_count;
|
|
inline constexpr size_t idna_utf8_mappings_size =
|
|
table_blob::count_idna_utf8_mappings;
|
|
inline constexpr size_t decomposition_data_size =
|
|
table_blob::count_decomposition_data;
|
|
inline constexpr size_t composition_data_size =
|
|
table_blob::count_composition_data;
|
|
|
|
inline constexpr size_t kDecompBlockCols =
|
|
table_blob::decomposition_block_cols; // 257
|
|
inline constexpr size_t kCccBlockCols = table_blob::ccc_block_cols; // 256
|
|
inline constexpr size_t kCompBlockCols =
|
|
table_blob::composition_block_cols; // 257
|
|
inline constexpr size_t kDecompBlockRows = table_blob::decomposition_block_rows;
|
|
inline constexpr size_t kCccBlockRows = table_blob::ccc_block_rows;
|
|
inline constexpr size_t kCompBlockRows = table_blob::composition_block_rows;
|
|
|
|
// Init state: 0=uninit, 1=in progress, 2=ready, 3=failed.
|
|
inline constexpr uint8_t kTablesUninit = 0;
|
|
inline constexpr uint8_t kTablesInProgress = 1;
|
|
inline constexpr uint8_t kTablesReady = 2;
|
|
inline constexpr uint8_t kTablesFailed = 3;
|
|
|
|
inline std::atomic<uint8_t> tables_init_state{kTablesUninit};
|
|
// Process-lifetime allocation published only by the winning init thread.
|
|
// Never freed: shared read-only data for the process. Do not dlclose a DSO
|
|
// that owns this buffer while other code may still call into ada::idna.
|
|
inline uint8_t* tables_buffer = nullptr;
|
|
|
|
// Cap spin-wait so a stuck peer cannot hang the process forever.
|
|
inline constexpr uint64_t kTablesSpinLimit = 1'000'000'000ull;
|
|
|
|
// ISO HDLC / zlib CRC-32 of the uncompressed table payload.
|
|
[[nodiscard]] inline uint32_t crc32_ieee(const uint8_t* data,
|
|
size_t len) noexcept {
|
|
uint32_t c = 0xFFFFFFFFu;
|
|
for (size_t i = 0; i < len; ++i) {
|
|
c ^= data[i];
|
|
for (int k = 0; k < 8; ++k) {
|
|
const uint32_t mask = 0u - (c & 1u);
|
|
c = (c >> 1) ^ (0xEDB88320u & mask);
|
|
}
|
|
}
|
|
return ~c;
|
|
}
|
|
|
|
[[nodiscard]] inline bool tables_are_ready() noexcept {
|
|
return tables_init_state.load(std::memory_order_acquire) == kTablesReady;
|
|
}
|
|
|
|
// Returns true only when all table pointers are safe to use.
|
|
[[nodiscard]] inline bool ensure_tables() noexcept {
|
|
uint8_t state = tables_init_state.load(std::memory_order_acquire);
|
|
if (state == kTablesReady) {
|
|
return true;
|
|
}
|
|
if (state == kTablesFailed) {
|
|
return false;
|
|
}
|
|
|
|
uint8_t expected = kTablesUninit;
|
|
if (tables_init_state.compare_exchange_strong(expected, kTablesInProgress,
|
|
std::memory_order_acq_rel,
|
|
std::memory_order_acquire)) {
|
|
uint8_t* buffer = new (std::nothrow) uint8_t[table_blob::uncompressed_size];
|
|
if (buffer == nullptr) {
|
|
tables_init_state.store(kTablesFailed, std::memory_order_release);
|
|
return false;
|
|
}
|
|
|
|
const size_t n = deflate::inflate_raw(table_blob::compressed,
|
|
table_blob::compressed_size, buffer,
|
|
table_blob::uncompressed_size);
|
|
if (n != table_blob::uncompressed_size ||
|
|
crc32_ieee(buffer, n) != table_blob::uncompressed_crc32) {
|
|
delete[] buffer;
|
|
tables_init_state.store(kTablesFailed, std::memory_order_release);
|
|
return false;
|
|
}
|
|
|
|
// LE payload verified; convert multi-byte fields for big-endian hosts.
|
|
detail::convert_table_blob_to_host_endian(buffer);
|
|
|
|
auto at = [&](size_t off) noexcept -> const uint8_t* {
|
|
return buffer + off;
|
|
};
|
|
|
|
// Publish all non-atomic pointers before READY. Waiters synchronize via
|
|
// acquire on tables_init_state and then observe these writes.
|
|
idna_stage1 =
|
|
reinterpret_cast<const uint16_t*>(at(table_blob::off_idna_stage1));
|
|
idna_stage2 =
|
|
reinterpret_cast<const uint16_t*>(at(table_blob::off_idna_stage2));
|
|
idna_bool_blocks =
|
|
reinterpret_cast<const uint64_t*>(at(table_blob::off_idna_bool_blocks));
|
|
idna_utf8_mappings = at(table_blob::off_idna_utf8_mappings);
|
|
|
|
decomposition_index = at(table_blob::off_decomposition_index);
|
|
decomposition_block_flat = reinterpret_cast<const uint16_t*>(
|
|
at(table_blob::off_decomposition_block));
|
|
decomposition_data = reinterpret_cast<const char32_t*>(
|
|
at(table_blob::off_decomposition_data));
|
|
ccc_index = at(table_blob::off_ccc_index);
|
|
ccc_block_flat = at(table_blob::off_ccc_block);
|
|
composition_index = at(table_blob::off_composition_index);
|
|
composition_block_flat = reinterpret_cast<const uint16_t*>(
|
|
at(table_blob::off_composition_block));
|
|
composition_data =
|
|
reinterpret_cast<const char32_t*>(at(table_blob::off_composition_data));
|
|
|
|
id_continue =
|
|
reinterpret_cast<range_pair_ptr>(at(table_blob::off_id_continue_flat));
|
|
id_start =
|
|
reinterpret_cast<range_pair_ptr>(at(table_blob::off_id_start_flat));
|
|
|
|
dir_start =
|
|
reinterpret_cast<const uint32_t*>(at(table_blob::off_dir_start));
|
|
dir_final =
|
|
reinterpret_cast<const uint32_t*>(at(table_blob::off_dir_final));
|
|
dir_value = at(table_blob::off_dir_value);
|
|
combining_ranges =
|
|
reinterpret_cast<range_pair_ptr>(at(table_blob::off_combining_flat));
|
|
|
|
tables_buffer = buffer;
|
|
tables_init_state.store(kTablesReady, std::memory_order_release);
|
|
return true;
|
|
}
|
|
|
|
// Another thread owns init (or finished between our loads).
|
|
for (uint64_t spins = 0; spins < kTablesSpinLimit; ++spins) {
|
|
state = tables_init_state.load(std::memory_order_acquire);
|
|
if (state == kTablesReady) {
|
|
return true;
|
|
}
|
|
if (state == kTablesFailed) {
|
|
return false;
|
|
}
|
|
#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || \
|
|
defined(_M_IX86)
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
__builtin_ia32_pause();
|
|
#endif
|
|
#elif defined(__aarch64__) || defined(_M_ARM64)
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
asm volatile("yield" ::: "memory");
|
|
#endif
|
|
#endif
|
|
}
|
|
// Timed out waiting for a peer - treat as failure rather than hang.
|
|
return false;
|
|
}
|
|
|
|
// O(1) multi-stage accessors. Block indices from the tables are uint8_t and
|
|
// theoretically can be out of range if the blob is corrupt; clamp to a valid
|
|
// empty/default row (index 0) instead of reading OOB.
|
|
inline const uint16_t* decomposition_block_row(uint8_t bi) noexcept {
|
|
if (bi >= kDecompBlockRows) {
|
|
bi = 0;
|
|
}
|
|
return decomposition_block_flat + static_cast<size_t>(bi) * kDecompBlockCols;
|
|
}
|
|
|
|
inline const uint8_t* ccc_block_row(uint8_t bi) noexcept {
|
|
if (bi >= kCccBlockRows) {
|
|
bi = 0;
|
|
}
|
|
return ccc_block_flat + static_cast<size_t>(bi) * kCccBlockCols;
|
|
}
|
|
|
|
inline const uint16_t* composition_block_row(uint8_t bi) noexcept {
|
|
if (bi >= kCompBlockRows) {
|
|
bi = 0;
|
|
}
|
|
return composition_block_flat + static_cast<size_t>(bi) * kCompBlockCols;
|
|
}
|
|
|
|
} // namespace ada::idna
|
|
/* end file src/table_store.hpp */
|
|
/* begin file src/mapping_tables.cpp */
|
|
// IDNA 17.0.0
|
|
// Two-level compressed mapping table.
|
|
// All constants are derived from the table data; no hardcoded boundaries.
|
|
// Total binary size: 48659 bytes (47.5 KB)
|
|
// stage1: 6564 bytes (3282 uint16_t entries)
|
|
// stage2: 22912 bytes (179 mixed blocks x 64)
|
|
// bool_blocks: 1800 bytes (225 uint64_t words)
|
|
// utf8 maps: 17383 bytes
|
|
|
|
// clang-format off
|
|
#ifndef ADA_IDNA_MAPPING_TABLE_H
|
|
#define ADA_IDNA_MAPPING_TABLE_H
|
|
#include <cstdint>
|
|
|
|
namespace ada::idna {
|
|
|
|
// Block size for two-level table (2^6 = 64 code points per block).
|
|
constexpr uint32_t IDNA_BLOCK_BITS = 6u;
|
|
constexpr uint32_t IDNA_BLOCK_SIZE = 64u;
|
|
constexpr uint32_t IDNA_BLOCK_MASK = 63u;
|
|
|
|
// Sentinel values stored in stage2 / returned by lookup.
|
|
constexpr uint16_t IDNA_VALID = 0xFFFF; // code point is valid as-is
|
|
constexpr uint16_t IDNA_DISALLOWED = 0xFFFE; // code point is disallowed
|
|
constexpr uint16_t IDNA_IGNORED = 0x0000; // ignored (index into empty UTF-8 entry)
|
|
|
|
// Bit 15 of a stage1 entry: set = boolean block, clear = mixed block.
|
|
constexpr uint16_t IDNA_BOOL_FLAG = 0x8000;
|
|
|
|
// Two-level table covers code points [0, IDNA_LOW_RANGE_END).
|
|
// Derived from the highest non-disallowed code point below the high-ignored range,
|
|
// rounded up to the next 64-code-point block boundary.
|
|
constexpr uint32_t IDNA_LOW_RANGE_END = 0x00033480;
|
|
|
|
// Variation selectors supplement: U+E0100..U+E01EF are all ignored.
|
|
// These are handled with a simple range check; everything else above
|
|
// IDNA_LOW_RANGE_END is disallowed.
|
|
constexpr uint32_t IDNA_HIGH_IGNORED_START = 0x000E0100;
|
|
constexpr uint32_t IDNA_HIGH_IGNORED_END = 0x000E01F0; // exclusive
|
|
|
|
// idna_stage1[cp >> 6]: one entry per 64-code-point block.
|
|
// Bit 15 set -> lower 15 bits = index into idna_bool_blocks[].
|
|
// Bit 15 clear -> value = base offset into idna_stage2[] for this block.
|
|
|
|
} // namespace ada::idna
|
|
#endif // ADA_IDNA_MAPPING_TABLE_H
|
|
/* end file src/mapping_tables.cpp */
|
|
|
|
namespace ada::idna {
|
|
|
|
// --- O(1) two-level table lookup ---------------------------------------------
|
|
//
|
|
// Returns one of:
|
|
// IDNA_VALID - keep code point in output unchanged
|
|
// IDNA_DISALLOWED - code point is not allowed (map() returns error)
|
|
// IDNA_IGNORED - code point is ignored (index 0 = empty UTF-8 entry)
|
|
// other - byte offset into idna_utf8_mappings[] (null-terminated)
|
|
//
|
|
// Assumes ensure_tables() has already been called by the public entry point.
|
|
static uint16_t idna_lookup(uint32_t cp) noexcept {
|
|
if (cp < IDNA_LOW_RANGE_END) {
|
|
uint16_t ref = idna_stage1[cp >> IDNA_BLOCK_BITS];
|
|
if (ref & IDNA_BOOL_FLAG) {
|
|
uint32_t bit_idx =
|
|
static_cast<uint32_t>(ref & ~IDNA_BOOL_FLAG) * IDNA_BLOCK_SIZE +
|
|
(cp & IDNA_BLOCK_MASK);
|
|
bool is_valid = (idna_bool_blocks[bit_idx >> 6] >> (bit_idx & 63u)) & 1u;
|
|
return is_valid ? IDNA_VALID : IDNA_DISALLOWED;
|
|
}
|
|
return idna_stage2[ref + (cp & IDNA_BLOCK_MASK)];
|
|
}
|
|
|
|
if (cp >= IDNA_HIGH_IGNORED_START && cp < IDNA_HIGH_IGNORED_END) {
|
|
return IDNA_IGNORED;
|
|
}
|
|
|
|
return IDNA_DISALLOWED;
|
|
}
|
|
|
|
// Advances *ptr past one well-formed UTF-8 code point from the mapping table.
|
|
static char32_t utf8_next(const uint8_t*& ptr) noexcept {
|
|
uint8_t b0 = *ptr++;
|
|
if (b0 < 0x80u) return static_cast<char32_t>(b0);
|
|
if (b0 < 0xE0u) {
|
|
uint32_t cp = (b0 & 0x1Fu) << 6;
|
|
cp |= (*ptr++ & 0x3Fu);
|
|
return static_cast<char32_t>(cp);
|
|
}
|
|
if (b0 < 0xF0u) {
|
|
uint32_t cp = (b0 & 0x0Fu) << 12;
|
|
cp |= ((*ptr++ & 0x3Fu) << 6);
|
|
cp |= (*ptr++ & 0x3Fu);
|
|
return static_cast<char32_t>(cp);
|
|
}
|
|
uint32_t cp = (b0 & 0x07u) << 18;
|
|
cp |= ((*ptr++ & 0x3Fu) << 12);
|
|
cp |= ((*ptr++ & 0x3Fu) << 6);
|
|
cp |= (*ptr++ & 0x3Fu);
|
|
return static_cast<char32_t>(cp);
|
|
}
|
|
|
|
// Count UTF-8 code points in a null-terminated mapping string (trusted table).
|
|
static size_t utf8_count_codepoints(const uint8_t* ptr) noexcept {
|
|
size_t n = 0;
|
|
while (*ptr != 0) {
|
|
++n;
|
|
if (*ptr < 0x80u) {
|
|
++ptr;
|
|
} else if (*ptr < 0xE0u) {
|
|
ptr += 2;
|
|
} else if (*ptr < 0xF0u) {
|
|
ptr += 3;
|
|
} else {
|
|
ptr += 4;
|
|
}
|
|
}
|
|
return n;
|
|
}
|
|
|
|
// --- ASCII fast path ---------------------------------------------------------
|
|
void ascii_map(char* input, size_t length) {
|
|
auto broadcast = [](uint8_t v) -> uint64_t {
|
|
return 0x101010101010101ull * v;
|
|
};
|
|
uint64_t broadcast_80 = broadcast(0x80);
|
|
uint64_t broadcast_Ap = broadcast(128 - 'A');
|
|
uint64_t broadcast_Zp = broadcast(128 - 'Z' - 1);
|
|
size_t i = 0;
|
|
|
|
for (; i + 7 < length; i += 8) {
|
|
uint64_t word{};
|
|
std::memcpy(&word, input + i, sizeof(word));
|
|
word ^=
|
|
(((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80) >> 2;
|
|
std::memcpy(input + i, &word, sizeof(word));
|
|
}
|
|
if (i < length) {
|
|
uint64_t word{};
|
|
std::memcpy(&word, input + i, length - i);
|
|
word ^=
|
|
(((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80) >> 2;
|
|
std::memcpy(input + i, &word, length - i);
|
|
}
|
|
}
|
|
|
|
// Two-pass map: first validate + exact size, then write once (no growth
|
|
// realloc).
|
|
bool map(std::u32string_view input, std::u32string& out) {
|
|
// [Map](https://www.unicode.org/reports/tr46/#ProcessingStepMap).
|
|
out.clear();
|
|
if (!ensure_tables()) {
|
|
return false;
|
|
}
|
|
|
|
// Pass 1: validate and compute exact output length.
|
|
size_t out_size = 0;
|
|
for (char32_t x : input) {
|
|
uint16_t status = idna_lookup(static_cast<uint32_t>(x));
|
|
if (status == IDNA_DISALLOWED) {
|
|
return false;
|
|
}
|
|
if (status == IDNA_VALID) {
|
|
++out_size;
|
|
continue;
|
|
}
|
|
if (static_cast<size_t>(status) >= idna_utf8_mappings_size) {
|
|
return false;
|
|
}
|
|
out_size += utf8_count_codepoints(idna_utf8_mappings + status);
|
|
}
|
|
|
|
// Pass 2: write into a single allocation.
|
|
out.resize(out_size);
|
|
size_t w = 0;
|
|
for (char32_t x : input) {
|
|
uint16_t status = idna_lookup(static_cast<uint32_t>(x));
|
|
if (status == IDNA_VALID) {
|
|
out[w++] = x;
|
|
continue;
|
|
}
|
|
// IGNORED or mapped (status already validated in pass 1).
|
|
const uint8_t* ptr = idna_utf8_mappings + status;
|
|
while (*ptr != 0) {
|
|
out[w++] = utf8_next(ptr);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
std::u32string map(std::u32string_view input) {
|
|
std::u32string answer;
|
|
if (!map(input, answer)) {
|
|
return {};
|
|
}
|
|
return answer;
|
|
}
|
|
|
|
} // namespace ada::idna
|
|
/* end file src/mapping.cpp */
|
|
/* begin file src/normalization.cpp */
|
|
/* begin file include/ada/idna/normalization.h */
|
|
#ifndef ADA_IDNA_NORMALIZATION_H
|
|
#define ADA_IDNA_NORMALIZATION_H
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
namespace ada::idna {
|
|
|
|
// Returns true if `input` is already in Unicode Normalization Form C.
|
|
// Requires that internal tables have been loaded (call ensure via normalize
|
|
// or map first, or this returns false if tables are unavailable).
|
|
[[nodiscard]] bool is_already_nfc(std::u32string_view input) noexcept;
|
|
|
|
// Normalize the characters according to IDNA (Unicode Normalization Form C).
|
|
// Returns false if the internal Unicode tables could not be loaded; in that
|
|
// case `input` is left unchanged. Skips work when the string is already NFC.
|
|
[[nodiscard]] bool normalize(std::u32string& input);
|
|
|
|
} // namespace ada::idna
|
|
#endif
|
|
/* end file include/ada/idna/normalization.h */
|
|
/* begin file src/normalization_tables.cpp */
|
|
// Normalization table helpers.
|
|
// Array payloads live in the DEFLATE blob (table_store.hpp).
|
|
// clang-format off
|
|
#ifndef ADA_IDNA_NORMALIZATION_TABLES_H
|
|
#define ADA_IDNA_NORMALIZATION_TABLES_H
|
|
|
|
namespace ada::idna {
|
|
|
|
// Accessors and multi-stage tables are provided by table_store.hpp after
|
|
// ensure_tables(). Lookup code matches the classic O(1) uni-algo layout.
|
|
|
|
} // namespace ada::idna
|
|
#endif // ADA_IDNA_NORMALIZATION_TABLES_H
|
|
/* end file src/normalization_tables.cpp */
|
|
|
|
#include <cstdint>
|
|
|
|
namespace ada::idna {
|
|
|
|
// See
|
|
// https://github.com/uni-algo/uni-algo/blob/c612968c5ed3ace39bde4c894c24286c5f2c7fe2/include/uni_algo/impl/impl_norm.h#L467
|
|
constexpr char32_t hangul_sbase = 0xAC00;
|
|
constexpr char32_t hangul_tbase = 0x11A7;
|
|
constexpr char32_t hangul_vbase = 0x1161;
|
|
constexpr char32_t hangul_lbase = 0x1100;
|
|
constexpr char32_t hangul_lcount = 19;
|
|
constexpr char32_t hangul_vcount = 21;
|
|
constexpr char32_t hangul_tcount = 28;
|
|
constexpr char32_t hangul_ncount = hangul_vcount * hangul_tcount;
|
|
constexpr char32_t hangul_scount =
|
|
hangul_lcount * hangul_vcount * hangul_tcount;
|
|
|
|
// Canonical decomposition length (0 if none / compatibility-only / Hangul
|
|
// syllable). Length 1 means a singleton mapping (character is not NFC form).
|
|
// Length >= 2 means a primary composite that is already the NFC form of its
|
|
// decomposition (e.g. U+00E9 LATIN SMALL LETTER E WITH ACUTE).
|
|
static size_t canonical_decomp_length(char32_t current_character) noexcept {
|
|
if (current_character >= hangul_sbase &&
|
|
current_character < hangul_sbase + hangul_scount) {
|
|
// Hangul precomposed syllables are NFC.
|
|
return 0;
|
|
}
|
|
if (current_character >= 0x110000) {
|
|
return 0;
|
|
}
|
|
const uint8_t di = decomposition_index[current_character >> 8];
|
|
const uint16_t* const decomposition =
|
|
decomposition_block_row(di) + (current_character % 256);
|
|
size_t decomposition_length =
|
|
(decomposition[1] >> 2) - (decomposition[0] >> 2);
|
|
if ((decomposition_length > 0) && (decomposition[0] & 1)) {
|
|
decomposition_length = 0; // compatibility-only: ignored for NFC
|
|
}
|
|
return decomposition_length;
|
|
}
|
|
|
|
std::pair<bool, size_t> compute_decomposition_length(
|
|
const std::u32string_view input) noexcept {
|
|
bool decomposition_needed{false};
|
|
size_t additional_elements{0};
|
|
for (char32_t current_character : input) {
|
|
size_t decomposition_length{0};
|
|
|
|
if (current_character >= hangul_sbase &&
|
|
current_character < hangul_sbase + hangul_scount) {
|
|
// Full NFD-style Hangul decomp for the decompose() step.
|
|
decomposition_length = 2;
|
|
if ((current_character - hangul_sbase) % hangul_tcount) {
|
|
decomposition_length = 3;
|
|
}
|
|
} else if (current_character < 0x110000) {
|
|
const uint8_t di = decomposition_index[current_character >> 8];
|
|
const uint16_t* const decomposition =
|
|
decomposition_block_row(di) + (current_character % 256);
|
|
decomposition_length = (decomposition[1] >> 2) - (decomposition[0] >> 2);
|
|
if ((decomposition_length > 0) && (decomposition[0] & 1)) {
|
|
decomposition_length = 0;
|
|
}
|
|
}
|
|
if (decomposition_length != 0) {
|
|
decomposition_needed = true;
|
|
additional_elements += decomposition_length - 1;
|
|
}
|
|
}
|
|
return {decomposition_needed, additional_elements};
|
|
}
|
|
|
|
void decompose(std::u32string& input, size_t additional_elements) {
|
|
input.resize(input.size() + additional_elements);
|
|
for (size_t descending_idx = input.size(),
|
|
input_count = descending_idx - additional_elements;
|
|
input_count--;) {
|
|
if (input[input_count] >= hangul_sbase &&
|
|
input[input_count] < hangul_sbase + hangul_scount) {
|
|
// Hangul decomposition.
|
|
char32_t s_index = input[input_count] - hangul_sbase;
|
|
if (s_index % hangul_tcount != 0) {
|
|
input[--descending_idx] = hangul_tbase + s_index % hangul_tcount;
|
|
}
|
|
input[--descending_idx] =
|
|
hangul_vbase + (s_index % hangul_ncount) / hangul_tcount;
|
|
input[--descending_idx] = hangul_lbase + s_index / hangul_ncount;
|
|
} else if (input[input_count] < 0x110000) {
|
|
const uint16_t* decomposition =
|
|
decomposition_block_row(
|
|
decomposition_index[input[input_count] >> 8]) +
|
|
(input[input_count] % 256);
|
|
uint16_t decomposition_length =
|
|
(decomposition[1] >> 2) - (decomposition[0] >> 2);
|
|
if (decomposition_length > 0 && (decomposition[0] & 1)) {
|
|
decomposition_length = 0;
|
|
}
|
|
if (decomposition_length > 0) {
|
|
const size_t base = static_cast<size_t>(decomposition[0] >> 2);
|
|
if (base + decomposition_length > decomposition_data_size) {
|
|
input[--descending_idx] = input[input_count];
|
|
} else {
|
|
while (decomposition_length-- > 0) {
|
|
input[--descending_idx] =
|
|
decomposition_data[base + decomposition_length];
|
|
}
|
|
}
|
|
} else {
|
|
input[--descending_idx] = input[input_count];
|
|
}
|
|
} else {
|
|
input[--descending_idx] = input[input_count];
|
|
}
|
|
}
|
|
}
|
|
|
|
uint8_t get_ccc(char32_t c) noexcept {
|
|
if (c >= 0x110000) {
|
|
return 0;
|
|
}
|
|
return ccc_block_row(ccc_index[c >> 8])[c % 256];
|
|
}
|
|
|
|
void sort_marks(std::u32string& input) {
|
|
for (size_t idx = 1; idx < input.size(); idx++) {
|
|
uint8_t ccc = get_ccc(input[idx]);
|
|
if (ccc == 0) {
|
|
continue;
|
|
}
|
|
auto current_character = input[idx];
|
|
size_t back_idx = idx;
|
|
while (back_idx != 0 && get_ccc(input[back_idx - 1]) > ccc) {
|
|
input[back_idx] = input[back_idx - 1];
|
|
back_idx--;
|
|
}
|
|
input[back_idx] = current_character;
|
|
}
|
|
}
|
|
|
|
void decompose_nfc(std::u32string& input) {
|
|
/**
|
|
* Decompose the domain_name string to Unicode Normalization Form C.
|
|
* @see https://www.unicode.org/reports/tr46/#ProcessingStepDecompose
|
|
*/
|
|
auto [decomposition_needed, additional_elements] =
|
|
compute_decomposition_length(input);
|
|
if (decomposition_needed) {
|
|
decompose(input, additional_elements);
|
|
}
|
|
sort_marks(input);
|
|
}
|
|
|
|
// Returns true if a composition step would change the string.
|
|
static bool would_compose(std::u32string_view input) noexcept {
|
|
for (size_t input_count = 0; input_count < input.size();) {
|
|
const char32_t current = input[input_count];
|
|
if (current >= hangul_lbase && current < hangul_lbase + hangul_lcount) {
|
|
if (input_count + 1 < input.size() &&
|
|
input[input_count + 1] >= hangul_vbase &&
|
|
input[input_count + 1] < hangul_vbase + hangul_vcount) {
|
|
return true;
|
|
}
|
|
++input_count;
|
|
continue;
|
|
}
|
|
if (current >= hangul_sbase && current < hangul_sbase + hangul_scount) {
|
|
if ((current - hangul_sbase) % hangul_tcount &&
|
|
input_count + 1 < input.size() &&
|
|
input[input_count + 1] > hangul_tbase &&
|
|
input[input_count + 1] < hangul_tbase + hangul_tcount) {
|
|
return true;
|
|
}
|
|
++input_count;
|
|
continue;
|
|
}
|
|
if (current < 0x110000) {
|
|
const uint16_t* composition =
|
|
composition_block_row(composition_index[current >> 8]) +
|
|
(current % 256);
|
|
int32_t previous_ccc = -1;
|
|
size_t j = input_count;
|
|
for (; j + 1 < input.size(); ++j) {
|
|
uint8_t ccc = get_ccc(input[j + 1]);
|
|
if (composition[1] != composition[0] && previous_ccc < ccc) {
|
|
int left = composition[0];
|
|
int right = composition[1];
|
|
if (left < 0 || right < left ||
|
|
static_cast<size_t>(right) > composition_data_size) {
|
|
break;
|
|
}
|
|
while (left + 2 < right) {
|
|
int middle = left + (((right - left) >> 1) & ~1);
|
|
if (composition_data[static_cast<size_t>(middle)] <= input[j + 1]) {
|
|
left = middle;
|
|
}
|
|
if (composition_data[static_cast<size_t>(middle)] >= input[j + 1]) {
|
|
right = middle;
|
|
}
|
|
}
|
|
if (static_cast<size_t>(left + 1) < composition_data_size &&
|
|
composition_data[static_cast<size_t>(left)] == input[j + 1]) {
|
|
return true;
|
|
}
|
|
}
|
|
if (ccc == 0) {
|
|
break;
|
|
}
|
|
previous_ccc = ccc;
|
|
}
|
|
input_count = j + 1;
|
|
continue;
|
|
}
|
|
++input_count;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool is_already_nfc(std::u32string_view input) noexcept {
|
|
if (input.empty()) {
|
|
return true;
|
|
}
|
|
if (!tables_are_ready() && !ensure_tables()) {
|
|
return false;
|
|
}
|
|
// 1) Singleton decompositions are never NFC (e.g. U+212B ANGSTROM SIGN).
|
|
// Multi-code-point decomps are primary composites that are NFC as-is.
|
|
for (char32_t c : input) {
|
|
if (canonical_decomp_length(c) == 1) {
|
|
return false;
|
|
}
|
|
}
|
|
// 2) Combining marks already in canonical order.
|
|
uint8_t prev_ccc = 0;
|
|
for (char32_t c : input) {
|
|
uint8_t ccc = get_ccc(c);
|
|
if (ccc != 0 && prev_ccc > ccc) {
|
|
return false;
|
|
}
|
|
prev_ccc = ccc;
|
|
}
|
|
// 3) No pairwise composition would apply (including Hangul L+V / LV+T).
|
|
return !would_compose(input);
|
|
}
|
|
|
|
void compose(std::u32string& input) {
|
|
/**
|
|
* Compose the domain_name string to Unicode Normalization Form C.
|
|
* @see https://www.unicode.org/reports/tr46/#ProcessingStepCompose
|
|
*/
|
|
size_t input_count{0};
|
|
size_t composition_count{0};
|
|
for (; input_count < input.size(); input_count++, composition_count++) {
|
|
input[composition_count] = input[input_count];
|
|
if (input[input_count] >= hangul_lbase &&
|
|
input[input_count] < hangul_lbase + hangul_lcount) {
|
|
if (input_count + 1 < input.size() &&
|
|
input[input_count + 1] >= hangul_vbase &&
|
|
input[input_count + 1] < hangul_vbase + hangul_vcount) {
|
|
input[composition_count] =
|
|
hangul_sbase +
|
|
((input[input_count] - hangul_lbase) * hangul_vcount +
|
|
input[input_count + 1] - hangul_vbase) *
|
|
hangul_tcount;
|
|
input_count++;
|
|
if (input_count + 1 < input.size() &&
|
|
input[input_count + 1] > hangul_tbase &&
|
|
input[input_count + 1] < hangul_tbase + hangul_tcount) {
|
|
input[composition_count] += input[++input_count] - hangul_tbase;
|
|
}
|
|
}
|
|
} else if (input[input_count] >= hangul_sbase &&
|
|
input[input_count] < hangul_sbase + hangul_scount) {
|
|
if ((input[input_count] - hangul_sbase) % hangul_tcount &&
|
|
input_count + 1 < input.size() &&
|
|
input[input_count + 1] > hangul_tbase &&
|
|
input[input_count + 1] < hangul_tbase + hangul_tcount) {
|
|
input[composition_count] += input[++input_count] - hangul_tbase;
|
|
}
|
|
} else if (input[input_count] < 0x110000) {
|
|
const uint16_t* composition =
|
|
composition_block_row(composition_index[input[input_count] >> 8]) +
|
|
(input[input_count] % 256);
|
|
size_t initial_composition_count = composition_count;
|
|
for (int32_t previous_ccc = -1; input_count + 1 < input.size();
|
|
input_count++) {
|
|
uint8_t ccc = get_ccc(input[input_count + 1]);
|
|
|
|
if (composition[1] != composition[0] && previous_ccc < ccc) {
|
|
int left = composition[0];
|
|
int right = composition[1];
|
|
if (left < 0 || right < left ||
|
|
static_cast<size_t>(right) > composition_data_size) {
|
|
break;
|
|
}
|
|
while (left + 2 < right) {
|
|
int middle = left + (((right - left) >> 1) & ~1);
|
|
if (composition_data[static_cast<size_t>(middle)] <=
|
|
input[input_count + 1]) {
|
|
left = middle;
|
|
}
|
|
if (composition_data[static_cast<size_t>(middle)] >=
|
|
input[input_count + 1]) {
|
|
right = middle;
|
|
}
|
|
}
|
|
if (static_cast<size_t>(left + 1) < composition_data_size &&
|
|
composition_data[static_cast<size_t>(left)] ==
|
|
input[input_count + 1]) {
|
|
char32_t composed = composition_data[static_cast<size_t>(left + 1)];
|
|
input[initial_composition_count] = composed;
|
|
composition =
|
|
composition_block_row(composition_index[composed >> 8]) +
|
|
(composed % 256);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if (ccc == 0) {
|
|
break;
|
|
}
|
|
previous_ccc = ccc;
|
|
input[++composition_count] = input[input_count + 1];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (composition_count < input_count) {
|
|
input.resize(composition_count);
|
|
}
|
|
}
|
|
|
|
bool normalize(std::u32string& input) {
|
|
/**
|
|
* Normalize the characters according to IDNA (Unicode Normalization Form C).
|
|
* @see https://www.unicode.org/reports/tr46/#ProcessingStepNormalize
|
|
*/
|
|
if (!ensure_tables() || decomposition_index == nullptr ||
|
|
composition_index == nullptr) {
|
|
return false;
|
|
}
|
|
if (is_already_nfc(input)) {
|
|
return true;
|
|
}
|
|
decompose_nfc(input);
|
|
compose(input);
|
|
return true;
|
|
}
|
|
|
|
} // namespace ada::idna
|
|
/* end file src/normalization.cpp */
|
|
/* begin file src/punycode.cpp */
|
|
/* begin file include/ada/idna/punycode.h */
|
|
#ifndef ADA_IDNA_PUNYCODE_H
|
|
#define ADA_IDNA_PUNYCODE_H
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
namespace ada::idna {
|
|
|
|
bool punycode_to_utf32(std::string_view input, std::u32string& out);
|
|
bool verify_punycode(std::string_view input);
|
|
bool utf32_to_punycode(std::u32string_view input, std::string& out);
|
|
|
|
} // namespace ada::idna
|
|
|
|
#endif // ADA_IDNA_PUNYCODE_H
|
|
/* end file include/ada/idna/punycode.h */
|
|
|
|
#include <cstdint>
|
|
|
|
namespace ada::idna {
|
|
|
|
constexpr int32_t base = 36;
|
|
constexpr int32_t tmin = 1;
|
|
constexpr int32_t tmax = 26;
|
|
constexpr int32_t skew = 38;
|
|
constexpr int32_t damp = 700;
|
|
constexpr int32_t initial_bias = 72;
|
|
constexpr uint32_t initial_n = 128;
|
|
|
|
static constexpr int32_t char_to_digit_value(char value) {
|
|
if (value >= 'a' && value <= 'z') return value - 'a';
|
|
if (value >= '0' && value <= '9') return value - '0' + 26;
|
|
return -1;
|
|
}
|
|
|
|
static constexpr char digit_to_char(int32_t digit) {
|
|
return digit < 26 ? char(digit + 97) : char(digit + 22);
|
|
}
|
|
|
|
static constexpr int32_t adapt(int32_t d, int32_t n, bool firsttime) {
|
|
if (firsttime) {
|
|
d = d / damp;
|
|
} else {
|
|
d = d / 2;
|
|
}
|
|
d += d / n;
|
|
int32_t k = 0;
|
|
while (d > ((base - tmin) * tmax) / 2) {
|
|
d /= base - tmin;
|
|
k += base;
|
|
}
|
|
return k + (((base - tmin + 1) * d) / (d + skew));
|
|
}
|
|
|
|
bool punycode_to_utf32(std::string_view input, std::u32string &out) {
|
|
int32_t written_out{0};
|
|
out.reserve(out.size() + input.size());
|
|
uint32_t n = initial_n;
|
|
int32_t i = 0;
|
|
int32_t bias = initial_bias;
|
|
// grab ascii content
|
|
size_t end_of_ascii = input.find_last_of('-');
|
|
if (end_of_ascii != std::string_view::npos) {
|
|
for (uint8_t c : input.substr(0, end_of_ascii)) {
|
|
if (c >= 0x80) {
|
|
return false;
|
|
}
|
|
out.push_back(c);
|
|
written_out++;
|
|
}
|
|
input.remove_prefix(end_of_ascii + 1);
|
|
}
|
|
while (!input.empty()) {
|
|
int32_t oldi = i;
|
|
int32_t w = 1;
|
|
for (int32_t k = base;; k += base) {
|
|
if (input.empty()) {
|
|
return false;
|
|
}
|
|
uint8_t code_point = input.front();
|
|
input.remove_prefix(1);
|
|
int32_t digit = char_to_digit_value(code_point);
|
|
if (digit < 0) {
|
|
return false;
|
|
}
|
|
if (digit > (0x7fffffff - i) / w) {
|
|
return false;
|
|
}
|
|
i = i + digit * w;
|
|
int32_t t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;
|
|
if (digit < t) {
|
|
break;
|
|
}
|
|
if (w > 0x7fffffff / (base - t)) {
|
|
return false;
|
|
}
|
|
w = w * (base - t);
|
|
}
|
|
bias = adapt(i - oldi, written_out + 1, oldi == 0);
|
|
if (i / (written_out + 1) > int32_t(0x7fffffff - n)) {
|
|
return false;
|
|
}
|
|
n = n + i / (written_out + 1);
|
|
i = i % (written_out + 1);
|
|
if (n < 0x80) {
|
|
return false;
|
|
}
|
|
out.insert(out.begin() + i, n);
|
|
written_out++;
|
|
++i;
|
|
}
|
|
// See https://github.com/whatwg/url/issues/803
|
|
// Reject labels whose decoded form begins with "xn--" (double-encoded ACE).
|
|
if (out.size() >= 4 && out[0] == U'x' && out[1] == U'n' && out[2] == U'-' &&
|
|
out[3] == U'-') {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool verify_punycode(std::string_view input) {
|
|
// Track only the first 4 decoded code points to check for the "xn--" prefix.
|
|
// This avoids heap allocation while still detecting double-encoded ACE
|
|
// labels.
|
|
uint32_t first4[4]{};
|
|
size_t written_out{0};
|
|
uint32_t n = initial_n;
|
|
int32_t i = 0;
|
|
int32_t bias = initial_bias;
|
|
// grab ascii content
|
|
size_t end_of_ascii = input.find_last_of('-');
|
|
if (end_of_ascii != std::string_view::npos) {
|
|
for (uint8_t c : input.substr(0, end_of_ascii)) {
|
|
if (c >= 0x80) {
|
|
return false;
|
|
}
|
|
if (written_out < 4) {
|
|
first4[written_out] = c;
|
|
}
|
|
written_out++;
|
|
}
|
|
input.remove_prefix(end_of_ascii + 1);
|
|
}
|
|
while (!input.empty()) {
|
|
int32_t oldi = i;
|
|
int32_t w = 1;
|
|
for (int32_t k = base;; k += base) {
|
|
if (input.empty()) {
|
|
return false;
|
|
}
|
|
uint8_t code_point = input.front();
|
|
input.remove_prefix(1);
|
|
int32_t digit = char_to_digit_value(code_point);
|
|
if (digit < 0) {
|
|
return false;
|
|
}
|
|
if (digit > (0x7fffffff - i) / w) {
|
|
return false;
|
|
}
|
|
i = i + digit * w;
|
|
int32_t t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;
|
|
if (digit < t) {
|
|
break;
|
|
}
|
|
if (w > 0x7fffffff / (base - t)) {
|
|
return false;
|
|
}
|
|
w = w * (base - t);
|
|
}
|
|
bias = adapt(i - oldi, int32_t(written_out + 1), oldi == 0);
|
|
if (i / (written_out + 1) > 0x7fffffff - n) {
|
|
return false;
|
|
}
|
|
n = n + i / int32_t(written_out + 1);
|
|
i = i % int32_t(written_out + 1);
|
|
if (n < 0x80) {
|
|
return false;
|
|
}
|
|
// Simulate insert at position i, maintaining only the first 4 slots.
|
|
size_t insert_pos = size_t(i);
|
|
if (insert_pos < 4) {
|
|
for (size_t j = 3; j > insert_pos; j--) {
|
|
first4[j] = first4[j - 1];
|
|
}
|
|
first4[insert_pos] = n;
|
|
}
|
|
written_out++;
|
|
++i;
|
|
}
|
|
// See https://github.com/whatwg/url/issues/803
|
|
// Reject labels whose decoded form begins with "xn--" (double-encoded ACE).
|
|
if (written_out >= 4 && first4[0] == U'x' && first4[1] == U'n' &&
|
|
first4[2] == U'-' && first4[3] == U'-') {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool utf32_to_punycode(std::u32string_view input, std::string &out) {
|
|
out.reserve(input.size() + out.size());
|
|
uint32_t n = initial_n;
|
|
int32_t d = 0;
|
|
int32_t bias = initial_bias;
|
|
size_t h = 0;
|
|
// first push the ascii content
|
|
for (uint32_t c : input) {
|
|
if (c < 0x80) {
|
|
++h;
|
|
out.push_back(char(c));
|
|
}
|
|
if (c > 0x10ffff || (c >= 0xd800 && c < 0xe000)) {
|
|
return false;
|
|
}
|
|
}
|
|
size_t b = h;
|
|
if (b > 0) {
|
|
out.push_back('-');
|
|
}
|
|
while (h < input.size()) {
|
|
uint32_t m = 0x10FFFF;
|
|
for (auto code_point : input) {
|
|
if (code_point >= n && code_point < m) m = code_point;
|
|
}
|
|
|
|
if ((m - n) > (0x7fffffff - d) / (h + 1)) {
|
|
return false;
|
|
}
|
|
d = d + int32_t((m - n) * (h + 1));
|
|
n = m;
|
|
for (auto c : input) {
|
|
if (c < n) {
|
|
if (d == 0x7fffffff) {
|
|
return false;
|
|
}
|
|
++d;
|
|
}
|
|
if (c == n) {
|
|
int32_t q = d;
|
|
for (int32_t k = base;; k += base) {
|
|
int32_t t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;
|
|
|
|
if (q < t) {
|
|
break;
|
|
}
|
|
out.push_back(digit_to_char(t + ((q - t) % (base - t))));
|
|
q = (q - t) / (base - t);
|
|
}
|
|
out.push_back(digit_to_char(q));
|
|
bias = adapt(d, int32_t(h + 1), h == b);
|
|
d = 0;
|
|
++h;
|
|
}
|
|
}
|
|
++d;
|
|
++n;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} // namespace ada::idna
|
|
/* end file src/punycode.cpp */
|
|
/* begin file src/validity.cpp */
|
|
|
|
#include <algorithm>
|
|
#include <span>
|
|
#include <string_view>
|
|
|
|
namespace ada::idna {
|
|
|
|
enum direction : uint8_t {
|
|
NONE,
|
|
BN,
|
|
CS,
|
|
ES,
|
|
ON,
|
|
EN,
|
|
L,
|
|
R,
|
|
NSM,
|
|
AL,
|
|
AN,
|
|
ET,
|
|
WS,
|
|
RLO,
|
|
LRO,
|
|
PDF,
|
|
RLE,
|
|
RLI,
|
|
FSI,
|
|
PDI,
|
|
LRI,
|
|
B,
|
|
S,
|
|
LRE
|
|
};
|
|
|
|
// Bidi direction ranges live in the compressed blob as const SoA arrays
|
|
// (dir_start / dir_final / dir_value). See table_store.hpp layout asserts.
|
|
|
|
// CheckJoiners and CheckBidi are true for URL specification.
|
|
|
|
// Assumes ensure_tables() has already been called by is_label_valid().
|
|
inline static direction find_direction(uint32_t code_point) noexcept {
|
|
// Binary search on dir_final (sorted upper bounds).
|
|
size_t lo = 0, hi = dir_table_count;
|
|
while (lo < hi) {
|
|
size_t mid = lo + (hi - lo) / 2;
|
|
if (dir_final[mid] < code_point) {
|
|
lo = mid + 1;
|
|
} else {
|
|
hi = mid;
|
|
}
|
|
}
|
|
if (lo == dir_table_count) {
|
|
return direction::NONE;
|
|
}
|
|
return code_point >= dir_start[lo] ? static_cast<direction>(dir_value[lo])
|
|
: direction::NONE;
|
|
}
|
|
|
|
inline static size_t find_last_not_of_nsm(
|
|
const std::u32string_view label) noexcept {
|
|
for (int i = static_cast<int>(label.size() - 1); i >= 0; i--)
|
|
if (find_direction(label[i]) != direction::NSM) return i;
|
|
|
|
return std::u32string_view::npos;
|
|
}
|
|
|
|
// An RTL label is a label that contains at least one character of type R, AL,
|
|
// or AN. https://www.rfc-editor.org/rfc/rfc5893#section-2
|
|
inline static bool is_rtl_label(const std::u32string_view label) noexcept {
|
|
const size_t mask =
|
|
(1u << direction::R) | (1u << direction::AL) | (1u << direction::AN);
|
|
|
|
size_t directions = 0;
|
|
for (size_t i = 0; i < label.size(); i++) {
|
|
directions |= 1u << find_direction(label[i]);
|
|
}
|
|
return (directions & mask) != 0;
|
|
}
|
|
|
|
bool is_label_valid(const std::u32string_view label) {
|
|
if (label.empty()) {
|
|
return true;
|
|
}
|
|
if (!ensure_tables() || combining_ranges == nullptr || dir_start == nullptr ||
|
|
dir_final == nullptr || dir_value == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
///////////////
|
|
// We have a normalization step which ensures that we are in NFC.
|
|
// If we receive punycode, we normalize and check that the normalized
|
|
// version matches the original.
|
|
// --------------------------------------
|
|
// The label must be in Unicode Normalization Form NFC.
|
|
|
|
// Current URL standard indicatest that CheckHyphens is set to false.
|
|
// ---------------------------------------
|
|
// If CheckHyphens, the label must not contain a U+002D HYPHEN-MINUS character
|
|
// in both the third and fourth positions. If CheckHyphens, the label must
|
|
// neither begin nor end with a U+002D HYPHEN-MINUS character.
|
|
|
|
// This is not necessary because we segment the
|
|
// labels by '.'.
|
|
// ---------------------------------------
|
|
// The label must not contain a U+002E ( . ) FULL STOP.
|
|
// if (label.find('.') != std::string_view::npos) return false;
|
|
|
|
// The label must not begin with a combining mark.
|
|
// Range membership via lower_bound on range end.
|
|
const std::span<const uint32_t[2]> comb_span{combining_ranges,
|
|
combining_range_count};
|
|
const auto comb_it = std::ranges::lower_bound(
|
|
comb_span, label.front(), {}, [](const auto& range) { return range[1]; });
|
|
if (comb_it != comb_span.end() && label.front() >= (*comb_it)[0]) {
|
|
return false;
|
|
}
|
|
// We verify this next step as part of the mapping:
|
|
// ---------------------------------------------
|
|
// Each code point in the label must only have certain status values
|
|
// according to Section 5, IDNA Mapping Table:
|
|
// - For Transitional Processing, each value must be valid.
|
|
// - For Nontransitional Processing, each value must be either valid or
|
|
// deviation.
|
|
|
|
// If CheckJoiners, the label must satisfy the ContextJ rules from Appendix
|
|
// A, in The Unicode Code Points and Internationalized Domain Names for
|
|
// Applications (IDNA) [IDNA2008].
|
|
constexpr static uint32_t virama[] = {
|
|
0x094D, 0x09CD, 0x0A4D, 0x0ACD, 0x0B4D, 0x0BCD, 0x0C4D, 0x0CCD,
|
|
0x0D3B, 0x0D3C, 0x0D4D, 0x0DCA, 0x0E3A, 0x0EBA, 0x0F84, 0x1039,
|
|
0x103A, 0x1714, 0x1734, 0x17D2, 0x1A60, 0x1B44, 0x1BAA, 0x1BAB,
|
|
0x1BF2, 0x1BF3, 0x2D7F, 0xA806, 0xA82C, 0xA8C4, 0xA953, 0xA9C0,
|
|
0xAAF6, 0xABED, 0x10A3F, 0x11046, 0x1107F, 0x110B9, 0x11133, 0x11134,
|
|
0x111C0, 0x11235, 0x112EA, 0x1134D, 0x11442, 0x114C2, 0x115BF, 0x1163F,
|
|
0x116B6, 0x1172B, 0x11839, 0x1193D, 0x1193E, 0x119E0, 0x11A34, 0x11A47,
|
|
0x11A99, 0x11C3F, 0x11D44, 0x11D45, 0x11D97};
|
|
constexpr static uint32_t R[] = {
|
|
0x622, 0x623, 0x624, 0x625, 0x627, 0x629, 0x62f, 0x630, 0x631,
|
|
0x632, 0x648, 0x671, 0x672, 0x673, 0x675, 0x676, 0x677, 0x688,
|
|
0x689, 0x68a, 0x68b, 0x68c, 0x68d, 0x68e, 0x68f, 0x690, 0x691,
|
|
0x692, 0x693, 0x694, 0x695, 0x696, 0x697, 0x698, 0x699, 0x6c0,
|
|
0x6c3, 0x6c4, 0x6c5, 0x6c6, 0x6c7, 0x6c8, 0x6c9, 0x6ca, 0x6cb,
|
|
0x6cd, 0x6cf, 0x6d2, 0x6d3, 0x6d5, 0x6ee, 0x6ef, 0x710, 0x715,
|
|
0x716, 0x717, 0x718, 0x719, 0x71e, 0x728, 0x72a, 0x72c, 0x72f,
|
|
0x74d, 0x759, 0x75a, 0x75b, 0x854, 0x8aa, 0x8ab, 0x8ac};
|
|
constexpr static uint32_t L[] = {0xa872};
|
|
constexpr static uint32_t D[] = {
|
|
0x620, 0x626, 0x628, 0x62a, 0x62b, 0x62c, 0x62d, 0x62e, 0x633,
|
|
0x634, 0x635, 0x636, 0x637, 0x638, 0x639, 0x63a, 0x63b, 0x63c,
|
|
0x63d, 0x63e, 0x63f, 0x641, 0x642, 0x643, 0x644, 0x645, 0x646,
|
|
0x647, 0x649, 0x64a, 0x66e, 0x66f, 0x678, 0x679, 0x67a, 0x67b,
|
|
0x67c, 0x67d, 0x67e, 0x67f, 0x680, 0x681, 0x682, 0x683, 0x684,
|
|
0x685, 0x686, 0x687, 0x69a, 0x69b, 0x69c, 0x69d, 0x69e, 0x69f,
|
|
0x6a0, 0x6a1, 0x6a2, 0x6a3, 0x6a4, 0x6a5, 0x6a6, 0x6a7, 0x6a8,
|
|
0x6a9, 0x6aa, 0x6ab, 0x6ac, 0x6ad, 0x6ae, 0x6af, 0x6b0, 0x6b1,
|
|
0x6b2, 0x6b3, 0x6b4, 0x6b5, 0x6b6, 0x6b7, 0x6b8, 0x6b9, 0x6ba,
|
|
0x6bb, 0x6bc, 0x6bd, 0x6be, 0x6bf, 0x6c1, 0x6c2, 0x6cc, 0x6ce,
|
|
0x6d0, 0x6d1, 0x6fa, 0x6fb, 0x6fc, 0x6ff, 0x712, 0x713, 0x714,
|
|
0x71a, 0x71b, 0x71c, 0x71d, 0x71f, 0x720, 0x721, 0x722, 0x723,
|
|
0x724, 0x725, 0x726, 0x727, 0x729, 0x72b, 0x72d, 0x72e, 0x74e,
|
|
0x74f, 0x750, 0x751, 0x752, 0x753, 0x754, 0x755, 0x756, 0x757,
|
|
0x758, 0x75c, 0x75d, 0x75e, 0x75f, 0x760, 0x761, 0x762, 0x763,
|
|
0x764, 0x765, 0x766, 0x850, 0x851, 0x852, 0x853, 0x855, 0x8a0,
|
|
0x8a2, 0x8a3, 0x8a4, 0x8a5, 0x8a6, 0x8a7, 0x8a8, 0x8a9, 0x1807,
|
|
0x1820, 0x1821, 0x1822, 0x1823, 0x1824, 0x1825, 0x1826, 0x1827, 0x1828,
|
|
0x1829, 0x182a, 0x182b, 0x182c, 0x182d, 0x182e, 0x182f, 0x1830, 0x1831,
|
|
0x1832, 0x1833, 0x1834, 0x1835, 0x1836, 0x1837, 0x1838, 0x1839, 0x183a,
|
|
0x183b, 0x183c, 0x183d, 0x183e, 0x183f, 0x1840, 0x1841, 0x1842, 0x1843,
|
|
0x1844, 0x1845, 0x1846, 0x1847, 0x1848, 0x1849, 0x184a, 0x184b, 0x184c,
|
|
0x184d, 0x184e, 0x184f, 0x1850, 0x1851, 0x1852, 0x1853, 0x1854, 0x1855,
|
|
0x1856, 0x1857, 0x1858, 0x1859, 0x185a, 0x185b, 0x185c, 0x185d, 0x185e,
|
|
0x185f, 0x1860, 0x1861, 0x1862, 0x1863, 0x1864, 0x1865, 0x1866, 0x1867,
|
|
0x1868, 0x1869, 0x186a, 0x186b, 0x186c, 0x186d, 0x186e, 0x186f, 0x1870,
|
|
0x1871, 0x1872, 0x1873, 0x1874, 0x1875, 0x1876, 0x1877, 0x1887, 0x1888,
|
|
0x1889, 0x188a, 0x188b, 0x188c, 0x188d, 0x188e, 0x188f, 0x1890, 0x1891,
|
|
0x1892, 0x1893, 0x1894, 0x1895, 0x1896, 0x1897, 0x1898, 0x1899, 0x189a,
|
|
0x189b, 0x189c, 0x189d, 0x189e, 0x189f, 0x18a0, 0x18a1, 0x18a2, 0x18a3,
|
|
0x18a4, 0x18a5, 0x18a6, 0x18a7, 0x18a8, 0x18aa, 0xa840, 0xa841, 0xa842,
|
|
0xa843, 0xa844, 0xa845, 0xa846, 0xa847, 0xa848, 0xa849, 0xa84a, 0xa84b,
|
|
0xa84c, 0xa84d, 0xa84e, 0xa84f, 0xa850, 0xa851, 0xa852, 0xa853, 0xa854,
|
|
0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b, 0xa85c, 0xa85d,
|
|
0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863, 0xa864, 0xa865, 0xa866,
|
|
0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c, 0xa86d, 0xa86e, 0xa86f,
|
|
0xa870, 0xa871};
|
|
|
|
for (size_t i = 0; i < label.size(); i++) {
|
|
uint32_t c = label[i];
|
|
if (c == 0x200c) {
|
|
if (i > 0) {
|
|
if (std::ranges::binary_search(virama, label[i - 1])) {
|
|
return true;
|
|
}
|
|
}
|
|
if ((i == 0) || (i + 1 >= label.size())) {
|
|
return false;
|
|
}
|
|
// we go backward looking for L or D
|
|
auto is_l_or_d = [](uint32_t code) {
|
|
return std::ranges::binary_search(L, code) ||
|
|
std::ranges::binary_search(D, code);
|
|
};
|
|
auto is_r_or_d = [](uint32_t code) {
|
|
return std::ranges::binary_search(R, code) ||
|
|
std::ranges::binary_search(D, code);
|
|
};
|
|
std::u32string_view before = label.substr(0, i);
|
|
std::u32string_view after = label.substr(i + 1);
|
|
return (std::find_if(before.begin(), before.end(), is_l_or_d) !=
|
|
before.end()) &&
|
|
(std::find_if(after.begin(), after.end(), is_r_or_d) !=
|
|
after.end());
|
|
} else if (c == 0x200d) {
|
|
if (i > 0) {
|
|
if (std::ranges::binary_search(virama, label[i - 1])) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// If CheckBidi, and if the domain name is a Bidi domain name, then the label
|
|
// must satisfy all six of the numbered conditions in [IDNA2008] RFC 5893,
|
|
// Section 2.
|
|
|
|
// The following rule, consisting of six conditions, applies to labels
|
|
// in Bidi domain names. The requirements that this rule satisfies are
|
|
// described in Section 3. All of the conditions must be satisfied for
|
|
// the rule to be satisfied.
|
|
//
|
|
// 1. The first character must be a character with Bidi property L, R,
|
|
// or AL. If it has the R or AL property, it is an RTL label; if it
|
|
// has the L property, it is an LTR label.
|
|
//
|
|
// 2. In an RTL label, only characters with the Bidi properties R, AL,
|
|
// AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
|
|
//
|
|
// 3. In an RTL label, the end of the label must be a character with
|
|
// Bidi property R, AL, EN, or AN, followed by zero or more
|
|
// characters with Bidi property NSM.
|
|
//
|
|
// 4. In an RTL label, if an EN is present, no AN may be present, and
|
|
// vice versa.
|
|
//
|
|
// 5. In an LTR label, only characters with the Bidi properties L, EN,
|
|
// ES, CS, ET, ON, BN, or NSM are allowed.
|
|
//
|
|
// 6. In an LTR label, the end of the label must be a character with
|
|
// Bidi property L or EN, followed by zero or more characters with
|
|
// Bidi property NSM.
|
|
|
|
size_t last_non_nsm_char = find_last_not_of_nsm(label);
|
|
if (last_non_nsm_char == std::u32string_view::npos) {
|
|
return false;
|
|
}
|
|
|
|
// A "Bidi domain name" is a domain name that contains at least one RTL label.
|
|
// The following rule, consisting of six conditions, applies to labels in Bidi
|
|
// domain names.
|
|
if (is_rtl_label(label)) {
|
|
// The first character must be a character with Bidi property L, R,
|
|
// or AL. If it has the R or AL property, it is an RTL label; if it
|
|
// has the L property, it is an LTR label.
|
|
|
|
if (find_direction(label[0]) == direction::L) {
|
|
// Eval as LTR
|
|
|
|
// In an LTR label, only characters with the Bidi properties L, EN,
|
|
// ES, CS, ET, ON, BN, or NSM are allowed.
|
|
for (size_t i = 0; i <= last_non_nsm_char; i++) {
|
|
const direction d = find_direction(label[i]);
|
|
if (!(d == direction::L || d == direction::EN || d == direction::ES ||
|
|
d == direction::CS || d == direction::ET || d == direction::ON ||
|
|
d == direction::BN || d == direction::NSM)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
const direction last_dir = find_direction(label[last_non_nsm_char]);
|
|
if (!(last_dir == direction::L || last_dir == direction::EN)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
|
|
} else {
|
|
// Eval as RTL
|
|
|
|
// The first character must be R or AL; a leading AN (or any other
|
|
// direction) does not start a valid RTL label.
|
|
const direction first_dir = find_direction(label[0]);
|
|
if (first_dir != direction::R && first_dir != direction::AL) {
|
|
return false;
|
|
}
|
|
|
|
bool has_an = false;
|
|
bool has_en = false;
|
|
for (size_t i = 0; i <= last_non_nsm_char; i++) {
|
|
const direction d = find_direction(label[i]);
|
|
|
|
// In an RTL label, if an EN is present, no AN may be present, and vice
|
|
// versa.
|
|
if ((d == direction::EN && ((has_en = true) && has_an)) ||
|
|
(d == direction::AN && ((has_an = true) && has_en))) {
|
|
return false;
|
|
}
|
|
|
|
if (!(d == direction::R || d == direction::AL || d == direction::AN ||
|
|
d == direction::EN || d == direction::ES || d == direction::CS ||
|
|
d == direction::ET || d == direction::ON || d == direction::BN ||
|
|
d == direction::NSM)) {
|
|
return false;
|
|
}
|
|
|
|
if (i == last_non_nsm_char &&
|
|
!(d == direction::R || d == direction::AL || d == direction::AN ||
|
|
d == direction::EN)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
} // namespace ada::idna
|
|
/* end file src/validity.cpp */
|
|
/* begin file src/to_ascii.cpp */
|
|
/* begin file include/ada/idna/to_ascii.h */
|
|
#ifndef ADA_IDNA_TO_ASCII_H
|
|
#define ADA_IDNA_TO_ASCII_H
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
/* begin file include/ada/idna/limits.h */
|
|
#ifndef ADA_IDNA_LIMITS_H
|
|
#define ADA_IDNA_LIMITS_H
|
|
|
|
#include <cstddef>
|
|
|
|
namespace ada::idna {
|
|
|
|
// Maximum accepted UTF-8 domain length for to_ascii / to_unicode.
|
|
// Bounds heap growth under untrusted input (DoS resistance). DNS wire limits
|
|
// are smaller; this allows long Unicode labels used in URL tests/fixtures.
|
|
inline constexpr size_t max_domain_input_bytes = 16384;
|
|
|
|
} // namespace ada::idna
|
|
|
|
#endif // ADA_IDNA_LIMITS_H
|
|
/* end file include/ada/idna/limits.h */
|
|
|
|
namespace ada::idna {
|
|
|
|
// Converts a domain (e.g., www.google.com) possibly containing international
|
|
// characters to an ascii domain (with punycode). It will not do percent
|
|
// decoding: percent decoding should be done prior to calling this function. We
|
|
// do not remove tabs and spaces, they should have been removed prior to calling
|
|
// this function. We also do not trim control characters. We also assume that
|
|
// the input is not empty. We return "" on error. Inputs longer than
|
|
// max_domain_input_bytes are rejected.
|
|
//
|
|
// This function may accept or even produce invalid domains (WHATWG carve-outs).
|
|
std::string to_ascii(std::string_view ut8_string);
|
|
|
|
// Same as to_ascii, but writes into `out` and returns false on error without
|
|
// relying on empty-string ambiguity.
|
|
[[nodiscard]] bool to_ascii(std::string_view ut8_string, std::string& out);
|
|
|
|
// Returns true if the string contains a forbidden code point according to the
|
|
// WHATGL URL specification:
|
|
// https://url.spec.whatwg.org/#forbidden-domain-code-point
|
|
bool contains_forbidden_domain_code_point(std::string_view ascii_string);
|
|
|
|
bool constexpr is_ascii(std::u32string_view view);
|
|
bool constexpr is_ascii(std::string_view view);
|
|
|
|
} // namespace ada::idna
|
|
|
|
#endif // ADA_IDNA_TO_ASCII_H
|
|
/* end file include/ada/idna/to_ascii.h */
|
|
|
|
#include <algorithm>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <ranges>
|
|
|
|
/* begin file include/ada/idna/validity.h */
|
|
#ifndef ADA_IDNA_VALIDITY_H
|
|
#define ADA_IDNA_VALIDITY_H
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
namespace ada::idna {
|
|
|
|
/**
|
|
* @see https://www.unicode.org/reports/tr46/#Validity_Criteria
|
|
*/
|
|
bool is_label_valid(std::u32string_view label);
|
|
|
|
} // namespace ada::idna
|
|
|
|
#endif // ADA_IDNA_VALIDITY_H
|
|
/* end file include/ada/idna/validity.h */
|
|
|
|
#ifdef ADA_USE_SIMDUTF
|
|
#include "simdutf.h"
|
|
#endif
|
|
|
|
namespace ada::idna {
|
|
|
|
bool constexpr is_ascii(std::u32string_view view) {
|
|
for (uint32_t c : view) {
|
|
if (c >= 0x80) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool constexpr is_ascii(std::string_view view) {
|
|
for (uint8_t c : view) {
|
|
if (c >= 0x80) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
constexpr static uint8_t is_forbidden_domain_code_point_table[] = {
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
|
|
|
static_assert(sizeof(is_forbidden_domain_code_point_table) == 256);
|
|
|
|
inline bool is_forbidden_domain_code_point(const char c) noexcept {
|
|
return is_forbidden_domain_code_point_table[uint8_t(c)];
|
|
}
|
|
|
|
bool contains_forbidden_domain_code_point(std::string_view view) {
|
|
return std::ranges::any_of(view, is_forbidden_domain_code_point);
|
|
}
|
|
|
|
// Per the WHATWG URL "domain to ASCII" algorithm, when beStrict is false and
|
|
// the input domain is an ASCII string, the result is the input lowercased,
|
|
// regardless of the outcome of Unicode ToASCII.
|
|
//
|
|
// See https://url.spec.whatwg.org/#concept-domain-to-ascii
|
|
static void from_ascii_to_ascii(std::string_view ut8_string, std::string& out) {
|
|
out.assign(ut8_string);
|
|
ascii_map(out.data(), out.size());
|
|
}
|
|
|
|
// Append ASCII code units from a UTF-32 label (all values < 0x80).
|
|
static void append_ascii_label(std::string& out, std::u32string_view label) {
|
|
const size_t old = out.size();
|
|
out.resize(old + label.size());
|
|
char* dest = out.data() + old;
|
|
for (char32_t c : label) {
|
|
*dest++ = static_cast<char>(c);
|
|
}
|
|
}
|
|
|
|
// True if label begins with "xn--" (already lowercased by mapping).
|
|
static bool is_ace_prefix(std::u32string_view label) noexcept {
|
|
return label.size() >= 4 && label[0] == U'x' && label[1] == U'n' &&
|
|
label[2] == U'-' && label[3] == U'-';
|
|
}
|
|
|
|
[[nodiscard]] bool to_ascii(std::string_view ut8_string, std::string& out) {
|
|
out.clear();
|
|
if (ut8_string.size() > max_domain_input_bytes) {
|
|
return false;
|
|
}
|
|
if (is_ascii(ut8_string)) {
|
|
from_ascii_to_ascii(ut8_string, out);
|
|
return true;
|
|
}
|
|
|
|
#ifdef ADA_USE_SIMDUTF
|
|
size_t utf32_length =
|
|
simdutf::utf32_length_from_utf8(ut8_string.data(), ut8_string.size());
|
|
if (utf32_length == 0 && !ut8_string.empty()) {
|
|
return false;
|
|
}
|
|
std::u32string working(utf32_length, U'\0');
|
|
size_t actual_utf32_length = simdutf::convert_utf8_to_utf32(
|
|
ut8_string.data(), ut8_string.size(), working.data());
|
|
#else
|
|
size_t utf32_length =
|
|
ada::idna::utf32_length_from_utf8(ut8_string.data(), ut8_string.size());
|
|
if (utf32_length == 0 && !ut8_string.empty()) {
|
|
return false;
|
|
}
|
|
std::u32string working(utf32_length, U'\0');
|
|
size_t actual_utf32_length = ada::idna::utf8_to_utf32(
|
|
ut8_string.data(), ut8_string.size(), working.data());
|
|
#endif
|
|
if (actual_utf32_length == 0 || actual_utf32_length != utf32_length) {
|
|
return false;
|
|
}
|
|
working.resize(actual_utf32_length);
|
|
|
|
// Map into a second buffer with exact sizing (no growth reallocs).
|
|
std::u32string mapped;
|
|
if (!ada::idna::map(working, mapped)) {
|
|
return false;
|
|
}
|
|
// Drop UTF-32 input; reuse `working` as scratch for ACE validation below.
|
|
working.clear();
|
|
|
|
// Skip NFC when already normalized (ASCII is a fast subset of this check).
|
|
if (!is_ascii(mapped) && !is_already_nfc(mapped)) {
|
|
if (!normalize(mapped)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Estimate ASCII output size (punycode may expand non-ASCII labels).
|
|
out.reserve(mapped.size() + 8);
|
|
|
|
// Walk labels with a single pointer scan (no repeated string::find).
|
|
const char32_t* p = mapped.data();
|
|
const char32_t* const end = p + mapped.size();
|
|
std::u32string post_map;
|
|
|
|
while (p < end) {
|
|
const char32_t* label_begin = p;
|
|
while (p < end && *p != U'.') {
|
|
++p;
|
|
}
|
|
const size_t label_size = static_cast<size_t>(p - label_begin);
|
|
std::u32string_view label_view(label_begin, label_size);
|
|
const bool is_last_label = (p == end);
|
|
if (p < end) {
|
|
++p; // skip dot
|
|
}
|
|
|
|
if (label_size == 0) {
|
|
// empty label
|
|
} else if (is_ace_prefix(label_view)) {
|
|
for (char32_t c : label_view) {
|
|
if (c >= 0x80) {
|
|
out.clear();
|
|
return false;
|
|
}
|
|
}
|
|
append_ascii_label(out, label_view);
|
|
std::string_view puny_segment_ascii(
|
|
out.data() + (out.size() - label_size) + 4, label_size - 4);
|
|
working.clear();
|
|
if (!ada::idna::punycode_to_utf32(puny_segment_ascii, working)) {
|
|
out.clear();
|
|
return false;
|
|
}
|
|
if (is_ascii(working)) {
|
|
out.clear();
|
|
return false;
|
|
}
|
|
if (!ada::idna::map(working, post_map) || working != post_map) {
|
|
out.clear();
|
|
return false;
|
|
}
|
|
// Mapping must be stable; NFC must not change the mapped form either.
|
|
if (!is_ascii(post_map) && !is_already_nfc(post_map)) {
|
|
if (!normalize(post_map) || post_map != working) {
|
|
out.clear();
|
|
return false;
|
|
}
|
|
}
|
|
if (post_map.empty() || !is_label_valid(post_map)) {
|
|
out.clear();
|
|
return false;
|
|
}
|
|
} else if (is_ascii(label_view)) {
|
|
append_ascii_label(out, label_view);
|
|
} else {
|
|
if (!is_label_valid(label_view)) {
|
|
out.clear();
|
|
return false;
|
|
}
|
|
out.append("xn--");
|
|
if (!ada::idna::utf32_to_punycode(label_view, out)) {
|
|
out.clear();
|
|
return false;
|
|
}
|
|
}
|
|
if (!is_last_label) {
|
|
out.push_back('.');
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
std::string to_ascii(std::string_view ut8_string) {
|
|
std::string out;
|
|
if (!to_ascii(ut8_string, out)) {
|
|
return {};
|
|
}
|
|
return out;
|
|
}
|
|
} // namespace ada::idna
|
|
/* end file src/to_ascii.cpp */
|
|
/* begin file src/to_unicode.cpp */
|
|
/* begin file include/ada/idna/to_unicode.h */
|
|
#ifndef ADA_IDNA_TO_UNICODE_H
|
|
#define ADA_IDNA_TO_UNICODE_H
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
|
|
namespace ada::idna {
|
|
|
|
// UTS #46 ToUnicode. Never fails per the standard: on step failure the original
|
|
// label is kept. Inputs longer than max_domain_input_bytes are returned
|
|
// unchanged as a safety measure under untrusted input.
|
|
std::string to_unicode(std::string_view input);
|
|
|
|
// Writes into `out`. Returns false only if the input exceeds
|
|
// max_domain_input_bytes (out is left empty). Otherwise always returns true
|
|
// (ToUnicode does not fail).
|
|
[[nodiscard]] bool to_unicode(std::string_view input, std::string& out);
|
|
|
|
} // namespace ada::idna
|
|
|
|
#endif // ADA_IDNA_TO_UNICODE_H
|
|
/* end file include/ada/idna/to_unicode.h */
|
|
|
|
#include <algorithm>
|
|
#include <string>
|
|
|
|
/* begin file include/idna.h */
|
|
#ifndef ADA_IDNA_H
|
|
#define ADA_IDNA_H
|
|
|
|
/* begin file include/ada/idna/identifier.h */
|
|
#ifndef ADA_IDNA_IDENTIFIER_H
|
|
#define ADA_IDNA_IDENTIFIER_H
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
namespace ada::idna {
|
|
|
|
// Verify if it is valid name code point given a Unicode code point and a
|
|
// boolean first: If first is true return the result of checking if code point
|
|
// is contained in the IdentifierStart set of code points. Otherwise return the
|
|
// result of checking if code point is contained in the IdentifierPart set of
|
|
// code points. Returns false if the input is empty or the code point is not
|
|
// valid. There is minimal Unicode error handling: the input should be valid
|
|
// UTF-8. https://urlpattern.spec.whatwg.org/#is-a-valid-name-code-point
|
|
bool valid_name_code_point(char32_t code_point, bool first);
|
|
|
|
} // namespace ada::idna
|
|
|
|
#endif
|
|
/* end file include/ada/idna/identifier.h */
|
|
|
|
#endif
|
|
/* end file include/idna.h */
|
|
|
|
#ifdef ADA_USE_SIMDUTF
|
|
#include "simdutf.h"
|
|
#endif
|
|
|
|
namespace ada::idna {
|
|
|
|
[[nodiscard]] bool to_unicode(std::string_view input, std::string& output) {
|
|
output.clear();
|
|
if (input.size() > max_domain_input_bytes) {
|
|
return false;
|
|
}
|
|
output.reserve(input.size());
|
|
|
|
size_t label_start = 0;
|
|
std::u32string tmp_buffer;
|
|
std::u32string post_map;
|
|
while (label_start < input.size()) {
|
|
size_t loc_dot = input.find('.', label_start);
|
|
bool is_last_label = (loc_dot == std::string_view::npos);
|
|
size_t label_size =
|
|
is_last_label ? input.size() - label_start : loc_dot - label_start;
|
|
auto label_view = std::string_view(input.data() + label_start, label_size);
|
|
|
|
if (label_view.starts_with("xn--") && ada::idna::is_ascii(label_view)) {
|
|
label_view.remove_prefix(4);
|
|
tmp_buffer.clear();
|
|
if (ada::idna::punycode_to_utf32(label_view, tmp_buffer)) {
|
|
// Per UTS #46, the decoded label must be re-validated. Reject decodings
|
|
// that are pure ASCII (xn-- encoding of an ASCII-only label), or whose
|
|
// mapping/normalization is not stable, or that fail label validity.
|
|
bool accept_decoded = true;
|
|
if (ada::idna::is_ascii(tmp_buffer)) {
|
|
accept_decoded = false;
|
|
} else {
|
|
post_map.clear();
|
|
if (!ada::idna::map(tmp_buffer, post_map) || post_map != tmp_buffer) {
|
|
accept_decoded = false;
|
|
} else if (!ada::idna::normalize(post_map) ||
|
|
post_map != tmp_buffer || post_map.empty() ||
|
|
!ada::idna::is_label_valid(post_map)) {
|
|
accept_decoded = false;
|
|
}
|
|
}
|
|
|
|
if (accept_decoded) {
|
|
#ifdef ADA_USE_SIMDUTF
|
|
auto utf8_size = simdutf::utf8_length_from_utf32(tmp_buffer.data(),
|
|
tmp_buffer.size());
|
|
size_t old_size = output.size();
|
|
output.resize(old_size + utf8_size);
|
|
size_t written = simdutf::convert_utf32_to_utf8(
|
|
tmp_buffer.data(), tmp_buffer.size(), output.data() + old_size);
|
|
if (written != utf8_size) {
|
|
output.resize(old_size);
|
|
output.append(
|
|
std::string_view(input.data() + label_start, label_size));
|
|
}
|
|
#else
|
|
auto utf8_size = ada::idna::utf8_length_from_utf32(tmp_buffer.data(),
|
|
tmp_buffer.size());
|
|
size_t old_size = output.size();
|
|
output.resize(old_size + utf8_size);
|
|
size_t written = ada::idna::utf32_to_utf8(
|
|
tmp_buffer.data(), tmp_buffer.size(), output.data() + old_size);
|
|
if (written != utf8_size) {
|
|
output.resize(old_size);
|
|
output.append(
|
|
std::string_view(input.data() + label_start, label_size));
|
|
}
|
|
#endif
|
|
} else {
|
|
// ToUnicode never fails. If any step fails, return the original
|
|
// input sequence for the label.
|
|
output.append(
|
|
std::string_view(input.data() + label_start, label_size));
|
|
}
|
|
} else {
|
|
output.append(std::string_view(input.data() + label_start, label_size));
|
|
}
|
|
} else {
|
|
output.append(label_view);
|
|
}
|
|
|
|
if (!is_last_label) {
|
|
output.push_back('.');
|
|
}
|
|
|
|
label_start += label_size + 1;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
std::string to_unicode(std::string_view input) {
|
|
std::string output;
|
|
if (!to_unicode(input, output)) {
|
|
// Over-limit input: return original (ToUnicode never fails in the sense of
|
|
// producing no answer for valid-length inputs).
|
|
return std::string(input);
|
|
}
|
|
return output;
|
|
}
|
|
} // namespace ada::idna
|
|
/* end file src/to_unicode.cpp */
|
|
/* begin file src/identifier.cpp */
|
|
|
|
#include <algorithm>
|
|
#include <array>
|
|
#include <span>
|
|
#include <string>
|
|
|
|
/* begin file src/id_tables.cpp */
|
|
// IDNA 17.0.0
|
|
// Identifier range tables are stored in the compressed blob (table_store.hpp).
|
|
|
|
// clang-format off
|
|
#ifndef ADA_IDNA_IDENTIFIER_TABLES_H
|
|
#define ADA_IDNA_IDENTIFIER_TABLES_H
|
|
#include <cstdint>
|
|
|
|
namespace ada::idna {
|
|
|
|
// id_continue / id_start pointers and counts are provided by table_store.hpp.
|
|
|
|
} // namespace ada::idna
|
|
#endif // ADA_IDNA_IDENTIFIER_TABLES_H
|
|
/* end file src/id_tables.cpp */
|
|
|
|
namespace ada::idna {
|
|
constexpr bool is_ascii_letter(char32_t c) noexcept {
|
|
return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
|
|
}
|
|
|
|
constexpr bool is_ascii_letter_or_digit(char32_t c) noexcept {
|
|
return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
|
|
(c >= '0' && c <= '9');
|
|
}
|
|
|
|
bool valid_name_code_point(char32_t code_point, bool first) {
|
|
// https://tc39.es/ecma262/#prod-IdentifierStart
|
|
|
|
// Fast paths (no table needed)
|
|
if (first && (code_point == U'$' || code_point == U'_' ||
|
|
is_ascii_letter(code_point))) {
|
|
return true;
|
|
}
|
|
if (!first && (code_point == U'$' || is_ascii_letter_or_digit(code_point))) {
|
|
return true;
|
|
}
|
|
|
|
// Minimal error handling for invalid code point
|
|
if (code_point > 0x10FFFF) {
|
|
return false;
|
|
}
|
|
if (code_point >= 0xD800 && code_point <= 0xDFFF) {
|
|
return false;
|
|
}
|
|
|
|
if (!ensure_tables() || id_start == nullptr || id_continue == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
// Slow path: binary search through the appropriate Unicode range table.
|
|
// Each entry is a [low, high] inclusive range.
|
|
const std::span<const uint32_t[2]> ranges =
|
|
first ? std::span<const uint32_t[2]>{ada::idna::id_start,
|
|
ada::idna::id_start_count}
|
|
: std::span<const uint32_t[2]>{ada::idna::id_continue,
|
|
ada::idna::id_continue_count};
|
|
|
|
const auto iter = std::ranges::lower_bound(
|
|
ranges, code_point, {},
|
|
[](const auto& range) { return range[1]; }); // project to range-high
|
|
|
|
return iter != ranges.end() && code_point >= (*iter)[0];
|
|
}
|
|
} // namespace ada::idna
|
|
/* end file src/identifier.cpp */
|
|
/* end file src/idna.cpp */
|
|
/* end file src/ada_idna.cpp */
|
|
ADA_POP_DISABLE_WARNINGS
|
|
|
|
#include <algorithm>
|
|
#include <array>
|
|
#include <cstring>
|
|
#if ADA_SSSE3
|
|
#include <tmmintrin.h>
|
|
#elif ADA_NEON
|
|
#include <arm_neon.h>
|
|
#elif ADA_SSE2
|
|
#include <emmintrin.h>
|
|
#elif ADA_LSX
|
|
#include <lsxintrin.h>
|
|
#elif ADA_RVV
|
|
#include <riscv_vector.h>
|
|
#endif
|
|
|
|
#include <ranges>
|
|
|
|
namespace ada::unicode {
|
|
|
|
constexpr bool is_tabs_or_newline(char c) noexcept {
|
|
return c == '\r' || c == '\n' || c == '\t';
|
|
}
|
|
|
|
constexpr uint64_t broadcast(uint8_t v) noexcept {
|
|
return 0x101010101010101ull * v;
|
|
}
|
|
|
|
constexpr bool to_lower_ascii(char* input, size_t length) noexcept {
|
|
uint64_t broadcast_80 = broadcast(0x80);
|
|
uint64_t broadcast_Ap = broadcast(128 - 'A');
|
|
uint64_t broadcast_Zp = broadcast(128 - 'Z' - 1);
|
|
uint64_t non_ascii = 0;
|
|
size_t i = 0;
|
|
|
|
for (; i + 7 < length; i += 8) {
|
|
uint64_t word{};
|
|
memcpy(&word, input + i, sizeof(word));
|
|
non_ascii |= (word & broadcast_80);
|
|
word ^=
|
|
(((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80) >> 2;
|
|
memcpy(input + i, &word, sizeof(word));
|
|
}
|
|
if (i < length) {
|
|
uint64_t word{};
|
|
memcpy(&word, input + i, length - i);
|
|
non_ascii |= (word & broadcast_80);
|
|
word ^=
|
|
(((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80) >> 2;
|
|
memcpy(input + i, &word, length - i);
|
|
}
|
|
return non_ascii == 0;
|
|
}
|
|
#if ADA_SSSE3
|
|
ada_really_inline bool has_tabs_or_newline(
|
|
std::string_view user_input) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (user_input.size() < 16) { // slow path
|
|
return std::ranges::any_of(user_input, is_tabs_or_newline);
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
// Using SSSE3's _mm_shuffle_epi8 for table lookup (same approach as NEON)
|
|
size_t i = 0;
|
|
// Lookup table where positions 9, 10, 13 contain their own values
|
|
// Everything else is set to 1 so it won't match
|
|
const __m128i rnt =
|
|
_mm_setr_epi8(1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 13, 0, 0);
|
|
__m128i running = _mm_setzero_si128();
|
|
for (; i + 15 < user_input.size(); i += 16) {
|
|
__m128i word = _mm_loadu_si128((const __m128i*)(user_input.data() + i));
|
|
// Shuffle the lookup table using input bytes as indices
|
|
__m128i shuffled = _mm_shuffle_epi8(rnt, word);
|
|
// Compare: if shuffled value matches input, we found \t, \n, or \r
|
|
__m128i matches = _mm_cmpeq_epi8(shuffled, word);
|
|
running = _mm_or_si128(running, matches);
|
|
}
|
|
if (i < user_input.size()) {
|
|
__m128i word = _mm_loadu_si128(
|
|
(const __m128i*)(user_input.data() + user_input.length() - 16));
|
|
__m128i shuffled = _mm_shuffle_epi8(rnt, word);
|
|
__m128i matches = _mm_cmpeq_epi8(shuffled, word);
|
|
running = _mm_or_si128(running, matches);
|
|
}
|
|
return _mm_movemask_epi8(running) != 0;
|
|
}
|
|
#elif ADA_NEON
|
|
ada_really_inline bool has_tabs_or_newline(
|
|
std::string_view user_input) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (user_input.size() < 16) { // slow path
|
|
return std::ranges::any_of(user_input, is_tabs_or_newline);
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = 0;
|
|
/**
|
|
* The fastest way to check for `\t` (==9), '\n'(== 10) and `\r` (==13) relies
|
|
* on table lookup instruction. We notice that these are all unique numbers
|
|
* between 0..15. Let's prepare a special register, where we put '\t' in the
|
|
* 9th position, '\n' - 10th and '\r' - 13th. Then we shuffle this register by
|
|
* input register. If the input had `\t` in position X then this shuffled
|
|
* register will also have '\t' in that position. Comparing input with this
|
|
* shuffled register will mark us all interesting characters in the input.
|
|
*
|
|
* credit for algorithmic idea: @aqrit, credit for description:
|
|
* @DenisYaroshevskiy
|
|
*/
|
|
static uint8_t rnt_array[16] = {1, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 9, 10, 0, 0, 13, 0, 0};
|
|
const uint8x16_t rnt = vld1q_u8(rnt_array);
|
|
// m['0xd', '0xa', '0x9']
|
|
uint8x16_t running{0};
|
|
for (; i + 15 < user_input.size(); i += 16) {
|
|
uint8x16_t word = vld1q_u8((const uint8_t*)user_input.data() + i);
|
|
|
|
running = vorrq_u8(running, vceqq_u8(vqtbl1q_u8(rnt, word), word));
|
|
}
|
|
if (i < user_input.size()) {
|
|
uint8x16_t word =
|
|
vld1q_u8((const uint8_t*)user_input.data() + user_input.length() - 16);
|
|
running = vorrq_u8(running, vceqq_u8(vqtbl1q_u8(rnt, word), word));
|
|
}
|
|
return vmaxvq_u32(vreinterpretq_u32_u8(running)) != 0;
|
|
}
|
|
#elif ADA_SSE2
|
|
ada_really_inline bool has_tabs_or_newline(
|
|
std::string_view user_input) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (user_input.size() < 16) { // slow path
|
|
return std::ranges::any_of(user_input, is_tabs_or_newline);
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = 0;
|
|
const __m128i mask1 = _mm_set1_epi8('\r');
|
|
const __m128i mask2 = _mm_set1_epi8('\n');
|
|
const __m128i mask3 = _mm_set1_epi8('\t');
|
|
// If we supported SSSE3, we could use the algorithm that we use for NEON.
|
|
__m128i running{0};
|
|
for (; i + 15 < user_input.size(); i += 16) {
|
|
__m128i word = _mm_loadu_si128((const __m128i*)(user_input.data() + i));
|
|
running = _mm_or_si128(
|
|
_mm_or_si128(running, _mm_or_si128(_mm_cmpeq_epi8(word, mask1),
|
|
_mm_cmpeq_epi8(word, mask2))),
|
|
_mm_cmpeq_epi8(word, mask3));
|
|
}
|
|
if (i < user_input.size()) {
|
|
__m128i word = _mm_loadu_si128(
|
|
(const __m128i*)(user_input.data() + user_input.length() - 16));
|
|
running = _mm_or_si128(
|
|
_mm_or_si128(running, _mm_or_si128(_mm_cmpeq_epi8(word, mask1),
|
|
_mm_cmpeq_epi8(word, mask2))),
|
|
_mm_cmpeq_epi8(word, mask3));
|
|
}
|
|
return _mm_movemask_epi8(running) != 0;
|
|
}
|
|
#elif ADA_LSX
|
|
ada_really_inline bool has_tabs_or_newline(
|
|
std::string_view user_input) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (user_input.size() < 16) { // slow path
|
|
return std::ranges::any_of(user_input, is_tabs_or_newline);
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = 0;
|
|
const __m128i mask1 = __lsx_vrepli_b('\r');
|
|
const __m128i mask2 = __lsx_vrepli_b('\n');
|
|
const __m128i mask3 = __lsx_vrepli_b('\t');
|
|
// If we supported SSSE3, we could use the algorithm that we use for NEON.
|
|
__m128i running{0};
|
|
for (; i + 15 < user_input.size(); i += 16) {
|
|
__m128i word = __lsx_vld((const __m128i*)(user_input.data() + i), 0);
|
|
running = __lsx_vor_v(
|
|
__lsx_vor_v(running, __lsx_vor_v(__lsx_vseq_b(word, mask1),
|
|
__lsx_vseq_b(word, mask2))),
|
|
__lsx_vseq_b(word, mask3));
|
|
}
|
|
if (i < user_input.size()) {
|
|
__m128i word = __lsx_vld(
|
|
(const __m128i*)(user_input.data() + user_input.length() - 16), 0);
|
|
running = __lsx_vor_v(
|
|
__lsx_vor_v(running, __lsx_vor_v(__lsx_vseq_b(word, mask1),
|
|
__lsx_vseq_b(word, mask2))),
|
|
__lsx_vseq_b(word, mask3));
|
|
}
|
|
if (__lsx_bz_v(running)) return false;
|
|
return true;
|
|
}
|
|
#elif ADA_RVV
|
|
ada_really_inline bool has_tabs_or_newline(
|
|
std::string_view user_input) noexcept {
|
|
uint8_t* src = (uint8_t*)user_input.data();
|
|
for (size_t vl, n = user_input.size(); n > 0; n -= vl, src += vl) {
|
|
vl = __riscv_vsetvl_e8m1(n);
|
|
vuint8m1_t v = __riscv_vle8_v_u8m1(src, vl);
|
|
vbool8_t m1 = __riscv_vmseq(v, '\r', vl);
|
|
vbool8_t m2 = __riscv_vmseq(v, '\n', vl);
|
|
vbool8_t m3 = __riscv_vmseq(v, '\t', vl);
|
|
vbool8_t m = __riscv_vmor(__riscv_vmor(m1, m2, vl), m3, vl);
|
|
long idx = __riscv_vfirst(m, vl);
|
|
if (idx >= 0) return true;
|
|
}
|
|
return false;
|
|
}
|
|
#else
|
|
ada_really_inline bool has_tabs_or_newline(
|
|
std::string_view user_input) noexcept {
|
|
auto has_zero_byte = [](uint64_t v) {
|
|
return ((v - 0x0101010101010101) & ~(v) & 0x8080808080808080);
|
|
};
|
|
size_t i = 0;
|
|
uint64_t mask1 = broadcast('\r');
|
|
uint64_t mask2 = broadcast('\n');
|
|
uint64_t mask3 = broadcast('\t');
|
|
uint64_t running{0};
|
|
for (; i + 7 < user_input.size(); i += 8) {
|
|
uint64_t word{};
|
|
memcpy(&word, user_input.data() + i, sizeof(word));
|
|
uint64_t xor1 = word ^ mask1;
|
|
uint64_t xor2 = word ^ mask2;
|
|
uint64_t xor3 = word ^ mask3;
|
|
running |= has_zero_byte(xor1) | has_zero_byte(xor2) | has_zero_byte(xor3);
|
|
}
|
|
if (i < user_input.size()) {
|
|
uint64_t word{};
|
|
memcpy(&word, user_input.data() + i, user_input.size() - i);
|
|
uint64_t xor1 = word ^ mask1;
|
|
uint64_t xor2 = word ^ mask2;
|
|
uint64_t xor3 = word ^ mask3;
|
|
running |= has_zero_byte(xor1) | has_zero_byte(xor2) | has_zero_byte(xor3);
|
|
}
|
|
return running;
|
|
}
|
|
#endif
|
|
|
|
// A forbidden host code point is U+0000 NULL, U+0009 TAB, U+000A LF, U+000D CR,
|
|
// U+0020 SPACE, U+0023 (#), U+002F (/), U+003A (:), U+003C (<), U+003E (>),
|
|
// U+003F (?), U+0040 (@), U+005B ([), U+005C (\), U+005D (]), U+005E (^), or
|
|
// U+007C (|).
|
|
constexpr static std::array<uint8_t, 256> is_forbidden_host_code_point_table =
|
|
[]() consteval {
|
|
std::array<uint8_t, 256> result{};
|
|
for (uint8_t c : {'\0', '\x09', '\x0a', '\x0d', ' ', '#', '/', ':', '<',
|
|
'>', '?', '@', '[', '\\', ']', '^', '|'}) {
|
|
result[c] = true;
|
|
}
|
|
return result;
|
|
}();
|
|
|
|
ada_really_inline constexpr bool is_forbidden_host_code_point(
|
|
const char c) noexcept {
|
|
return is_forbidden_host_code_point_table[uint8_t(c)];
|
|
}
|
|
|
|
constexpr static std::array<uint8_t, 256> is_forbidden_domain_code_point_table =
|
|
[]() consteval {
|
|
std::array<uint8_t, 256> result{};
|
|
for (uint8_t c : {'\0', '\x09', '\x0a', '\x0d', ' ', '#', '/', ':', '<',
|
|
'>', '?', '@', '[', '\\', ']', '^', '|', '%'}) {
|
|
result[c] = true;
|
|
}
|
|
for (uint8_t c = 0; c <= 32; c++) {
|
|
result[c] = true;
|
|
}
|
|
for (size_t c = 127; c < 256; c++) {
|
|
result[c] = true;
|
|
}
|
|
return result;
|
|
}();
|
|
|
|
static_assert(sizeof(is_forbidden_domain_code_point_table) == 256);
|
|
|
|
ada_really_inline constexpr bool is_forbidden_domain_code_point(
|
|
const char c) noexcept {
|
|
return is_forbidden_domain_code_point_table[uint8_t(c)];
|
|
}
|
|
|
|
ada_really_inline constexpr bool contains_forbidden_domain_code_point(
|
|
const char* input, size_t length) noexcept {
|
|
size_t i = 0;
|
|
uint8_t accumulator{};
|
|
for (; i + 4 <= length; i += 4) {
|
|
accumulator |= is_forbidden_domain_code_point_table[uint8_t(input[i])];
|
|
accumulator |= is_forbidden_domain_code_point_table[uint8_t(input[i + 1])];
|
|
accumulator |= is_forbidden_domain_code_point_table[uint8_t(input[i + 2])];
|
|
accumulator |= is_forbidden_domain_code_point_table[uint8_t(input[i + 3])];
|
|
}
|
|
for (; i < length; i++) {
|
|
accumulator |= is_forbidden_domain_code_point_table[uint8_t(input[i])];
|
|
}
|
|
return accumulator;
|
|
}
|
|
|
|
constexpr static std::array<uint8_t, 256>
|
|
is_forbidden_domain_code_point_table_or_upper = []() consteval {
|
|
std::array<uint8_t, 256> result{};
|
|
for (uint8_t c : {'\0', '\x09', '\x0a', '\x0d', ' ', '#', '/', ':', '<',
|
|
'>', '?', '@', '[', '\\', ']', '^', '|', '%'}) {
|
|
result[c] = 1;
|
|
}
|
|
for (uint8_t c = 'A'; c <= 'Z'; c++) {
|
|
result[c] = 2;
|
|
}
|
|
for (uint8_t c = 0; c <= 32; c++) {
|
|
result[c] = 1;
|
|
}
|
|
for (size_t c = 127; c < 256; c++) {
|
|
result[c] = 1;
|
|
}
|
|
return result;
|
|
}();
|
|
|
|
ada_really_inline constexpr uint8_t
|
|
contains_forbidden_domain_code_point_or_upper(const char* input,
|
|
size_t length) noexcept {
|
|
size_t i = 0;
|
|
uint8_t accumulator{};
|
|
for (; i + 4 <= length; i += 4) {
|
|
accumulator |=
|
|
is_forbidden_domain_code_point_table_or_upper[uint8_t(input[i])];
|
|
accumulator |=
|
|
is_forbidden_domain_code_point_table_or_upper[uint8_t(input[i + 1])];
|
|
accumulator |=
|
|
is_forbidden_domain_code_point_table_or_upper[uint8_t(input[i + 2])];
|
|
accumulator |=
|
|
is_forbidden_domain_code_point_table_or_upper[uint8_t(input[i + 3])];
|
|
}
|
|
for (; i < length; i++) {
|
|
accumulator |=
|
|
is_forbidden_domain_code_point_table_or_upper[uint8_t(input[i])];
|
|
}
|
|
return accumulator;
|
|
}
|
|
|
|
// std::isalnum(c) || c == '+' || c == '-' || c == '.') is true for
|
|
constexpr static std::array<bool, 256> is_alnum_plus_table = []() consteval {
|
|
std::array<bool, 256> result{};
|
|
for (size_t c = 0; c < 256; c++) {
|
|
result[c] = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') ||
|
|
(c >= 'A' && c <= 'Z') || c == '+' || c == '-' || c == '.';
|
|
}
|
|
return result;
|
|
}();
|
|
|
|
ada_really_inline constexpr bool is_alnum_plus(const char c) noexcept {
|
|
return is_alnum_plus_table[uint8_t(c)];
|
|
// A table is almost surely much faster than the
|
|
// following under most compilers: return
|
|
// return (std::isalnum(c) || c == '+' || c == '-' || c == '.');
|
|
}
|
|
|
|
ada_really_inline constexpr bool is_ascii_hex_digit(const char c) noexcept {
|
|
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') ||
|
|
(c >= 'a' && c <= 'f');
|
|
}
|
|
|
|
ada_really_inline constexpr bool is_ascii_digit(const char c) noexcept {
|
|
// An ASCII digit is a code point in the range U+0030 (0) to U+0039 (9),
|
|
// inclusive.
|
|
return (c >= '0' && c <= '9');
|
|
}
|
|
|
|
ada_really_inline constexpr bool is_ascii(const char32_t c) noexcept {
|
|
// If code point is between U+0000 and U+007F inclusive, then return true.
|
|
return c <= 0x7F;
|
|
}
|
|
|
|
ada_really_inline constexpr bool is_c0_control_or_space(const char c) noexcept {
|
|
return (unsigned char)c <= ' ';
|
|
}
|
|
|
|
ada_really_inline constexpr bool is_ascii_tab_or_newline(
|
|
const char c) noexcept {
|
|
return c == '\t' || c == '\n' || c == '\r';
|
|
}
|
|
|
|
constexpr std::string_view table_is_double_dot_path_segment[] = {
|
|
"..", "%2e.", ".%2e", "%2e%2e"};
|
|
|
|
ada_really_inline constexpr bool is_double_dot_path_segment(
|
|
std::string_view input) noexcept {
|
|
// This will catch most cases:
|
|
// The length must be 2,4 or 6.
|
|
// We divide by two and require
|
|
// that the result be between 1 and 3 inclusively.
|
|
uint64_t half_length = uint64_t(input.size()) / 2;
|
|
if (half_length - 1 > 2) {
|
|
return false;
|
|
}
|
|
// We have a string of length 2, 4 or 6.
|
|
// We now check the first character:
|
|
if ((input[0] != '.') && (input[0] != '%')) {
|
|
return false;
|
|
}
|
|
// We are unlikely the get beyond this point.
|
|
int hash_value = (input.size() + (unsigned)(input[0])) & 3;
|
|
const std::string_view target = table_is_double_dot_path_segment[hash_value];
|
|
if (target.size() != input.size()) {
|
|
return false;
|
|
}
|
|
// We almost never get here.
|
|
// Optimizing the rest is relatively unimportant.
|
|
auto prefix_equal_unsafe = [](std::string_view a, std::string_view b) {
|
|
uint16_t A, B;
|
|
memcpy(&A, a.data(), sizeof(A));
|
|
memcpy(&B, b.data(), sizeof(B));
|
|
return A == B;
|
|
};
|
|
if (!prefix_equal_unsafe(input, target)) {
|
|
return false;
|
|
}
|
|
for (size_t i = 2; i < input.size(); i++) {
|
|
char c = input[i];
|
|
if ((uint8_t((c | 0x20) - 0x61) <= 25 ? (c | 0x20) : c) != target[i]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
// The above code might be a bit better than the code below. Compilers
|
|
// are not stupid and may use the fact that these strings have length 2,4 and
|
|
// 6 and other tricks.
|
|
// return input == ".." ||
|
|
// input == ".%2e" || input == ".%2E" ||
|
|
// input == "%2e." || input == "%2E." ||
|
|
// input == "%2e%2e" || input == "%2E%2E" || input == "%2E%2e" || input ==
|
|
// "%2e%2E";
|
|
}
|
|
|
|
ada_really_inline constexpr bool is_single_dot_path_segment(
|
|
std::string_view input) noexcept {
|
|
return input == "." || input == "%2e" || input == "%2E";
|
|
}
|
|
|
|
ada_really_inline constexpr bool is_lowercase_hex(const char c) noexcept {
|
|
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
|
|
}
|
|
|
|
constexpr static char hex_to_binary_table[] = {
|
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11,
|
|
12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15};
|
|
unsigned constexpr convert_hex_to_binary(const char c) noexcept {
|
|
return hex_to_binary_table[c - '0'];
|
|
}
|
|
|
|
std::string percent_decode(const std::string_view input, size_t first_percent) {
|
|
// next line is for safety only, we expect users to avoid calling
|
|
// percent_decode when first_percent is outside the range.
|
|
if (first_percent == std::string_view::npos) {
|
|
return std::string(input);
|
|
}
|
|
std::string dest;
|
|
dest.reserve(input.length());
|
|
dest.append(input.substr(0, first_percent));
|
|
const char* pointer = input.data() + first_percent;
|
|
const char* end = input.data() + input.size();
|
|
// Optimization opportunity: if the following code gets
|
|
// called often, it can be optimized quite a bit.
|
|
while (pointer < end) {
|
|
const char ch = pointer[0];
|
|
size_t remaining = end - pointer - 1;
|
|
if (ch != '%' || remaining < 2 ||
|
|
( // ch == '%' && // It is unnecessary to check that ch == '%'.
|
|
(!is_ascii_hex_digit(pointer[1]) ||
|
|
!is_ascii_hex_digit(pointer[2])))) {
|
|
dest += ch;
|
|
pointer++;
|
|
} else {
|
|
unsigned a = convert_hex_to_binary(pointer[1]);
|
|
unsigned b = convert_hex_to_binary(pointer[2]);
|
|
char c = static_cast<char>(a * 16 + b);
|
|
dest += c;
|
|
pointer += 3;
|
|
}
|
|
}
|
|
return dest;
|
|
}
|
|
|
|
// 0..15 for hex digits, 0xFF otherwise - validate and decode with two loads.
|
|
constexpr static std::array<uint8_t, 256> unhex_table = []() consteval {
|
|
std::array<uint8_t, 256> t{};
|
|
for (size_t i = 0; i < 256; ++i) {
|
|
t[i] = 0xFF;
|
|
}
|
|
for (uint8_t i = 0; i < 10; ++i) {
|
|
t[static_cast<size_t>('0') + i] = i;
|
|
}
|
|
for (uint8_t i = 0; i < 6; ++i) {
|
|
t[static_cast<size_t>('A') + i] = static_cast<uint8_t>(10 + i);
|
|
t[static_cast<size_t>('a') + i] = static_cast<uint8_t>(10 + i);
|
|
}
|
|
return t;
|
|
}();
|
|
|
|
std::string form_urlencoded_decode(const std::string_view input) {
|
|
const size_t len = input.size();
|
|
if (len == 0) [[unlikely]] {
|
|
return {};
|
|
}
|
|
|
|
// NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
|
|
const char* const src = input.data();
|
|
const char* const end = src + len;
|
|
const char* p = src;
|
|
|
|
// Advance over the untransformed prefix.
|
|
while (p < end && *p != '+' && *p != '%') {
|
|
++p;
|
|
}
|
|
if (p == end) {
|
|
return std::string(input);
|
|
}
|
|
|
|
// Output is always at most as long as the input: write into a single
|
|
// pre-sized buffer, then shrink to the final length.
|
|
std::string out(len, '\0');
|
|
char* d = out.data();
|
|
char* const d0 = d;
|
|
|
|
const size_t prefix = static_cast<size_t>(p - src);
|
|
std::memcpy(d, src, prefix);
|
|
d += prefix;
|
|
|
|
while (p < end) {
|
|
const char c = *p;
|
|
if (c == '+') {
|
|
*d++ = ' ';
|
|
++p;
|
|
} else if (c == '%') {
|
|
// Decode runs of valid %XX tightly (common for nested URL query values).
|
|
while (p + 2 < end && *p == '%') {
|
|
const uint8_t hi = unhex_table[static_cast<uint8_t>(p[1])];
|
|
const uint8_t lo = unhex_table[static_cast<uint8_t>(p[2])];
|
|
if ((hi | lo) >= 16) {
|
|
break;
|
|
}
|
|
*d++ = static_cast<char>((hi << 4) | lo);
|
|
p += 3;
|
|
}
|
|
if (p < end && *p == '%') {
|
|
// Invalid escape: copy '%' literally and continue.
|
|
*d++ = *p++;
|
|
}
|
|
} else {
|
|
// Copy a plain run until the next '+' or '%'.
|
|
const char* start = p;
|
|
++p;
|
|
while (p < end && *p != '+' && *p != '%') {
|
|
++p;
|
|
}
|
|
const size_t n = static_cast<size_t>(p - start);
|
|
std::memcpy(d, start, n);
|
|
d += n;
|
|
}
|
|
}
|
|
|
|
out.resize(static_cast<size_t>(d - d0));
|
|
return out;
|
|
}
|
|
|
|
std::string percent_encode(const std::string_view input,
|
|
const uint8_t character_set[]) {
|
|
auto pointer = std::ranges::find_if(input, [character_set](const char c) {
|
|
return character_sets::bit_at(character_set, c);
|
|
});
|
|
// Optimization: Don't iterate if percent encode is not required
|
|
if (pointer == input.end()) {
|
|
return std::string(input);
|
|
}
|
|
|
|
std::string result;
|
|
result.reserve(input.length()); // in the worst case, percent encoding might
|
|
// produce 3 characters.
|
|
result.append(input.substr(0, std::distance(input.begin(), pointer)));
|
|
|
|
for (; pointer != input.end(); pointer++) {
|
|
if (character_sets::bit_at(character_set, *pointer)) {
|
|
result.append(character_sets::hex + uint8_t(*pointer) * 4, 3);
|
|
} else {
|
|
result += *pointer;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
template <bool append>
|
|
bool percent_encode(const std::string_view input, const uint8_t character_set[],
|
|
std::string& out) {
|
|
ada_log("percent_encode ", input, " to output string while ",
|
|
append ? "appending" : "overwriting");
|
|
auto pointer = std::ranges::find_if(input, [character_set](const char c) {
|
|
return character_sets::bit_at(character_set, c);
|
|
});
|
|
ada_log("percent_encode done checking, moved to ",
|
|
std::distance(input.begin(), pointer));
|
|
|
|
// Optimization: Don't iterate if percent encode is not required
|
|
if (pointer == input.end()) {
|
|
ada_log("percent_encode encoding not needed.");
|
|
return false;
|
|
}
|
|
if constexpr (!append) {
|
|
out.clear();
|
|
}
|
|
ada_log("percent_encode appending ", std::distance(input.begin(), pointer),
|
|
" bytes");
|
|
// NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
|
|
out.append(input.data(), std::distance(input.begin(), pointer));
|
|
ada_log("percent_encode processing ", std::distance(pointer, input.end()),
|
|
" bytes");
|
|
for (; pointer != input.end(); pointer++) {
|
|
if (character_sets::bit_at(character_set, *pointer)) {
|
|
out.append(character_sets::hex + uint8_t(*pointer) * 4, 3);
|
|
} else {
|
|
out += *pointer;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool to_ascii(std::optional<std::string>& out, const std::string_view plain,
|
|
size_t first_percent) {
|
|
std::string percent_decoded_buffer;
|
|
std::string_view input = plain;
|
|
if (first_percent != std::string_view::npos) {
|
|
percent_decoded_buffer = unicode::percent_decode(plain, first_percent);
|
|
input = percent_decoded_buffer;
|
|
}
|
|
// input is a non-empty UTF-8 string, must be percent decoded
|
|
std::string idna_ascii = ada::idna::to_ascii(input);
|
|
if (idna_ascii.empty() || contains_forbidden_domain_code_point(
|
|
idna_ascii.data(), idna_ascii.size())) {
|
|
return false;
|
|
}
|
|
out = std::move(idna_ascii);
|
|
return true;
|
|
}
|
|
|
|
std::string percent_encode(const std::string_view input,
|
|
const uint8_t character_set[], size_t index) {
|
|
std::string out;
|
|
// NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
|
|
out.append(input.data(), index);
|
|
auto pointer = input.begin() + index;
|
|
for (; pointer != input.end(); pointer++) {
|
|
if (character_sets::bit_at(character_set, *pointer)) {
|
|
out.append(character_sets::hex + uint8_t(*pointer) * 4, 3);
|
|
} else {
|
|
out += *pointer;
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
|
|
} // namespace ada::unicode
|
|
/* end file src/unicode.cpp */
|
|
/* begin file src/serializers.cpp */
|
|
|
|
#include <array>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <string>
|
|
|
|
namespace ada::serializers {
|
|
namespace {
|
|
|
|
// Digit pair LUT for fast decimal write: index 0..99 -> two chars.
|
|
constexpr std::array<char, 200> make_digit_pairs() noexcept {
|
|
std::array<char, 200> t{};
|
|
for (size_t i = 0; i < 100; ++i) {
|
|
t[i * 2] = static_cast<char>('0' + i / 10);
|
|
t[i * 2 + 1] = static_cast<char>('0' + i % 10);
|
|
}
|
|
return t;
|
|
}
|
|
|
|
constexpr auto digit_pairs = make_digit_pairs();
|
|
|
|
ada_really_inline char* write_u8(char* p, uint8_t v) noexcept {
|
|
if (v < 10) {
|
|
*p++ = static_cast<char>('0' + v);
|
|
} else if (v < 100) {
|
|
std::memcpy(p, &digit_pairs[static_cast<size_t>(v) * 2], 2);
|
|
p += 2;
|
|
} else {
|
|
*p++ = static_cast<char>('0' + v / 100);
|
|
std::memcpy(p, &digit_pairs[static_cast<size_t>(v % 100) * 2], 2);
|
|
p += 2;
|
|
}
|
|
return p;
|
|
}
|
|
|
|
ada_really_inline char* write_hex_u16(char* p, uint16_t v) noexcept {
|
|
static constexpr char kHex[] = "0123456789abcdef";
|
|
if (v >= 0x1000) {
|
|
*p++ = kHex[(v >> 12) & 0xf];
|
|
*p++ = kHex[(v >> 8) & 0xf];
|
|
*p++ = kHex[(v >> 4) & 0xf];
|
|
*p++ = kHex[v & 0xf];
|
|
} else if (v >= 0x100) {
|
|
*p++ = kHex[(v >> 8) & 0xf];
|
|
*p++ = kHex[(v >> 4) & 0xf];
|
|
*p++ = kHex[v & 0xf];
|
|
} else if (v >= 0x10) {
|
|
*p++ = kHex[(v >> 4) & 0xf];
|
|
*p++ = kHex[v & 0xf];
|
|
} else {
|
|
*p++ = kHex[v & 0xf];
|
|
}
|
|
return p;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
void find_longest_sequence_of_ipv6_pieces(
|
|
const std::array<uint16_t, 8>& address, size_t& compress,
|
|
size_t& compress_length) noexcept {
|
|
compress = 0;
|
|
compress_length = 0;
|
|
size_t i = 0;
|
|
while (i < 8) {
|
|
if (address[i] != 0) {
|
|
++i;
|
|
continue;
|
|
}
|
|
size_t next = i + 1;
|
|
while (next < 8 && address[next] == 0) {
|
|
++next;
|
|
}
|
|
const size_t count = next - i;
|
|
if (count > compress_length) {
|
|
compress_length = count;
|
|
compress = i;
|
|
}
|
|
i = next;
|
|
}
|
|
}
|
|
|
|
std::string ipv6(const std::array<uint16_t, 8>& address) {
|
|
size_t compress = 0;
|
|
size_t compress_length = 0;
|
|
find_longest_sequence_of_ipv6_pieces(address, compress, compress_length);
|
|
|
|
// Skip compression when the longest zero run is a single piece.
|
|
if (compress_length <= 1) {
|
|
compress = compress_length = 8;
|
|
}
|
|
|
|
// Max: '[' + 8*4 hex + 7 ':' + ']' = 41
|
|
std::string output(4 * 8 + 7 + 2, '\0');
|
|
char* point = output.data();
|
|
*point++ = '[';
|
|
size_t piece_index = 0;
|
|
while (true) {
|
|
if (piece_index == compress) {
|
|
*point++ = ':';
|
|
// If we skip a value initially, we need to write '::'.
|
|
if (piece_index == 0) {
|
|
*point++ = ':';
|
|
}
|
|
piece_index += compress_length;
|
|
if (piece_index == 8) {
|
|
break;
|
|
}
|
|
}
|
|
point = write_hex_u16(point, address[piece_index]);
|
|
++piece_index;
|
|
if (piece_index == 8) {
|
|
break;
|
|
}
|
|
*point++ = ':';
|
|
}
|
|
*point++ = ']';
|
|
output.resize(static_cast<size_t>(point - output.data()));
|
|
return output;
|
|
}
|
|
|
|
std::string ipv4(const uint64_t address) {
|
|
std::string output(15, '\0');
|
|
char* point = output.data();
|
|
point = write_u8(point, static_cast<uint8_t>(address >> 24));
|
|
*point++ = '.';
|
|
point = write_u8(point, static_cast<uint8_t>(address >> 16));
|
|
*point++ = '.';
|
|
point = write_u8(point, static_cast<uint8_t>(address >> 8));
|
|
*point++ = '.';
|
|
point = write_u8(point, static_cast<uint8_t>(address));
|
|
output.resize(static_cast<size_t>(point - output.data()));
|
|
return output;
|
|
}
|
|
|
|
} // namespace ada::serializers
|
|
/* end file src/serializers.cpp */
|
|
/* begin file src/implementation.cpp */
|
|
|
|
#include <atomic>
|
|
#include <limits>
|
|
#include <optional>
|
|
#include <string_view>
|
|
|
|
|
|
namespace ada {
|
|
|
|
static std::atomic<uint32_t> max_input_length_{
|
|
std::numeric_limits<uint32_t>::max()};
|
|
|
|
void set_max_input_length(uint32_t length) {
|
|
max_input_length_.store(length, std::memory_order_relaxed);
|
|
}
|
|
|
|
uint32_t get_max_input_length() {
|
|
return max_input_length_.load(std::memory_order_relaxed);
|
|
}
|
|
|
|
namespace {
|
|
|
|
// @private
|
|
// Fast-path validator for can_parse.
|
|
//
|
|
// Validates absolute special (non-file) URLs without constructing any
|
|
// url_aggregator object and without running the state machine.
|
|
// Performs a single forward scan over the input bytes.
|
|
//
|
|
// Returns:
|
|
// true -- URL is structurally valid
|
|
// false -- URL is definitely invalid
|
|
// nullopt -- edge case; fall through to the full parser
|
|
// (credentials, IDNA, IPv4/6, tabs/newlines, relative URLs, ...)
|
|
std::optional<bool> try_can_parse_absolute_fast(
|
|
std::string_view input) noexcept {
|
|
const uint8_t* b = reinterpret_cast<const uint8_t*>(input.data());
|
|
size_t len = input.size();
|
|
|
|
// -- Inline C0 whitespace trim (no allocation) --------------------------
|
|
// Note: \t (0x09), \n (0x0a), \r (0x0d) are all <= 0x20, so any
|
|
// leading/trailing tabs or newlines are correctly stripped here, matching
|
|
// the WHATWG spec's "remove leading/trailing C0 control and space" step.
|
|
while (len > 0 && b[0] <= 0x20) {
|
|
b++;
|
|
len--;
|
|
}
|
|
while (len > 0 && b[len - 1] <= 0x20) {
|
|
len--;
|
|
}
|
|
if (len == 0) return false;
|
|
|
|
// -- Scheme detection -----------------------------------------------------
|
|
// Fast path for HTTP and HTTPS (covers ~90%+ of real-world URLs).
|
|
// Avoids the general scheme loop, buffer copy, and perfect hash lookup.
|
|
// We know HTTP and HTTPS are special non-file schemes, so no further
|
|
// scheme_type checks are needed on the fast path -- only `pos` matters.
|
|
size_t pos;
|
|
|
|
if (len >= 7 && (b[0] | 0x20) == 'h' && (b[1] | 0x20) == 't' &&
|
|
(b[2] | 0x20) == 't' && (b[3] | 0x20) == 'p') {
|
|
if (b[4] == ':' && b[5] == '/' && b[6] == '/') {
|
|
pos = 7;
|
|
goto skip_extra_slashes;
|
|
}
|
|
if (len >= 8 && (b[4] | 0x20) == 's' && b[5] == ':' && b[6] == '/' &&
|
|
b[7] == '/') {
|
|
pos = 8;
|
|
goto skip_extra_slashes;
|
|
}
|
|
// Fall through: could be "httpe://", tabs in scheme, etc.
|
|
}
|
|
|
|
{
|
|
// General scheme detection for ws, wss, ftp, and edge cases.
|
|
if (!checkers::is_alpha(static_cast<char>(b[0]))) return false;
|
|
|
|
// Scan for ':' within the first 7 bytes. All special schemes are <= 5
|
|
// chars ("https"), so any URL whose first ':' is beyond byte 6 is either
|
|
// non-special or relative -- both require the full parser.
|
|
size_t colon_pos = 0;
|
|
for (size_t i = 1;; ++i) {
|
|
if (i >= 7 || i >= len) return std::nullopt;
|
|
const char c = static_cast<char>(b[i]);
|
|
if (c == ':') {
|
|
colon_pos = i;
|
|
break;
|
|
}
|
|
// Tabs/newlines in the scheme require the full parser to strip them.
|
|
if (c == '\t' || c == '\n' || c == '\r') return std::nullopt;
|
|
if (!unicode::is_alnum_plus(c)) return false;
|
|
}
|
|
|
|
// Lowercase scheme bytes inline and classify via the existing perfect
|
|
// hash.
|
|
char scheme_buf[6];
|
|
scheme_buf[0] = static_cast<char>(b[0] | 0x20);
|
|
for (size_t i = 1; i < colon_pos; ++i)
|
|
scheme_buf[i] = static_cast<char>(b[i] | 0x20);
|
|
|
|
const ada::scheme::type scheme_type =
|
|
ada::scheme::get_scheme_type({scheme_buf, colon_pos});
|
|
|
|
// Only handle special, non-file schemes.
|
|
if (scheme_type == ada::scheme::NOT_SPECIAL) return std::nullopt;
|
|
if (scheme_type == ada::scheme::FILE) return std::nullopt;
|
|
|
|
// Per WHATWG, special URLs don't require "//": "http:example.com" is valid
|
|
// (SPECIAL_AUTHORITY_IGNORE_SLASHES just skips leading slashes and
|
|
// proceeds to AUTHORITY). Defer to the inline fallback for any input
|
|
// without "://".
|
|
pos = colon_pos + 1;
|
|
if (pos + 2 > len || b[pos] != '/' || b[pos + 1] != '/') {
|
|
return std::nullopt;
|
|
}
|
|
pos += 2;
|
|
}
|
|
|
|
skip_extra_slashes:
|
|
// SPECIAL_AUTHORITY_IGNORE_SLASHES: the full parser skips any additional
|
|
// leading '/' or '\' after the initial "//". Mirror that here so we don't
|
|
// mis-identify the host as empty when there are extra slashes.
|
|
while (pos < len && (b[pos] == '/' || b[pos] == '\\')) {
|
|
++pos;
|
|
}
|
|
|
|
// Early IPv6 bail-out: if the authority starts with '[', it's an IPv6
|
|
// literal which requires the full parser. Checking here avoids scanning
|
|
// the entire bracketed address only to bail out afterward.
|
|
if (pos < len && b[pos] == '[') return std::nullopt;
|
|
|
|
// -- Merged authority + host scan ------------------------------------------
|
|
// A single forward pass over the authority bytes that simultaneously:
|
|
// - finds the authority end and port colon
|
|
// - validates host characters (forbidden domain code points)
|
|
// - tracks IPv4 indicators (all-decimal-dots, last non-dot char)
|
|
// - detects xn-- prefixes (IDNA punycode)
|
|
// - detects tabs/newlines (which require the full parser to strip)
|
|
// This replaces 4 separate scans over the host bytes.
|
|
const size_t auth_start = pos;
|
|
size_t auth_end = pos;
|
|
size_t port_colon = SIZE_MAX;
|
|
bool all_dec_dots = true;
|
|
uint8_t last_non_dot = 0;
|
|
|
|
for (; auth_end < len; ++auth_end) {
|
|
const uint8_t c = b[auth_end];
|
|
|
|
// Non-ASCII -> needs IDNA processing -> full parser.
|
|
if (c >= 0x80) return std::nullopt;
|
|
|
|
// Authority delimiters.
|
|
if (c == '/' || c == '?' || c == '#' || c == '\\') break;
|
|
|
|
// Port separator.
|
|
if (c == ':') {
|
|
if (port_colon == SIZE_MAX) port_colon = auth_end;
|
|
continue;
|
|
}
|
|
|
|
// Credentials or percent-encoding -> full parser.
|
|
if (c == '@' || c == '%') return std::nullopt;
|
|
|
|
// Tabs/newlines anywhere in the authority require the full parser to
|
|
// strip them before validation. Without this, a tab in the port (e.g.
|
|
// "http://host:8\t0/") would be mis-rejected by port validation.
|
|
if (c == '\t' || c == '\n' || c == '\r') return std::nullopt;
|
|
|
|
// Skip remaining host-specific checks for port bytes. Port digits are
|
|
// validated separately below, and no forbidden-domain-code-point check
|
|
// is needed on port characters.
|
|
if (port_colon != SIZE_MAX) continue;
|
|
|
|
// -- Host byte validation (inlined) ------------------------------------
|
|
// Forbidden domain code points that are not already caught above:
|
|
// C0 controls and space (0x00-0x20), DEL (0x7F), <, >, [, ], ^, |.
|
|
// At this stage, the input may still be userinfo or be normalized later
|
|
// (e.g., percent-encoded), so we do not reject here and defer to the
|
|
// parser. Characters already caught: >= 0x80 (non-ASCII), '/' '?' '#' '\\'
|
|
// (delimiters), ':' (port), '@' '%' (bail), '\t' '\n' '\r' (bail).
|
|
if (c <= 0x20 || c == 0x7F || c == '<' || c == '>' || c == '[' ||
|
|
c == ']' || c == '^' || c == '|') {
|
|
return std::nullopt;
|
|
}
|
|
|
|
// Track whether host is all decimal digits and dots (potential IPv4).
|
|
if (c != '.' && (c < '0' || c > '9')) all_dec_dots = false;
|
|
|
|
// Track last non-dot character for the IPv4 hex/octal heuristic.
|
|
if (c != '.') last_non_dot = c;
|
|
|
|
// Detect xn-- prefix inline (IDNA punycode -> needs full parser).
|
|
// Checking at every position mirrors the original behavior: any
|
|
// occurrence of "xn--" in the host (not just at label boundaries)
|
|
// triggers a bail-out to the full IDNA validator.
|
|
if ((c | 0x20) == 'x' && auth_end + 4 <= len &&
|
|
(b[auth_end + 1] | 0x20) == 'n' && b[auth_end + 2] == '-' &&
|
|
b[auth_end + 3] == '-') {
|
|
return std::nullopt;
|
|
}
|
|
}
|
|
|
|
const size_t host_end = (port_colon != SIZE_MAX) ? port_colon : auth_end;
|
|
|
|
// Empty host is invalid for special URLs.
|
|
if (auth_start == host_end) return false;
|
|
|
|
// -- IPv4 handling ---------------------------------------------------------
|
|
const char* host_ptr = reinterpret_cast<const char*>(b + auth_start);
|
|
const size_t host_len = host_end - auth_start;
|
|
|
|
if (all_dec_dots) {
|
|
// Host is all decimal digits and dots -> try the fast IPv4 parser.
|
|
if (checkers::try_parse_ipv4_fast({host_ptr, host_len}) !=
|
|
checkers::ipv4_fast_fail) {
|
|
// Valid decimal IPv4 host. Do NOT return true yet: the port still
|
|
// needs to be validated below before we can declare the URL valid.
|
|
goto validate_port;
|
|
}
|
|
// Fast IPv4 parsing failed (e.g. host is ".", "..", "1.2.3.500").
|
|
// Such hosts may still be valid domain names; defer to the full parser.
|
|
return std::nullopt;
|
|
}
|
|
|
|
// Last-significant-character heuristic for non-decimal IPv4 (hex/octal):
|
|
// if the last non-dot char is a digit, 'a'-'f', or 'x' the host might be
|
|
// an IPv4 address that the fast path can't validate -- fall through.
|
|
// last_non_dot was tracked during the authority scan above.
|
|
{
|
|
const uint8_t lc = last_non_dot | 0x20;
|
|
if ((last_non_dot >= '0' && last_non_dot <= '9') ||
|
|
(lc >= 'a' && lc <= 'f') || lc == 'x') {
|
|
return std::nullopt;
|
|
}
|
|
}
|
|
|
|
// -- Port validation -------------------------------------------------------
|
|
validate_port:
|
|
if (port_colon != SIZE_MAX) {
|
|
const uint8_t* pp = b + port_colon + 1;
|
|
size_t pl = auth_end - port_colon - 1;
|
|
if (pl > 0) {
|
|
// Strip leading zeros: "0000001" == 1, "0000000000000" == 0, both valid.
|
|
// Only the significant digits count toward the 5-digit maximum.
|
|
while (pl > 0 && *pp == '0') {
|
|
++pp;
|
|
--pl;
|
|
}
|
|
if (pl > 5) return false; // significant digits > 99999
|
|
uint32_t pv = 0;
|
|
for (size_t i = 0; i < pl; ++i) {
|
|
if (pp[i] < '0' || pp[i] > '9') return false;
|
|
pv = pv * 10 + (pp[i] - '0');
|
|
}
|
|
if (pv > 65535) return false;
|
|
}
|
|
}
|
|
|
|
// Path, query, and fragment are structurally always valid for can_parse --
|
|
// the parser would encode whatever is there.
|
|
return true;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
template <class result_type>
|
|
ada_warn_unused tl::expected<result_type, errors> parse(
|
|
std::string_view input, const result_type* base_url) {
|
|
result_type u = ada::parser::parse_url_impl<result_type>(input, base_url);
|
|
if (!u.is_valid) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
return u;
|
|
}
|
|
|
|
template ada::result<url> parse<url>(std::string_view input,
|
|
const url* base_url = nullptr);
|
|
template ada::result<url_aggregator> parse<url_aggregator>(
|
|
std::string_view input, const url_aggregator* base_url = nullptr);
|
|
|
|
std::string href_from_file(std::string_view input) {
|
|
// Match ada::parse / setters: refuse inputs that already exceed the limit.
|
|
// Path percent-encoding can still expand the result, so we also check the
|
|
// final href below.
|
|
const uint32_t max_length = ada::get_max_input_length();
|
|
if (input.size() > max_length) {
|
|
return {};
|
|
}
|
|
|
|
// This is going to be much faster than constructing a URL.
|
|
std::string tmp_buffer;
|
|
std::string_view internal_input;
|
|
if (unicode::has_tabs_or_newline(input)) {
|
|
tmp_buffer = input;
|
|
helpers::remove_ascii_tab_or_newline(tmp_buffer);
|
|
internal_input = tmp_buffer;
|
|
} else {
|
|
internal_input = input;
|
|
}
|
|
std::string path;
|
|
if (internal_input.empty()) {
|
|
path = "/";
|
|
} else if ((internal_input[0] == '/') || (internal_input[0] == '\\')) {
|
|
helpers::parse_prepared_path(internal_input.substr(1),
|
|
ada::scheme::type::FILE, path);
|
|
} else {
|
|
helpers::parse_prepared_path(internal_input, ada::scheme::type::FILE, path);
|
|
}
|
|
std::string result = "file://" + path;
|
|
if (result.size() > max_length) {
|
|
return {};
|
|
}
|
|
return result;
|
|
}
|
|
|
|
bool can_parse(std::string_view input, const std::string_view* base_input) {
|
|
// Must match parse().has_value(), including post-normalization max length.
|
|
// Percent-encoding expands a byte by at most 3x, but IDNA expands more: a
|
|
// 3-byte UTF-8 label such as U+337F becomes the 17-byte "xn--6oqv20b1zgzxr",
|
|
// so a dotted host sustains 4.5x. When the input (plus base, if any) fits in
|
|
// max_length/5, the normalized href cannot exceed max_length, so
|
|
// validation-only parsing (store_values=false) is safe.
|
|
|
|
// Hot path first: absolute special URLs, no base. Avoid loading max_length
|
|
// until we need it (common absolute-fast true/false cases).
|
|
if (base_input == nullptr) {
|
|
if (const auto r = try_can_parse_absolute_fast(input)) {
|
|
if (!*r) {
|
|
return false;
|
|
}
|
|
// size <= max/5 => normalized href cannot exceed max (4.5x expansion).
|
|
// Check this first: default max is ~4GB so almost all URLs return true.
|
|
const uint32_t max_length = ada::get_max_input_length();
|
|
if (input.size() <= static_cast<size_t>(max_length) / 5) {
|
|
return true;
|
|
}
|
|
if (input.size() > max_length) {
|
|
return false;
|
|
}
|
|
return ada::parser::parse_url_impl<ada::url_aggregator, true>(input,
|
|
nullptr)
|
|
.is_valid;
|
|
}
|
|
}
|
|
|
|
const uint32_t max_length = ada::get_max_input_length();
|
|
if (input.size() > max_length) {
|
|
return false;
|
|
}
|
|
if (base_input != nullptr && base_input->size() > max_length) {
|
|
return false;
|
|
}
|
|
|
|
// Relative resolution combines base + input; bound the sum so 4.5x expansion
|
|
// of either side cannot push the final href past max_length.
|
|
const size_t combined =
|
|
input.size() + (base_input == nullptr ? 0 : base_input->size());
|
|
const bool size_safe = combined <= static_cast<size_t>(max_length) / 5;
|
|
|
|
if (size_safe) {
|
|
// Validation-only: no buffer build, host still fully checked.
|
|
ada::url_aggregator base_agg;
|
|
ada::url_aggregator* base_ptr = nullptr;
|
|
if (base_input != nullptr) {
|
|
base_agg = ada::parser::parse_url_impl<ada::url_aggregator, false>(
|
|
*base_input, nullptr);
|
|
if (!base_agg.is_valid) {
|
|
return false;
|
|
}
|
|
base_ptr = &base_agg;
|
|
}
|
|
return ada::parser::parse_url_impl<ada::url_aggregator, false>(input,
|
|
base_ptr)
|
|
.is_valid;
|
|
}
|
|
|
|
// Near the limit: full parse so post-normalization length matches parse().
|
|
if (base_input == nullptr) {
|
|
return ada::parser::parse_url_impl<ada::url_aggregator, true>(input,
|
|
nullptr)
|
|
.is_valid;
|
|
}
|
|
ada::url_aggregator base_agg =
|
|
ada::parser::parse_url_impl<ada::url_aggregator, true>(*base_input,
|
|
nullptr);
|
|
if (!base_agg.is_valid) {
|
|
return false;
|
|
}
|
|
return ada::parser::parse_url_impl<ada::url_aggregator, true>(input,
|
|
&base_agg)
|
|
.is_valid;
|
|
}
|
|
|
|
ada_warn_unused std::string_view to_string(ada::encoding_type type) {
|
|
switch (type) {
|
|
case ada::encoding_type::UTF8:
|
|
return "UTF-8";
|
|
case ada::encoding_type::UTF_16LE:
|
|
return "UTF-16LE";
|
|
case ada::encoding_type::UTF_16BE:
|
|
return "UTF-16BE";
|
|
default:
|
|
unreachable();
|
|
}
|
|
}
|
|
|
|
} // namespace ada
|
|
/* end file src/implementation.cpp */
|
|
/* begin file src/helpers.cpp */
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <sstream>
|
|
|
|
|
|
#if ADA_SSSE3
|
|
#include <tmmintrin.h>
|
|
#endif
|
|
|
|
namespace ada::helpers {
|
|
|
|
template <typename out_iter>
|
|
void encode_json(std::string_view view, out_iter out) {
|
|
// trivial implementation. could be faster.
|
|
const char* hexvalues =
|
|
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f";
|
|
for (uint8_t c : view) {
|
|
if (c == '\\') {
|
|
*out++ = '\\';
|
|
*out++ = '\\';
|
|
} else if (c == '"') {
|
|
*out++ = '\\';
|
|
*out++ = '"';
|
|
} else if (c <= 0x1f) {
|
|
*out++ = '\\';
|
|
*out++ = 'u';
|
|
*out++ = '0';
|
|
*out++ = '0';
|
|
*out++ = hexvalues[2 * c];
|
|
*out++ = hexvalues[2 * c + 1];
|
|
} else {
|
|
*out++ = c;
|
|
}
|
|
}
|
|
}
|
|
|
|
ada_unused std::string get_state(ada::state s) {
|
|
switch (s) {
|
|
case ada::state::AUTHORITY:
|
|
return "Authority";
|
|
case ada::state::SCHEME_START:
|
|
return "Scheme Start";
|
|
case ada::state::SCHEME:
|
|
return "Scheme";
|
|
case ada::state::HOST:
|
|
return "Host";
|
|
case ada::state::NO_SCHEME:
|
|
return "No Scheme";
|
|
case ada::state::FRAGMENT:
|
|
return "Fragment";
|
|
case ada::state::RELATIVE_SCHEME:
|
|
return "Relative Scheme";
|
|
case ada::state::RELATIVE_SLASH:
|
|
return "Relative Slash";
|
|
case ada::state::FILE:
|
|
return "File";
|
|
case ada::state::FILE_HOST:
|
|
return "File Host";
|
|
case ada::state::FILE_SLASH:
|
|
return "File Slash";
|
|
case ada::state::PATH_OR_AUTHORITY:
|
|
return "Path or Authority";
|
|
case ada::state::SPECIAL_AUTHORITY_IGNORE_SLASHES:
|
|
return "Special Authority Ignore Slashes";
|
|
case ada::state::SPECIAL_AUTHORITY_SLASHES:
|
|
return "Special Authority Slashes";
|
|
case ada::state::SPECIAL_RELATIVE_OR_AUTHORITY:
|
|
return "Special Relative or Authority";
|
|
case ada::state::QUERY:
|
|
return "Query";
|
|
case ada::state::PATH:
|
|
return "Path";
|
|
case ada::state::PATH_START:
|
|
return "Path Start";
|
|
case ada::state::OPAQUE_PATH:
|
|
return "Opaque Path";
|
|
case ada::state::PORT:
|
|
return "Port";
|
|
default:
|
|
return "unknown state";
|
|
}
|
|
}
|
|
|
|
ada_really_inline std::optional<std::string_view> prune_hash(
|
|
std::string_view& input) noexcept {
|
|
// compiles down to 20--30 instructions including a class to memchr (C
|
|
// function). this function should be quite fast.
|
|
size_t location_of_first = input.find('#');
|
|
if (location_of_first == std::string_view::npos) {
|
|
return std::nullopt;
|
|
}
|
|
std::string_view hash = input;
|
|
hash.remove_prefix(location_of_first + 1);
|
|
input.remove_suffix(input.size() - location_of_first);
|
|
return hash;
|
|
}
|
|
|
|
ada_really_inline bool shorten_path(std::string& path, ada::scheme::type type) {
|
|
// Let path be url's path.
|
|
// If url's scheme is "file", path's size is 1, and path[0] is a normalized
|
|
// Windows drive letter, then return.
|
|
if (type == ada::scheme::type::FILE &&
|
|
path.find('/', 1) == std::string_view::npos && !path.empty()) {
|
|
if (checkers::is_normalized_windows_drive_letter(
|
|
helpers::substring(path, 1))) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Remove path's last item, if any.
|
|
size_t last_delimiter = path.rfind('/');
|
|
if (last_delimiter != std::string::npos) {
|
|
path.erase(last_delimiter);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
ada_really_inline bool shorten_path(std::string_view& path,
|
|
ada::scheme::type type) {
|
|
// Let path be url's path.
|
|
// If url's scheme is "file", path's size is 1, and path[0] is a normalized
|
|
// Windows drive letter, then return.
|
|
if (type == ada::scheme::type::FILE &&
|
|
path.find('/', 1) == std::string_view::npos && !path.empty()) {
|
|
if (checkers::is_normalized_windows_drive_letter(
|
|
helpers::substring(path, 1))) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Remove path's last item, if any.
|
|
if (!path.empty()) {
|
|
size_t slash_loc = path.rfind('/');
|
|
if (slash_loc != std::string_view::npos) {
|
|
path.remove_suffix(path.size() - slash_loc);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
ada_really_inline void remove_ascii_tab_or_newline(std::string& input) {
|
|
// if this ever becomes a performance issue, we could use an approach similar
|
|
// to has_tabs_or_newline
|
|
std::erase_if(input, ada::unicode::is_ascii_tab_or_newline);
|
|
}
|
|
|
|
ada_really_inline constexpr std::string_view substring(std::string_view input,
|
|
size_t pos) {
|
|
ADA_ASSERT_TRUE(pos <= input.size());
|
|
// The following is safer but unneeded if we have the above line:
|
|
// return pos > input.size() ? std::string_view() : input.substr(pos);
|
|
return input.substr(pos);
|
|
}
|
|
|
|
ada_really_inline void resize(std::string_view& input, size_t pos) noexcept {
|
|
ADA_ASSERT_TRUE(pos <= input.size());
|
|
input.remove_suffix(input.size() - pos);
|
|
}
|
|
|
|
// computes the number of trailing zeroes
|
|
// this is a private inline function only defined in this source file.
|
|
ada_really_inline int trailing_zeroes(uint32_t input_num) noexcept {
|
|
#ifdef ADA_REGULAR_VISUAL_STUDIO
|
|
unsigned long ret;
|
|
// Search the mask data from least significant bit (LSB)
|
|
// to the most significant bit (MSB) for a set bit (1).
|
|
_BitScanForward(&ret, input_num);
|
|
return (int)ret;
|
|
#else // ADA_REGULAR_VISUAL_STUDIO
|
|
return __builtin_ctzl(input_num);
|
|
#endif // ADA_REGULAR_VISUAL_STUDIO
|
|
}
|
|
|
|
// starting at index location, this finds the next location of a character
|
|
// :, /, \\, ? or [. If none is found, view.size() is returned.
|
|
// For use within get_host_delimiter_location.
|
|
#if ADA_SSSE3
|
|
ada_really_inline size_t find_next_host_delimiter_special(
|
|
std::string_view view, size_t location) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (view.size() - location < 16) { // slow path
|
|
for (size_t i = location; i < view.size(); i++) {
|
|
if (view[i] == ':' || view[i] == '/' || view[i] == '\\' ||
|
|
view[i] == '?' || view[i] == '[') {
|
|
return i;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
// Using SSSE3's _mm_shuffle_epi8 for table lookup (same approach as NEON)
|
|
size_t i = location;
|
|
const __m128i low_mask =
|
|
_mm_setr_epi8(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x01, 0x04, 0x04, 0x00, 0x00, 0x03);
|
|
const __m128i high_mask =
|
|
_mm_setr_epi8(0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
|
const __m128i fmask = _mm_set1_epi8(0xf);
|
|
const __m128i zero = _mm_setzero_si128();
|
|
for (; i + 15 < view.size(); i += 16) {
|
|
__m128i word = _mm_loadu_si128((const __m128i*)(view.data() + i));
|
|
__m128i lowpart = _mm_shuffle_epi8(low_mask, _mm_and_si128(word, fmask));
|
|
__m128i highpart = _mm_shuffle_epi8(
|
|
high_mask, _mm_and_si128(_mm_srli_epi16(word, 4), fmask));
|
|
__m128i classify = _mm_and_si128(lowpart, highpart);
|
|
__m128i is_zero = _mm_cmpeq_epi8(classify, zero);
|
|
// _mm_movemask_epi8 returns a 16-bit mask in bits 0-15, with bits 16-31
|
|
// zero. After NOT (~), bits 16-31 become 1. We must mask to 16 bits to
|
|
// avoid false positives.
|
|
int mask = ~_mm_movemask_epi8(is_zero) & 0xFFFF;
|
|
if (mask != 0) {
|
|
return i + trailing_zeroes(static_cast<uint32_t>(mask));
|
|
}
|
|
}
|
|
if (i < view.size()) {
|
|
__m128i word =
|
|
_mm_loadu_si128((const __m128i*)(view.data() + view.length() - 16));
|
|
__m128i lowpart = _mm_shuffle_epi8(low_mask, _mm_and_si128(word, fmask));
|
|
__m128i highpart = _mm_shuffle_epi8(
|
|
high_mask, _mm_and_si128(_mm_srli_epi16(word, 4), fmask));
|
|
__m128i classify = _mm_and_si128(lowpart, highpart);
|
|
__m128i is_zero = _mm_cmpeq_epi8(classify, zero);
|
|
// _mm_movemask_epi8 returns a 16-bit mask in bits 0-15, with bits 16-31
|
|
// zero. After NOT (~), bits 16-31 become 1. We must mask to 16 bits to
|
|
// avoid false positives.
|
|
int mask = ~_mm_movemask_epi8(is_zero) & 0xFFFF;
|
|
if (mask != 0) {
|
|
return view.length() - 16 + trailing_zeroes(static_cast<uint32_t>(mask));
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
#elif ADA_NEON
|
|
// The ada_make_uint8x16_t macro is necessary because Visual Studio does not
|
|
// support direct initialization of uint8x16_t. See
|
|
// https://developercommunity.visualstudio.com/t/error-C2078:-too-many-initializers-whe/402911?q=backend+neon
|
|
#ifndef ada_make_uint8x16_t
|
|
#define ada_make_uint8x16_t(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \
|
|
x13, x14, x15, x16) \
|
|
([=]() { \
|
|
static uint8_t array[16] = {x1, x2, x3, x4, x5, x6, x7, x8, \
|
|
x9, x10, x11, x12, x13, x14, x15, x16}; \
|
|
return vld1q_u8(array); \
|
|
}())
|
|
#endif
|
|
|
|
ada_really_inline size_t find_next_host_delimiter_special(
|
|
std::string_view view, size_t location) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (view.size() - location < 16) { // slow path
|
|
for (size_t i = location; i < view.size(); i++) {
|
|
if (view[i] == ':' || view[i] == '/' || view[i] == '\\' ||
|
|
view[i] == '?' || view[i] == '[') {
|
|
return i;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
auto to_bitmask = [](uint8x16_t input) -> uint16_t {
|
|
uint8x16_t bit_mask =
|
|
ada_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x01,
|
|
0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
|
|
uint8x16_t minput = vandq_u8(input, bit_mask);
|
|
uint8x16_t tmp = vpaddq_u8(minput, minput);
|
|
tmp = vpaddq_u8(tmp, tmp);
|
|
tmp = vpaddq_u8(tmp, tmp);
|
|
return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0);
|
|
};
|
|
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = location;
|
|
uint8x16_t low_mask =
|
|
ada_make_uint8x16_t(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x03);
|
|
uint8x16_t high_mask =
|
|
ada_make_uint8x16_t(0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
|
uint8x16_t fmask = vmovq_n_u8(0xf);
|
|
uint8x16_t zero{0};
|
|
for (; i + 15 < view.size(); i += 16) {
|
|
uint8x16_t word = vld1q_u8((const uint8_t*)view.data() + i);
|
|
uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask));
|
|
uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4));
|
|
uint8x16_t classify = vandq_u8(lowpart, highpart);
|
|
if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) {
|
|
uint8x16_t is_zero = vceqq_u8(classify, zero);
|
|
uint16_t is_non_zero = static_cast<uint16_t>(~to_bitmask(is_zero));
|
|
return i + trailing_zeroes(is_non_zero);
|
|
}
|
|
}
|
|
|
|
if (i < view.size()) {
|
|
uint8x16_t word =
|
|
vld1q_u8((const uint8_t*)view.data() + view.length() - 16);
|
|
uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask));
|
|
uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4));
|
|
uint8x16_t classify = vandq_u8(lowpart, highpart);
|
|
if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) {
|
|
uint8x16_t is_zero = vceqq_u8(classify, zero);
|
|
uint16_t is_non_zero = static_cast<uint16_t>(~to_bitmask(is_zero));
|
|
return view.length() - 16 + trailing_zeroes(is_non_zero);
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
#elif ADA_SSE2
|
|
ada_really_inline size_t find_next_host_delimiter_special(
|
|
std::string_view view, size_t location) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (view.size() - location < 16) { // slow path
|
|
for (size_t i = location; i < view.size(); i++) {
|
|
if (view[i] == ':' || view[i] == '/' || view[i] == '\\' ||
|
|
view[i] == '?' || view[i] == '[') {
|
|
return i;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = location;
|
|
const __m128i mask1 = _mm_set1_epi8(':');
|
|
const __m128i mask2 = _mm_set1_epi8('/');
|
|
const __m128i mask3 = _mm_set1_epi8('\\');
|
|
const __m128i mask4 = _mm_set1_epi8('?');
|
|
const __m128i mask5 = _mm_set1_epi8('[');
|
|
|
|
for (; i + 15 < view.size(); i += 16) {
|
|
__m128i word = _mm_loadu_si128((const __m128i*)(view.data() + i));
|
|
__m128i m1 = _mm_cmpeq_epi8(word, mask1);
|
|
__m128i m2 = _mm_cmpeq_epi8(word, mask2);
|
|
__m128i m3 = _mm_cmpeq_epi8(word, mask3);
|
|
__m128i m4 = _mm_cmpeq_epi8(word, mask4);
|
|
__m128i m5 = _mm_cmpeq_epi8(word, mask5);
|
|
__m128i m = _mm_or_si128(
|
|
_mm_or_si128(_mm_or_si128(m1, m2), _mm_or_si128(m3, m4)), m5);
|
|
int mask = _mm_movemask_epi8(m);
|
|
if (mask != 0) {
|
|
return i + trailing_zeroes(mask);
|
|
}
|
|
}
|
|
if (i < view.size()) {
|
|
__m128i word =
|
|
_mm_loadu_si128((const __m128i*)(view.data() + view.length() - 16));
|
|
__m128i m1 = _mm_cmpeq_epi8(word, mask1);
|
|
__m128i m2 = _mm_cmpeq_epi8(word, mask2);
|
|
__m128i m3 = _mm_cmpeq_epi8(word, mask3);
|
|
__m128i m4 = _mm_cmpeq_epi8(word, mask4);
|
|
__m128i m5 = _mm_cmpeq_epi8(word, mask5);
|
|
__m128i m = _mm_or_si128(
|
|
_mm_or_si128(_mm_or_si128(m1, m2), _mm_or_si128(m3, m4)), m5);
|
|
int mask = _mm_movemask_epi8(m);
|
|
if (mask != 0) {
|
|
return view.length() - 16 + trailing_zeroes(mask);
|
|
}
|
|
}
|
|
return size_t(view.length());
|
|
}
|
|
#elif ADA_LSX
|
|
ada_really_inline size_t find_next_host_delimiter_special(
|
|
std::string_view view, size_t location) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (view.size() - location < 16) { // slow path
|
|
for (size_t i = location; i < view.size(); i++) {
|
|
if (view[i] == ':' || view[i] == '/' || view[i] == '\\' ||
|
|
view[i] == '?' || view[i] == '[') {
|
|
return i;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = location;
|
|
const __m128i mask1 = __lsx_vrepli_b(':');
|
|
const __m128i mask2 = __lsx_vrepli_b('/');
|
|
const __m128i mask3 = __lsx_vrepli_b('\\');
|
|
const __m128i mask4 = __lsx_vrepli_b('?');
|
|
const __m128i mask5 = __lsx_vrepli_b('[');
|
|
|
|
for (; i + 15 < view.size(); i += 16) {
|
|
__m128i word = __lsx_vld((const __m128i*)(view.data() + i), 0);
|
|
__m128i m1 = __lsx_vseq_b(word, mask1);
|
|
__m128i m2 = __lsx_vseq_b(word, mask2);
|
|
__m128i m3 = __lsx_vseq_b(word, mask3);
|
|
__m128i m4 = __lsx_vseq_b(word, mask4);
|
|
__m128i m5 = __lsx_vseq_b(word, mask5);
|
|
__m128i m =
|
|
__lsx_vor_v(__lsx_vor_v(__lsx_vor_v(m1, m2), __lsx_vor_v(m3, m4)), m5);
|
|
int mask = __lsx_vpickve2gr_hu(__lsx_vmsknz_b(m), 0);
|
|
if (mask != 0) {
|
|
return i + trailing_zeroes(mask);
|
|
}
|
|
}
|
|
if (i < view.size()) {
|
|
__m128i word =
|
|
__lsx_vld((const __m128i*)(view.data() + view.length() - 16), 0);
|
|
__m128i m1 = __lsx_vseq_b(word, mask1);
|
|
__m128i m2 = __lsx_vseq_b(word, mask2);
|
|
__m128i m3 = __lsx_vseq_b(word, mask3);
|
|
__m128i m4 = __lsx_vseq_b(word, mask4);
|
|
__m128i m5 = __lsx_vseq_b(word, mask5);
|
|
__m128i m =
|
|
__lsx_vor_v(__lsx_vor_v(__lsx_vor_v(m1, m2), __lsx_vor_v(m3, m4)), m5);
|
|
int mask = __lsx_vpickve2gr_hu(__lsx_vmsknz_b(m), 0);
|
|
if (mask != 0) {
|
|
return view.length() - 16 + trailing_zeroes(mask);
|
|
}
|
|
}
|
|
return size_t(view.length());
|
|
}
|
|
#elif ADA_RVV
|
|
ada_really_inline size_t find_next_host_delimiter_special(
|
|
std::string_view view, size_t location) noexcept {
|
|
// The LUT approach was a bit slower on the SpacemiT X60, but I could see it
|
|
// being faster on future hardware.
|
|
#if 0
|
|
// LUT generated using: s=":/\\?["; list(zip([((ord(c)>>2)&0xF)for c in s],s))
|
|
static const uint8_t tbl[16] = {
|
|
0xF, 0, 0, 0, 0, 0, '[', '\\', 0, 0, 0, '/', 0, 0, ':', '?'
|
|
};
|
|
vuint8m1_t vtbl = __riscv_vle8_v_u8m1(tbl, 16);
|
|
#endif
|
|
uint8_t* src = (uint8_t*)view.data() + location;
|
|
for (size_t vl, n = view.size() - location; n > 0;
|
|
n -= vl, src += vl, location += vl) {
|
|
vl = __riscv_vsetvl_e8m1(n);
|
|
vuint8m1_t v = __riscv_vle8_v_u8m1(src, vl);
|
|
#if 0
|
|
vuint8m1_t vidx = __riscv_vand(__riscv_vsrl(v, 2, vl), 0xF, vl);
|
|
vuint8m1_t vlut = __riscv_vrgather(vtbl, vidx, vl);
|
|
vbool8_t m = __riscv_vmseq(v, vlut, vl);
|
|
#else
|
|
vbool8_t m1 = __riscv_vmseq(v, ':', vl);
|
|
vbool8_t m2 = __riscv_vmseq(v, '/', vl);
|
|
vbool8_t m3 = __riscv_vmseq(v, '?', vl);
|
|
vbool8_t m4 = __riscv_vmseq(v, '[', vl);
|
|
vbool8_t m5 = __riscv_vmseq(v, '\\', vl);
|
|
vbool8_t m = __riscv_vmor(
|
|
__riscv_vmor(__riscv_vmor(m1, m2, vl), __riscv_vmor(m3, m4, vl), vl),
|
|
m5, vl);
|
|
#endif
|
|
long idx = __riscv_vfirst(m, vl);
|
|
if (idx >= 0) return location + idx;
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
#else
|
|
// : / [ \\ ?
|
|
static constexpr std::array<uint8_t, 256> special_host_delimiters =
|
|
[]() consteval {
|
|
std::array<uint8_t, 256> result{};
|
|
for (int i : {':', '/', '[', '\\', '?'}) {
|
|
result[i] = 1;
|
|
}
|
|
return result;
|
|
}();
|
|
// credit: @the-moisrex recommended a table-based approach
|
|
ada_really_inline size_t find_next_host_delimiter_special(
|
|
std::string_view view, size_t location) noexcept {
|
|
auto const str = view.substr(location);
|
|
for (auto pos = str.begin(); pos != str.end(); ++pos) {
|
|
if (special_host_delimiters[(uint8_t)*pos]) {
|
|
return pos - str.begin() + location;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
#endif
|
|
|
|
// starting at index location, this finds the next location of a character
|
|
// :, /, ? or [. If none is found, view.size() is returned.
|
|
// For use within get_host_delimiter_location.
|
|
#if ADA_SSSE3
|
|
ada_really_inline size_t find_next_host_delimiter(std::string_view view,
|
|
size_t location) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (view.size() - location < 16) { // slow path
|
|
for (size_t i = location; i < view.size(); i++) {
|
|
if (view[i] == ':' || view[i] == '/' || view[i] == '?' ||
|
|
view[i] == '[') {
|
|
return i;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = location;
|
|
// Lookup tables for bit classification:
|
|
// ':' (0x3A): low[0xA]=0x01, high[0x3]=0x01 -> match
|
|
// '/' (0x2F): low[0xF]=0x02, high[0x2]=0x02 -> match
|
|
// '?' (0x3F): low[0xF]=0x01, high[0x3]=0x01 -> match
|
|
// '[' (0x5B): low[0xB]=0x04, high[0x5]=0x04 -> match
|
|
const __m128i low_mask =
|
|
_mm_setr_epi8(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x01, 0x04, 0x00, 0x00, 0x00, 0x03);
|
|
const __m128i high_mask =
|
|
_mm_setr_epi8(0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
|
const __m128i fmask = _mm_set1_epi8(0xf);
|
|
const __m128i zero = _mm_setzero_si128();
|
|
|
|
for (; i + 15 < view.size(); i += 16) {
|
|
__m128i word = _mm_loadu_si128((const __m128i*)(view.data() + i));
|
|
__m128i lowpart = _mm_shuffle_epi8(low_mask, _mm_and_si128(word, fmask));
|
|
__m128i highpart = _mm_shuffle_epi8(
|
|
high_mask, _mm_and_si128(_mm_srli_epi16(word, 4), fmask));
|
|
__m128i classify = _mm_and_si128(lowpart, highpart);
|
|
__m128i is_zero = _mm_cmpeq_epi8(classify, zero);
|
|
// _mm_movemask_epi8 returns a 16-bit mask in bits 0-15, with bits 16-31
|
|
// zero. After NOT (~), bits 16-31 become 1. We must mask to 16 bits to
|
|
// avoid false positives.
|
|
int mask = ~_mm_movemask_epi8(is_zero) & 0xFFFF;
|
|
if (mask != 0) {
|
|
return i + trailing_zeroes(static_cast<uint32_t>(mask));
|
|
}
|
|
}
|
|
|
|
if (i < view.size()) {
|
|
__m128i word =
|
|
_mm_loadu_si128((const __m128i*)(view.data() + view.length() - 16));
|
|
__m128i lowpart = _mm_shuffle_epi8(low_mask, _mm_and_si128(word, fmask));
|
|
__m128i highpart = _mm_shuffle_epi8(
|
|
high_mask, _mm_and_si128(_mm_srli_epi16(word, 4), fmask));
|
|
__m128i classify = _mm_and_si128(lowpart, highpart);
|
|
__m128i is_zero = _mm_cmpeq_epi8(classify, zero);
|
|
// _mm_movemask_epi8 returns a 16-bit mask in bits 0-15, with bits 16-31
|
|
// zero. After NOT (~), bits 16-31 become 1. We must mask to 16 bits to
|
|
// avoid false positives.
|
|
int mask = ~_mm_movemask_epi8(is_zero) & 0xFFFF;
|
|
if (mask != 0) {
|
|
return view.length() - 16 + trailing_zeroes(static_cast<uint32_t>(mask));
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
#elif ADA_NEON
|
|
ada_really_inline size_t find_next_host_delimiter(std::string_view view,
|
|
size_t location) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (view.size() - location < 16) { // slow path
|
|
for (size_t i = location; i < view.size(); i++) {
|
|
if (view[i] == ':' || view[i] == '/' || view[i] == '?' ||
|
|
view[i] == '[') {
|
|
return i;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
auto to_bitmask = [](uint8x16_t input) -> uint16_t {
|
|
uint8x16_t bit_mask =
|
|
ada_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x01,
|
|
0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
|
|
uint8x16_t minput = vandq_u8(input, bit_mask);
|
|
uint8x16_t tmp = vpaddq_u8(minput, minput);
|
|
tmp = vpaddq_u8(tmp, tmp);
|
|
tmp = vpaddq_u8(tmp, tmp);
|
|
return vgetq_lane_u16(vreinterpretq_u16_u8(tmp), 0);
|
|
};
|
|
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = location;
|
|
uint8x16_t low_mask =
|
|
ada_make_uint8x16_t(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x03);
|
|
uint8x16_t high_mask =
|
|
ada_make_uint8x16_t(0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
|
uint8x16_t fmask = vmovq_n_u8(0xf);
|
|
uint8x16_t zero{0};
|
|
for (; i + 15 < view.size(); i += 16) {
|
|
uint8x16_t word = vld1q_u8((const uint8_t*)view.data() + i);
|
|
uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask));
|
|
uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4));
|
|
uint8x16_t classify = vandq_u8(lowpart, highpart);
|
|
if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) {
|
|
uint8x16_t is_zero = vceqq_u8(classify, zero);
|
|
uint16_t is_non_zero = static_cast<uint16_t>(~to_bitmask(is_zero));
|
|
return i + trailing_zeroes(is_non_zero);
|
|
}
|
|
}
|
|
|
|
if (i < view.size()) {
|
|
uint8x16_t word =
|
|
vld1q_u8((const uint8_t*)view.data() + view.length() - 16);
|
|
uint8x16_t lowpart = vqtbl1q_u8(low_mask, vandq_u8(word, fmask));
|
|
uint8x16_t highpart = vqtbl1q_u8(high_mask, vshrq_n_u8(word, 4));
|
|
uint8x16_t classify = vandq_u8(lowpart, highpart);
|
|
if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) {
|
|
uint8x16_t is_zero = vceqq_u8(classify, zero);
|
|
uint16_t is_non_zero = static_cast<uint16_t>(~to_bitmask(is_zero));
|
|
return view.length() - 16 + trailing_zeroes(is_non_zero);
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
#elif ADA_SSE2
|
|
ada_really_inline size_t find_next_host_delimiter(std::string_view view,
|
|
size_t location) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (view.size() - location < 16) { // slow path
|
|
for (size_t i = location; i < view.size(); i++) {
|
|
if (view[i] == ':' || view[i] == '/' || view[i] == '?' ||
|
|
view[i] == '[') {
|
|
return i;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = location;
|
|
const __m128i mask1 = _mm_set1_epi8(':');
|
|
const __m128i mask2 = _mm_set1_epi8('/');
|
|
const __m128i mask4 = _mm_set1_epi8('?');
|
|
const __m128i mask5 = _mm_set1_epi8('[');
|
|
|
|
for (; i + 15 < view.size(); i += 16) {
|
|
__m128i word = _mm_loadu_si128((const __m128i*)(view.data() + i));
|
|
__m128i m1 = _mm_cmpeq_epi8(word, mask1);
|
|
__m128i m2 = _mm_cmpeq_epi8(word, mask2);
|
|
__m128i m4 = _mm_cmpeq_epi8(word, mask4);
|
|
__m128i m5 = _mm_cmpeq_epi8(word, mask5);
|
|
__m128i m = _mm_or_si128(_mm_or_si128(m1, m2), _mm_or_si128(m4, m5));
|
|
int mask = _mm_movemask_epi8(m);
|
|
if (mask != 0) {
|
|
return i + trailing_zeroes(mask);
|
|
}
|
|
}
|
|
if (i < view.size()) {
|
|
__m128i word =
|
|
_mm_loadu_si128((const __m128i*)(view.data() + view.length() - 16));
|
|
__m128i m1 = _mm_cmpeq_epi8(word, mask1);
|
|
__m128i m2 = _mm_cmpeq_epi8(word, mask2);
|
|
__m128i m4 = _mm_cmpeq_epi8(word, mask4);
|
|
__m128i m5 = _mm_cmpeq_epi8(word, mask5);
|
|
__m128i m = _mm_or_si128(_mm_or_si128(m1, m2), _mm_or_si128(m4, m5));
|
|
int mask = _mm_movemask_epi8(m);
|
|
if (mask != 0) {
|
|
return view.length() - 16 + trailing_zeroes(mask);
|
|
}
|
|
}
|
|
return size_t(view.length());
|
|
}
|
|
#elif ADA_LSX
|
|
ada_really_inline size_t find_next_host_delimiter(std::string_view view,
|
|
size_t location) noexcept {
|
|
// first check for short strings in which case we do it naively.
|
|
if (view.size() - location < 16) { // slow path
|
|
for (size_t i = location; i < view.size(); i++) {
|
|
if (view[i] == ':' || view[i] == '/' || view[i] == '?' ||
|
|
view[i] == '[') {
|
|
return i;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
// fast path for long strings (expected to be common)
|
|
size_t i = location;
|
|
const __m128i mask1 = __lsx_vrepli_b(':');
|
|
const __m128i mask2 = __lsx_vrepli_b('/');
|
|
const __m128i mask4 = __lsx_vrepli_b('?');
|
|
const __m128i mask5 = __lsx_vrepli_b('[');
|
|
|
|
for (; i + 15 < view.size(); i += 16) {
|
|
__m128i word = __lsx_vld((const __m128i*)(view.data() + i), 0);
|
|
__m128i m1 = __lsx_vseq_b(word, mask1);
|
|
__m128i m2 = __lsx_vseq_b(word, mask2);
|
|
__m128i m4 = __lsx_vseq_b(word, mask4);
|
|
__m128i m5 = __lsx_vseq_b(word, mask5);
|
|
__m128i m = __lsx_vor_v(__lsx_vor_v(m1, m2), __lsx_vor_v(m4, m5));
|
|
int mask = __lsx_vpickve2gr_hu(__lsx_vmsknz_b(m), 0);
|
|
if (mask != 0) {
|
|
return i + trailing_zeroes(mask);
|
|
}
|
|
}
|
|
if (i < view.size()) {
|
|
__m128i word =
|
|
__lsx_vld((const __m128i*)(view.data() + view.length() - 16), 0);
|
|
__m128i m1 = __lsx_vseq_b(word, mask1);
|
|
__m128i m2 = __lsx_vseq_b(word, mask2);
|
|
__m128i m4 = __lsx_vseq_b(word, mask4);
|
|
__m128i m5 = __lsx_vseq_b(word, mask5);
|
|
__m128i m = __lsx_vor_v(__lsx_vor_v(m1, m2), __lsx_vor_v(m4, m5));
|
|
int mask = __lsx_vpickve2gr_hu(__lsx_vmsknz_b(m), 0);
|
|
if (mask != 0) {
|
|
return view.length() - 16 + trailing_zeroes(mask);
|
|
}
|
|
}
|
|
return size_t(view.length());
|
|
}
|
|
#elif ADA_RVV
|
|
ada_really_inline size_t find_next_host_delimiter(std::string_view view,
|
|
size_t location) noexcept {
|
|
uint8_t* src = (uint8_t*)view.data() + location;
|
|
for (size_t vl, n = view.size() - location; n > 0;
|
|
n -= vl, src += vl, location += vl) {
|
|
vl = __riscv_vsetvl_e8m1(n);
|
|
vuint8m1_t v = __riscv_vle8_v_u8m1(src, vl);
|
|
vbool8_t m1 = __riscv_vmseq(v, ':', vl);
|
|
vbool8_t m2 = __riscv_vmseq(v, '/', vl);
|
|
vbool8_t m3 = __riscv_vmseq(v, '?', vl);
|
|
vbool8_t m4 = __riscv_vmseq(v, '[', vl);
|
|
vbool8_t m =
|
|
__riscv_vmor(__riscv_vmor(m1, m2, vl), __riscv_vmor(m3, m4, vl), vl);
|
|
long idx = __riscv_vfirst(m, vl);
|
|
if (idx >= 0) return location + idx;
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
#else
|
|
// : / [ ?
|
|
static constexpr std::array<uint8_t, 256> host_delimiters = []() consteval {
|
|
std::array<uint8_t, 256> result{};
|
|
for (int i : {':', '/', '?', '['}) {
|
|
result[i] = 1;
|
|
}
|
|
return result;
|
|
}();
|
|
// credit: @the-moisrex recommended a table-based approach
|
|
ada_really_inline size_t find_next_host_delimiter(std::string_view view,
|
|
size_t location) noexcept {
|
|
auto const str = view.substr(location);
|
|
for (auto pos = str.begin(); pos != str.end(); ++pos) {
|
|
if (host_delimiters[(uint8_t)*pos]) {
|
|
return pos - str.begin() + location;
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
#endif
|
|
|
|
ada_really_inline std::pair<size_t, bool> get_host_delimiter_location(
|
|
const bool is_special, std::string_view& view) noexcept {
|
|
/**
|
|
* The spec at https://url.spec.whatwg.org/#hostname-state expects us to
|
|
* compute a variable called insideBrackets but this variable is only used
|
|
* once, to check whether a ':' character was found outside brackets. Exact
|
|
* text: "Otherwise, if c is U+003A (:) and insideBrackets is false, then:".
|
|
* It is conceptually simpler and arguably more efficient to just return a
|
|
* Boolean indicating whether ':' was found outside brackets.
|
|
*/
|
|
const size_t view_size = view.size();
|
|
size_t location = 0;
|
|
bool found_colon = false;
|
|
/**
|
|
* Performance analysis:
|
|
*
|
|
* We are basically seeking the end of the hostname which can be indicated
|
|
* by the end of the view, or by one of the characters ':', '/', '?', '\\'
|
|
* (where '\\' is only applicable for special URLs). However, these must
|
|
* appear outside a bracket range. E.g., if you have [something?]fd: then the
|
|
* '?' does not count.
|
|
*
|
|
* So we can skip ahead to the next delimiter, as long as we include '[' in
|
|
* the set of delimiters, and that we handle it first.
|
|
*
|
|
* So the trick is to have a fast function that locates the next delimiter.
|
|
* Unless we find '[', then it only needs to be called once! Ideally, such a
|
|
* function would be provided by the C++ standard library, but it seems that
|
|
* find_first_of is not very fast, so we are forced to roll our own.
|
|
*
|
|
* We do not break into two loops for speed, but for clarity.
|
|
*/
|
|
if (is_special) {
|
|
// We move to the next delimiter.
|
|
location = find_next_host_delimiter_special(view, location);
|
|
// Unless we find '[' then we are going only going to have to call
|
|
// find_next_host_delimiter_special once.
|
|
for (; location < view_size;
|
|
location = find_next_host_delimiter_special(view, location)) {
|
|
if (view[location] == '[') {
|
|
location = view.find(']', location);
|
|
if (location == std::string_view::npos) {
|
|
// performance: view.find might get translated to a memchr, which
|
|
// has no notion of std::string_view::npos, so the code does not
|
|
// reflect the assembly.
|
|
location = view_size;
|
|
break;
|
|
}
|
|
} else {
|
|
found_colon = view[location] == ':';
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
// We move to the next delimiter.
|
|
location = find_next_host_delimiter(view, location);
|
|
// Unless we find '[' then we are going only going to have to call
|
|
// find_next_host_delimiter_special once.
|
|
for (; location < view_size;
|
|
location = find_next_host_delimiter(view, location)) {
|
|
if (view[location] == '[') {
|
|
location = view.find(']', location);
|
|
if (location == std::string_view::npos) {
|
|
// performance: view.find might get translated to a memchr, which
|
|
// has no notion of std::string_view::npos, so the code does not
|
|
// reflect the assembly.
|
|
location = view_size;
|
|
break;
|
|
}
|
|
} else {
|
|
found_colon = view[location] == ':';
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// performance: remove_suffix may translate into a single instruction.
|
|
view.remove_suffix(view_size - location);
|
|
return {location, found_colon};
|
|
}
|
|
|
|
void trim_c0_whitespace(std::string_view& input) noexcept {
|
|
while (!input.empty() &&
|
|
ada::unicode::is_c0_control_or_space(input.front())) {
|
|
input.remove_prefix(1);
|
|
}
|
|
while (!input.empty() && ada::unicode::is_c0_control_or_space(input.back())) {
|
|
input.remove_suffix(1);
|
|
}
|
|
}
|
|
|
|
ada_really_inline void parse_prepared_path(std::string_view input,
|
|
ada::scheme::type type,
|
|
std::string& path) {
|
|
ada_log("parse_prepared_path ", input);
|
|
uint8_t accumulator = checkers::path_signature(input);
|
|
// Let us first detect a trivial case.
|
|
// If it is special, we check that we have no dot, no %, no \ and no
|
|
// character needing percent encoding. Otherwise, we check that we have no %,
|
|
// no dot, and no character needing percent encoding.
|
|
constexpr uint8_t need_encoding = 1;
|
|
constexpr uint8_t backslash_char = 2;
|
|
constexpr uint8_t dot_char = 4;
|
|
constexpr uint8_t percent_char = 8;
|
|
bool special = type != ada::scheme::NOT_SPECIAL;
|
|
bool may_need_slow_file_handling = (type == ada::scheme::type::FILE &&
|
|
checkers::is_windows_drive_letter(input));
|
|
bool trivial_path =
|
|
(special ? (accumulator == 0)
|
|
: ((accumulator & (need_encoding | dot_char | percent_char)) ==
|
|
0)) &&
|
|
(!may_need_slow_file_handling);
|
|
if (accumulator == dot_char && !may_need_slow_file_handling) {
|
|
// '4' means that we have at least one dot, but nothing that requires
|
|
// percent encoding or decoding. The only part that is not trivial is
|
|
// that we may have single dots and double dots path segments.
|
|
// If we have such segments, then we either have a path that begins
|
|
// with '.' (easy to check), or we have the sequence './'.
|
|
// Note: input cannot be empty, it must at least contain one character ('.')
|
|
// Note: we know that '\' is not present.
|
|
if (input[0] != '.') {
|
|
size_t slashdot = 0;
|
|
bool dot_is_file = true;
|
|
for (;;) {
|
|
slashdot = input.find("/.", slashdot);
|
|
if (slashdot == std::string_view::npos) { // common case
|
|
break;
|
|
} else { // uncommon
|
|
// only three cases matter: /./, /.. or a final /
|
|
slashdot += 2;
|
|
dot_is_file &= !(slashdot == input.size() || input[slashdot] == '.' ||
|
|
input[slashdot] == '/');
|
|
}
|
|
}
|
|
trivial_path = dot_is_file;
|
|
}
|
|
}
|
|
if (trivial_path) {
|
|
ada_log("parse_path trivial");
|
|
path += '/';
|
|
path += input;
|
|
return;
|
|
}
|
|
// We are going to need to look a bit at the path, but let us see if we can
|
|
// ignore percent encoding *and* backslashes *and* percent characters.
|
|
// Except for the trivial case, this is likely to capture 99% of paths out
|
|
// there.
|
|
bool fast_path =
|
|
(special &&
|
|
(accumulator & (need_encoding | backslash_char | percent_char)) == 0) &&
|
|
(type != ada::scheme::type::FILE);
|
|
if (fast_path) {
|
|
ada_log("parse_prepared_path fast");
|
|
// Here we don't need to worry about \ or percent encoding.
|
|
// We also do not have a file protocol. We might have dots, however,
|
|
// but dots must as appear as '.', and they cannot be encoded because
|
|
// the symbol '%' is not present.
|
|
size_t previous_location = 0; // We start at 0.
|
|
do {
|
|
size_t new_location = input.find('/', previous_location);
|
|
// std::string_view path_view = input;
|
|
// We process the last segment separately:
|
|
if (new_location == std::string_view::npos) {
|
|
std::string_view path_view = input.substr(previous_location);
|
|
if (path_view == "..") { // The path ends with ..
|
|
// e.g., if you receive ".." with an empty path, you go to "/".
|
|
if (path.empty()) {
|
|
path = '/';
|
|
return;
|
|
}
|
|
// Fast case where we have nothing to do:
|
|
if (path.back() == '/') {
|
|
return;
|
|
}
|
|
// If you have the path "/joe/myfriend",
|
|
// then you delete 'myfriend'.
|
|
path.resize(path.rfind('/') + 1);
|
|
return;
|
|
}
|
|
path += '/';
|
|
if (path_view != ".") {
|
|
path.append(path_view);
|
|
}
|
|
return;
|
|
} else {
|
|
// This is a non-final segment.
|
|
std::string_view path_view =
|
|
input.substr(previous_location, new_location - previous_location);
|
|
previous_location = new_location + 1;
|
|
if (path_view == "..") {
|
|
size_t last_delimiter = path.rfind('/');
|
|
if (last_delimiter != std::string::npos) {
|
|
path.erase(last_delimiter);
|
|
}
|
|
} else if (path_view != ".") {
|
|
path += '/';
|
|
path.append(path_view);
|
|
}
|
|
}
|
|
} while (true);
|
|
} else {
|
|
ada_log("parse_path slow");
|
|
// we have reached the general case
|
|
bool needs_percent_encoding = (accumulator & 1);
|
|
std::string path_buffer_tmp;
|
|
do {
|
|
size_t location = (special && (accumulator & 2))
|
|
? input.find_first_of("/\\")
|
|
: input.find('/');
|
|
std::string_view path_view = input;
|
|
if (location != std::string_view::npos) {
|
|
path_view.remove_suffix(path_view.size() - location);
|
|
input.remove_prefix(location + 1);
|
|
}
|
|
// path_buffer is either path_view or it might point at a percent encoded
|
|
// temporary file.
|
|
std::string_view path_buffer =
|
|
(needs_percent_encoding &&
|
|
ada::unicode::percent_encode<false>(
|
|
path_view, character_sets::PATH_PERCENT_ENCODE, path_buffer_tmp))
|
|
? path_buffer_tmp
|
|
: path_view;
|
|
if (unicode::is_double_dot_path_segment(path_buffer)) {
|
|
helpers::shorten_path(path, type);
|
|
if (location == std::string_view::npos) {
|
|
path += '/';
|
|
}
|
|
} else if (unicode::is_single_dot_path_segment(path_buffer) &&
|
|
(location == std::string_view::npos)) {
|
|
path += '/';
|
|
}
|
|
// Otherwise, if path_buffer is not a single-dot path segment, then:
|
|
else if (!unicode::is_single_dot_path_segment(path_buffer)) {
|
|
// If url's scheme is "file", url's path is empty, and path_buffer is a
|
|
// Windows drive letter, then replace the second code point in
|
|
// path_buffer with U+003A (:).
|
|
if (type == ada::scheme::type::FILE && path.empty() &&
|
|
checkers::is_windows_drive_letter(path_buffer)) {
|
|
path += '/';
|
|
path += path_buffer[0];
|
|
path += ':';
|
|
path_buffer.remove_prefix(2);
|
|
path.append(path_buffer);
|
|
} else {
|
|
// Append path_buffer to url's path.
|
|
path += '/';
|
|
path.append(path_buffer);
|
|
}
|
|
}
|
|
if (location == std::string_view::npos) {
|
|
return;
|
|
}
|
|
} while (true);
|
|
}
|
|
}
|
|
|
|
bool overlaps(std::string_view input1, const std::string& input2) noexcept {
|
|
ada_log("helpers::overlaps check if string_view '", input1, "' [",
|
|
input1.size(), " bytes] is part of string '", input2, "' [",
|
|
input2.size(), " bytes]");
|
|
return !input1.empty() && !input2.empty() && input1.data() >= input2.data() &&
|
|
input1.data() < input2.data() + input2.size();
|
|
}
|
|
|
|
template <class url_type>
|
|
ada_really_inline void strip_trailing_spaces_from_opaque_path(url_type& url) {
|
|
ada_log("helpers::strip_trailing_spaces_from_opaque_path");
|
|
if (!url.has_opaque_path) return;
|
|
if (url.has_hash()) return;
|
|
if (url.has_search()) return;
|
|
|
|
auto path = std::string(url.get_pathname());
|
|
while (!path.empty() && path.back() == ' ') {
|
|
path.resize(path.size() - 1);
|
|
}
|
|
url.update_base_pathname(path);
|
|
}
|
|
|
|
// @ / \\ ?
|
|
static constexpr std::array<uint8_t, 256> authority_delimiter_special =
|
|
[]() consteval {
|
|
std::array<uint8_t, 256> result{};
|
|
for (uint8_t i : {'@', '/', '\\', '?'}) {
|
|
result[i] = 1;
|
|
}
|
|
return result;
|
|
}();
|
|
// credit: @the-moisrex recommended a table-based approach
|
|
ada_really_inline size_t
|
|
find_authority_delimiter_special(std::string_view view) noexcept {
|
|
// performance note: we might be able to gain further performance
|
|
// with SIMD intrinsics.
|
|
for (auto pos = view.begin(); pos != view.end(); ++pos) {
|
|
if (authority_delimiter_special[(uint8_t)*pos]) {
|
|
return pos - view.begin();
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
|
|
// @ / ?
|
|
static constexpr std::array<uint8_t, 256> authority_delimiter = []() consteval {
|
|
std::array<uint8_t, 256> result{};
|
|
for (uint8_t i : {'@', '/', '?'}) {
|
|
result[i] = 1;
|
|
}
|
|
return result;
|
|
}();
|
|
// credit: @the-moisrex recommended a table-based approach
|
|
ada_really_inline size_t
|
|
find_authority_delimiter(std::string_view view) noexcept {
|
|
// performance note: we might be able to gain further performance
|
|
// with SIMD instrinsics.
|
|
for (auto pos = view.begin(); pos != view.end(); ++pos) {
|
|
if (authority_delimiter[(uint8_t)*pos]) {
|
|
return pos - view.begin();
|
|
}
|
|
}
|
|
return size_t(view.size());
|
|
}
|
|
|
|
} // namespace ada::helpers
|
|
|
|
namespace ada {
|
|
ada_warn_unused std::string to_string(ada::state state) {
|
|
return ada::helpers::get_state(state);
|
|
}
|
|
#undef ada_make_uint8x16_t
|
|
} // namespace ada
|
|
/* end file src/helpers.cpp */
|
|
/* begin file src/url.cpp */
|
|
/* begin file include/ada/url_ip-inl.h */
|
|
/**
|
|
* @file url_ip-inl.h
|
|
* @brief Shared IPv4/IPv6 parsing helpers used by url and url_aggregator.
|
|
*
|
|
* Not part of the public API. Defined inline so the single-TU amalgamation
|
|
* (ada.cpp) can include them from multiple translation-unit sources once.
|
|
*/
|
|
#ifndef ADA_URL_IP_INL_H
|
|
#define ADA_URL_IP_INL_H
|
|
|
|
|
|
#include <array>
|
|
#include <cstdint>
|
|
|
|
#if defined(ADA_AVX512)
|
|
#include <immintrin.h>
|
|
#endif
|
|
|
|
namespace ada::detail {
|
|
|
|
// 256-entry: 0xff = not hex, else nibble value.
|
|
inline constexpr std::array<uint8_t, 256> make_hex_nibble_table() noexcept {
|
|
std::array<uint8_t, 256> t{};
|
|
for (size_t i = 0; i < 256; ++i) {
|
|
t[i] = 0xff;
|
|
}
|
|
for (size_t d = 0; d < 10; ++d) {
|
|
t[size_t{'0'} + d] = static_cast<uint8_t>(d);
|
|
}
|
|
for (size_t d = 0; d < 6; ++d) {
|
|
t[size_t{'a'} + d] = static_cast<uint8_t>(10 + d);
|
|
t[size_t{'A'} + d] = static_cast<uint8_t>(10 + d);
|
|
}
|
|
return t;
|
|
}
|
|
|
|
inline constexpr auto hex_nibble = make_hex_nibble_table();
|
|
|
|
inline bool parse_ipv4_number(const char*& p, const char* end, uint64_t& value,
|
|
bool& is_pure_decimal) noexcept {
|
|
is_pure_decimal = false;
|
|
if (p >= end) [[unlikely]] {
|
|
return false;
|
|
}
|
|
if (end - p >= 2 && p[0] == '0' && ((p[1] | 0x20) == 'x')) {
|
|
p += 2;
|
|
if (p == end || *p == '.') {
|
|
value = 0;
|
|
return true;
|
|
}
|
|
uint64_t v = 0;
|
|
int digits = 0;
|
|
while (p < end && *p != '.') {
|
|
const uint8_t nib = hex_nibble[static_cast<unsigned char>(*p)];
|
|
if (nib == 0xff) [[unlikely]] {
|
|
return false;
|
|
}
|
|
if (v > (0xFFFFFFFFULL >> 4)) [[unlikely]] {
|
|
return false;
|
|
}
|
|
v = (v << 4) | nib;
|
|
++p;
|
|
++digits;
|
|
}
|
|
if (digits == 0) [[unlikely]] {
|
|
return false;
|
|
}
|
|
value = v;
|
|
return true;
|
|
}
|
|
if (end - p >= 2 && p[0] == '0' && p[1] >= '0' && p[1] <= '9') {
|
|
++p;
|
|
uint64_t v = 0;
|
|
while (p < end && *p != '.') {
|
|
const char c = *p;
|
|
if (c < '0' || c > '7') [[unlikely]] {
|
|
return false;
|
|
}
|
|
if (v > (0xFFFFFFFFULL >> 3)) [[unlikely]] {
|
|
return false;
|
|
}
|
|
v = (v << 3) | static_cast<uint64_t>(c - '0');
|
|
++p;
|
|
}
|
|
value = v;
|
|
return true;
|
|
}
|
|
if (*p < '0' || *p > '9') [[unlikely]] {
|
|
return false;
|
|
}
|
|
is_pure_decimal = true;
|
|
uint64_t v = static_cast<uint64_t>(*p - '0');
|
|
++p;
|
|
while (p < end && *p != '.') {
|
|
const char c = *p;
|
|
if (c < '0' || c > '9') [[unlikely]] {
|
|
return false;
|
|
}
|
|
if (v > 429496729ULL) [[unlikely]] {
|
|
return false;
|
|
}
|
|
v = v * 10u + static_cast<uint64_t>(c - '0');
|
|
if (v > 0xFFFFFFFFULL) [[unlikely]] {
|
|
return false;
|
|
}
|
|
++p;
|
|
}
|
|
value = v;
|
|
return true;
|
|
}
|
|
|
|
// Parse up to 4 hex digits. Returns digit count (0 if none).
|
|
inline int parse_hex_piece(const char*& pointer, const char* end,
|
|
uint16_t& value) noexcept {
|
|
if (pointer == end) {
|
|
return 0;
|
|
}
|
|
const uint8_t n0 = hex_nibble[static_cast<unsigned char>(*pointer)];
|
|
if (n0 == 0xff) {
|
|
return 0;
|
|
}
|
|
uint32_t v = n0;
|
|
++pointer;
|
|
int length = 1;
|
|
if (pointer != end) {
|
|
const uint8_t n1 = hex_nibble[static_cast<unsigned char>(*pointer)];
|
|
if (n1 != 0xff) {
|
|
v = (v << 4) | n1;
|
|
++pointer;
|
|
++length;
|
|
if (pointer != end) {
|
|
const uint8_t n2 = hex_nibble[static_cast<unsigned char>(*pointer)];
|
|
if (n2 != 0xff) {
|
|
v = (v << 4) | n2;
|
|
++pointer;
|
|
++length;
|
|
if (pointer != end) {
|
|
const uint8_t n3 = hex_nibble[static_cast<unsigned char>(*pointer)];
|
|
if (n3 != 0xff) {
|
|
v = (v << 4) | n3;
|
|
++pointer;
|
|
++length;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
value = static_cast<uint16_t>(v);
|
|
return length;
|
|
}
|
|
|
|
#if defined(ADA_AVX512)
|
|
// Classify an IPv6 host (no brackets) with one masked 512-bit load.
|
|
// Returns false if the colon/dot shape is impossible (e.g. two "::", >8
|
|
// colons, full form without 7 colons). Used as a cheap prefilter before the
|
|
// full WHATWG piece parser.
|
|
ada_really_inline bool ipv6_structure_plausible(const char* data,
|
|
size_t len) noexcept {
|
|
if (len < 2 || len > 45) {
|
|
return false;
|
|
}
|
|
const __mmask64 live = static_cast<__mmask64>((1ULL << len) - 1ULL);
|
|
const __m512i input =
|
|
_mm512_maskz_loadu_epi8(live, reinterpret_cast<const void*>(data));
|
|
const __mmask64 is_colon =
|
|
_mm512_mask_cmpeq_epi8_mask(live, input, _mm512_set1_epi8(':'));
|
|
const __mmask64 is_dot =
|
|
_mm512_mask_cmpeq_epi8_mask(live, input, _mm512_set1_epi8('.'));
|
|
const int colons =
|
|
static_cast<int>(_mm_popcnt_u64(static_cast<uint64_t>(is_colon)));
|
|
if (colons > 8) {
|
|
return false;
|
|
}
|
|
const uint64_t doubles =
|
|
static_cast<uint64_t>(is_colon) & (static_cast<uint64_t>(is_colon) << 1);
|
|
if (doubles != 0 && (doubles & (doubles - 1)) != 0) {
|
|
return false; // more than one "::" (or ":::...")
|
|
}
|
|
const bool has_double = doubles != 0;
|
|
const bool has_dot = is_dot != 0;
|
|
if (!has_double && !has_dot && colons != 7) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
#endif // ADA_AVX512
|
|
|
|
} // namespace ada::detail
|
|
|
|
#endif // ADA_URL_IP_INL_H
|
|
/* end file include/ada/url_ip-inl.h */
|
|
|
|
#include <algorithm>
|
|
#include <array>
|
|
#include <cstdint>
|
|
#include <iterator>
|
|
#include <numeric>
|
|
#include <ranges>
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
namespace ada {
|
|
|
|
bool url::parse_opaque_host(std::string_view input) {
|
|
ada_log("parse_opaque_host ", input, " [", input.size(), " bytes]");
|
|
if (std::ranges::any_of(input, ada::unicode::is_forbidden_host_code_point)) {
|
|
return is_valid = false;
|
|
}
|
|
|
|
// Return the result of running UTF-8 percent-encode on input using the C0
|
|
// control percent-encode set.
|
|
host = ada::unicode::percent_encode(
|
|
input, ada::character_sets::C0_CONTROL_PERCENT_ENCODE);
|
|
return true;
|
|
}
|
|
|
|
bool url::parse_ipv4(std::string_view input) {
|
|
ada_log("parse_ipv4 ", input, " [", input.size(), " bytes]");
|
|
if (input.empty()) {
|
|
return is_valid = false;
|
|
}
|
|
std::string_view original_input = input;
|
|
if (original_input.back() == '.') {
|
|
original_input.remove_suffix(1);
|
|
}
|
|
if (input.back() == '.') {
|
|
input.remove_suffix(1);
|
|
if (input.empty()) {
|
|
return is_valid = false;
|
|
}
|
|
}
|
|
|
|
const uint64_t fast = checkers::try_parse_ipv4_fast(input);
|
|
if (fast < checkers::ipv4_fast_fail) [[likely]] {
|
|
host = original_input;
|
|
host_type = IPV4;
|
|
return true;
|
|
}
|
|
|
|
const char* p = input.data();
|
|
const char* end = p + input.size();
|
|
uint64_t ipv4 = 0;
|
|
int digit_count = 0;
|
|
int pure_decimal_count = 0;
|
|
|
|
for (; digit_count < 4 && p < end; ++digit_count) {
|
|
uint64_t segment = 0;
|
|
bool pure = false;
|
|
if (!detail::parse_ipv4_number(p, end, segment, pure)) {
|
|
return is_valid = false;
|
|
}
|
|
if (pure) {
|
|
++pure_decimal_count;
|
|
}
|
|
if (p >= end) {
|
|
const unsigned shift = static_cast<unsigned>(32 - digit_count * 8);
|
|
if (segment >= (uint64_t{1} << shift)) {
|
|
return is_valid = false;
|
|
}
|
|
ipv4 = (ipv4 << shift) | segment;
|
|
host = (pure_decimal_count == 4) ? std::string(original_input)
|
|
: ada::serializers::ipv4(ipv4);
|
|
host_type = IPV4;
|
|
return true;
|
|
}
|
|
if (segment > 255 || *p != '.') {
|
|
return is_valid = false;
|
|
}
|
|
ipv4 = (ipv4 << 8) | segment;
|
|
++p;
|
|
}
|
|
if (digit_count != 4 || p != end) {
|
|
return is_valid = false;
|
|
}
|
|
host = (pure_decimal_count == 4) ? std::string(original_input)
|
|
: ada::serializers::ipv4(ipv4);
|
|
host_type = IPV4;
|
|
return true;
|
|
}
|
|
|
|
bool url::parse_ipv6(std::string_view input) {
|
|
ada_log("parse_ipv6 ", input, " [", input.size(), " bytes]");
|
|
if (input.empty() || input.size() > 45) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
#if defined(ADA_AVX512)
|
|
// One masked load classifies colon/dot shape; rejects impossible inputs
|
|
// before the piece parser (free on AVX-512BW+VL builds).
|
|
if (!detail::ipv6_structure_plausible(input.data(), input.size()))
|
|
[[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
#endif
|
|
|
|
std::array<uint16_t, 8> address{};
|
|
const char* pointer = input.data();
|
|
const char* const end = pointer + input.size();
|
|
int piece_index = 0;
|
|
int compress = -1;
|
|
|
|
if (*pointer == ':') {
|
|
if (input.size() == 1 || pointer[1] != ':') [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
pointer += 2;
|
|
compress = ++piece_index;
|
|
}
|
|
|
|
while (pointer != end) {
|
|
if (piece_index == 8) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
if (*pointer == ':') {
|
|
if (compress != -1) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
++pointer;
|
|
compress = ++piece_index;
|
|
continue;
|
|
}
|
|
|
|
uint16_t value = 0;
|
|
const int length = detail::parse_hex_piece(pointer, end, value);
|
|
|
|
if (pointer != end && *pointer == '.') {
|
|
if (length == 0) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
pointer -= length;
|
|
if (piece_index > 6) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
|
|
int numbers_seen = 0;
|
|
while (pointer != end) {
|
|
int ipv4_piece = -1;
|
|
if (numbers_seen > 0) {
|
|
if (*pointer == '.' && numbers_seen < 4) {
|
|
++pointer;
|
|
} else {
|
|
return is_valid = false;
|
|
}
|
|
}
|
|
if (pointer == end || *pointer < '0' || *pointer > '9') [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
ipv4_piece = *pointer - '0';
|
|
++pointer;
|
|
if (pointer != end && *pointer >= '0' && *pointer <= '9') {
|
|
if (ipv4_piece == 0) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
ipv4_piece = ipv4_piece * 10 + (*pointer - '0');
|
|
++pointer;
|
|
if (pointer != end && *pointer >= '0' && *pointer <= '9') {
|
|
ipv4_piece = ipv4_piece * 10 + (*pointer - '0');
|
|
++pointer;
|
|
if (ipv4_piece > 255) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
}
|
|
}
|
|
address[static_cast<size_t>(piece_index)] = static_cast<uint16_t>(
|
|
address[static_cast<size_t>(piece_index)] * 0x100 +
|
|
static_cast<uint16_t>(ipv4_piece));
|
|
++numbers_seen;
|
|
if (numbers_seen == 2 || numbers_seen == 4) {
|
|
++piece_index;
|
|
}
|
|
}
|
|
if (numbers_seen != 4) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (length == 0) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
|
|
if (pointer != end && *pointer == ':') {
|
|
++pointer;
|
|
if (pointer == end) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
} else if (pointer != end) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
|
|
address[static_cast<size_t>(piece_index)] = value;
|
|
++piece_index;
|
|
}
|
|
|
|
if (compress != -1) {
|
|
const int right = piece_index - compress;
|
|
if (right > 0) {
|
|
const size_t dest = static_cast<size_t>(8 - right);
|
|
const size_t src = static_cast<size_t>(compress);
|
|
if (dest != src) {
|
|
for (size_t i = static_cast<size_t>(right); i-- > 0;) {
|
|
address[dest + i] = address[src + i];
|
|
address[src + i] = 0;
|
|
}
|
|
}
|
|
}
|
|
} else if (piece_index != 8) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
|
|
host = ada::serializers::ipv6(address);
|
|
ada_log("parse_ipv6 ", *host);
|
|
host_type = IPV6;
|
|
return true;
|
|
}
|
|
|
|
template <bool has_state_override>
|
|
ada_really_inline bool url::parse_scheme(const std::string_view input) {
|
|
auto parsed_type = ada::scheme::get_scheme_type(input);
|
|
bool is_input_special = (parsed_type != ada::scheme::NOT_SPECIAL);
|
|
/**
|
|
* In the common case, we will immediately recognize a special scheme (e.g.,
|
|
*http, https), in which case, we can go really fast.
|
|
**/
|
|
if (is_input_special) { // fast path!!!
|
|
if constexpr (has_state_override) {
|
|
// If url's scheme is not a special scheme and buffer is a special scheme,
|
|
// then return.
|
|
if (is_special() != is_input_special) {
|
|
return false;
|
|
}
|
|
|
|
// If url includes credentials or has a non-null port, and buffer is
|
|
// "file", then return.
|
|
if ((has_credentials() || port.has_value()) &&
|
|
parsed_type == ada::scheme::type::FILE) {
|
|
return false;
|
|
}
|
|
|
|
// If url's scheme is "file" and its host is an empty host, then return.
|
|
// An empty host is the empty string.
|
|
if (type == ada::scheme::type::FILE && host.has_value() &&
|
|
host->empty()) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
type = parsed_type;
|
|
|
|
if constexpr (has_state_override) {
|
|
// This is uncommon.
|
|
uint16_t urls_scheme_port = get_special_port();
|
|
|
|
if (urls_scheme_port) {
|
|
// If url's port is url's scheme's default port, then set url's port to
|
|
// null.
|
|
if (port.has_value() && *port == urls_scheme_port) {
|
|
port = std::nullopt;
|
|
}
|
|
}
|
|
}
|
|
} else { // slow path
|
|
std::string _buffer(input);
|
|
// Next function is only valid if the input is ASCII and returns false
|
|
// otherwise, but it seems that we always have ascii content so we do not
|
|
// need to check the return value.
|
|
// bool is_ascii =
|
|
unicode::to_lower_ascii(_buffer.data(), _buffer.size());
|
|
|
|
if constexpr (has_state_override) {
|
|
// The state-override validation errors below ("return" in the WHATWG URL
|
|
// parser) leave the URL unchanged. The setter contract is
|
|
// "true on success, false if the scheme is invalid" -- the fast path
|
|
// above already returns false here, so the slow path must agree.
|
|
|
|
// If url's scheme is a special scheme and buffer is not a special scheme,
|
|
// then return. If url's scheme is not a special scheme and buffer is a
|
|
// special scheme, then return.
|
|
if (is_special() != ada::scheme::is_special(_buffer)) {
|
|
return false;
|
|
}
|
|
|
|
// If url includes credentials or has a non-null port, and buffer is
|
|
// "file", then return.
|
|
if ((has_credentials() || port.has_value()) && _buffer == "file") {
|
|
return false;
|
|
}
|
|
|
|
// If url's scheme is "file" and its host is an empty host, then return.
|
|
// An empty host is the empty string.
|
|
if (type == ada::scheme::type::FILE && host.has_value() &&
|
|
host->empty()) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
set_scheme(std::move(_buffer));
|
|
|
|
if constexpr (has_state_override) {
|
|
// This is uncommon.
|
|
uint16_t urls_scheme_port = get_special_port();
|
|
|
|
if (urls_scheme_port) {
|
|
// If url's port is url's scheme's default port, then set url's port to
|
|
// null.
|
|
if (port.has_value() && *port == urls_scheme_port) {
|
|
port = std::nullopt;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
ada_really_inline bool url::parse_host(std::string_view input) {
|
|
ada_log("parse_host ", input, " [", input.size(), " bytes]");
|
|
if (input.empty()) {
|
|
return is_valid = false;
|
|
} // technically unnecessary.
|
|
// If input starts with U+005B ([), then:
|
|
if (input[0] == '[') {
|
|
// If input does not end with U+005D (]), validation error, return failure.
|
|
if (input.back() != ']') {
|
|
return is_valid = false;
|
|
}
|
|
ada_log("parse_host ipv6");
|
|
|
|
// Return the result of IPv6 parsing input with its leading U+005B ([) and
|
|
// trailing U+005D (]) removed.
|
|
input.remove_prefix(1);
|
|
input.remove_suffix(1);
|
|
return parse_ipv6(input);
|
|
}
|
|
|
|
// If isNotSpecial is true, then return the result of opaque-host parsing
|
|
// input.
|
|
if (!is_special()) {
|
|
return parse_opaque_host(input);
|
|
}
|
|
|
|
// Fast path: try to parse as pure decimal IPv4(a.b.c.d) first.
|
|
const uint64_t fast_result = checkers::try_parse_ipv4_fast(input);
|
|
if (fast_result < checkers::ipv4_fast_fail) {
|
|
// Fast path succeeded - input is pure decimal IPv4
|
|
if (!input.empty() && input.back() == '.') {
|
|
host = input.substr(0, input.size() - 1);
|
|
} else {
|
|
host = input;
|
|
}
|
|
host_type = IPV4;
|
|
is_valid = true;
|
|
ada_log("parse_host fast path decimal ipv4");
|
|
return true;
|
|
}
|
|
// Let domain be the result of running UTF-8 decode without BOM on the
|
|
// percent-decoding of input. Let asciiDomain be the result of running domain
|
|
// to ASCII with domain and false. The most common case is an ASCII input, in
|
|
// which case we do not need to call the expensive 'to_ascii' if a few
|
|
// conditions are met: no '%' and no 'xn-' subsequence.
|
|
std::string buffer = std::string(input);
|
|
// This next function checks that the result is ascii, but we are going to
|
|
// to check anyhow with is_forbidden.
|
|
// bool is_ascii =
|
|
unicode::to_lower_ascii(buffer.data(), buffer.size());
|
|
bool is_forbidden = unicode::contains_forbidden_domain_code_point(
|
|
buffer.data(), buffer.size());
|
|
static constexpr std::string_view xn_dash{"xn-", 3};
|
|
if (is_forbidden == 0 && buffer.find(xn_dash) == std::string_view::npos) {
|
|
// fast path
|
|
host = std::move(buffer);
|
|
|
|
// Check for other IPv4 formats (hex, octal, etc.)
|
|
if (checkers::is_ipv4(host.value())) {
|
|
ada_log("parse_host fast path ipv4");
|
|
return parse_ipv4(host.value());
|
|
}
|
|
ada_log("parse_host fast path ", *host);
|
|
is_valid = true;
|
|
return true;
|
|
}
|
|
ada_log("parse_host calling to_ascii");
|
|
is_valid = ada::unicode::to_ascii(host, input, input.find('%'));
|
|
if (!is_valid || !host.has_value()) {
|
|
ada_log("parse_host to_ascii returns false");
|
|
return is_valid = false;
|
|
}
|
|
ada_log("parse_host to_ascii succeeded ", *host, " [", host->size(),
|
|
" bytes]");
|
|
|
|
if (std::any_of(host->begin(), host->end(),
|
|
ada::unicode::is_forbidden_domain_code_point)) {
|
|
host = std::nullopt;
|
|
return is_valid = false;
|
|
}
|
|
|
|
// If asciiDomain ends in a number, then return the result of IPv4 parsing
|
|
// asciiDomain.
|
|
if (checkers::is_ipv4(*host)) {
|
|
ada_log("parse_host got ipv4 ", *host);
|
|
return parse_ipv4(*host);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
ada_really_inline void url::parse_path(std::string_view input) {
|
|
ada_log("parse_path ", input);
|
|
std::string tmp_buffer;
|
|
std::string_view internal_input;
|
|
if (unicode::has_tabs_or_newline(input)) {
|
|
tmp_buffer = input;
|
|
// Optimization opportunity: Instead of copying and then pruning, we could
|
|
// just directly build the string from user_input.
|
|
helpers::remove_ascii_tab_or_newline(tmp_buffer);
|
|
internal_input = tmp_buffer;
|
|
} else {
|
|
internal_input = input;
|
|
}
|
|
|
|
// If url is special, then:
|
|
if (is_special()) {
|
|
if (internal_input.empty()) {
|
|
path = "/";
|
|
} else if ((internal_input[0] == '/') || (internal_input[0] == '\\')) {
|
|
helpers::parse_prepared_path(internal_input.substr(1), type, path);
|
|
} else {
|
|
helpers::parse_prepared_path(internal_input, type, path);
|
|
}
|
|
} else if (!internal_input.empty()) {
|
|
if (internal_input[0] == '/') {
|
|
helpers::parse_prepared_path(internal_input.substr(1), type, path);
|
|
} else {
|
|
helpers::parse_prepared_path(internal_input, type, path);
|
|
}
|
|
} else {
|
|
if (!host.has_value()) {
|
|
path = "/";
|
|
}
|
|
}
|
|
}
|
|
|
|
[[nodiscard]] std::string url::to_string() const {
|
|
if (!is_valid) {
|
|
return "null";
|
|
}
|
|
std::string answer;
|
|
auto back = std::back_insert_iterator(answer);
|
|
answer.append("{\n");
|
|
answer.append("\t\"protocol\":\"");
|
|
helpers::encode_json(get_protocol(), back);
|
|
answer.append("\",\n");
|
|
if (has_credentials()) {
|
|
answer.append("\t\"username\":\"");
|
|
helpers::encode_json(username, back);
|
|
answer.append("\",\n");
|
|
answer.append("\t\"password\":\"");
|
|
helpers::encode_json(password, back);
|
|
answer.append("\",\n");
|
|
}
|
|
if (host.has_value()) {
|
|
answer.append("\t\"host\":\"");
|
|
helpers::encode_json(host.value(), back);
|
|
answer.append("\",\n");
|
|
}
|
|
if (port.has_value()) {
|
|
answer.append("\t\"port\":\"");
|
|
answer.append(std::to_string(port.value()));
|
|
answer.append("\",\n");
|
|
}
|
|
answer.append("\t\"path\":\"");
|
|
helpers::encode_json(path, back);
|
|
answer.append("\",\n");
|
|
answer.append("\t\"opaque path\":");
|
|
answer.append((has_opaque_path ? "true" : "false"));
|
|
if (has_search()) {
|
|
answer.append(",\n");
|
|
answer.append("\t\"query\":\"");
|
|
// NOLINTNEXTLINE(bugprone-unchecked-optional-access)
|
|
helpers::encode_json(query.value(), back);
|
|
answer.append("\"");
|
|
}
|
|
if (hash.has_value()) {
|
|
answer.append(",\n");
|
|
answer.append("\t\"hash\":\"");
|
|
helpers::encode_json(hash.value(), back);
|
|
answer.append("\"");
|
|
}
|
|
answer.append("\n}");
|
|
return answer;
|
|
}
|
|
|
|
[[nodiscard]] bool url::has_valid_domain() const noexcept {
|
|
if (!host.has_value()) {
|
|
return false;
|
|
}
|
|
return checkers::verify_dns_length(*host);
|
|
}
|
|
|
|
[[nodiscard]] std::string url::get_origin() const {
|
|
if (is_special()) {
|
|
// Return a new opaque origin.
|
|
if (type == scheme::FILE) {
|
|
return "null";
|
|
}
|
|
return ada::helpers::concat(get_protocol(), "//", get_host());
|
|
}
|
|
|
|
if (non_special_scheme == "blob") {
|
|
if (!path.empty()) {
|
|
auto result = ada::parse<ada::url>(path);
|
|
if (result &&
|
|
(result->type == scheme::HTTP || result->type == scheme::HTTPS)) {
|
|
// If pathURL's scheme is not "http" and not "https", then return a
|
|
// new opaque origin.
|
|
return ada::helpers::concat(result->get_protocol(), "//",
|
|
result->get_host());
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return a new opaque origin.
|
|
return "null";
|
|
}
|
|
|
|
[[nodiscard]] std::string url::get_protocol() const {
|
|
if (is_special()) {
|
|
return helpers::concat(ada::scheme::details::is_special_list[type], ":");
|
|
}
|
|
// We only move the 'scheme' if it is non-special.
|
|
return helpers::concat(non_special_scheme, ":");
|
|
}
|
|
|
|
[[nodiscard]] std::string url::get_host() const {
|
|
// If url's host is null, then return the empty string.
|
|
// If url's port is null, return url's host, serialized.
|
|
// Return url's host, serialized, followed by U+003A (:) and url's port,
|
|
// serialized.
|
|
if (!host.has_value()) {
|
|
return "";
|
|
}
|
|
if (port.has_value()) {
|
|
return host.value() + ":" + get_port();
|
|
}
|
|
return host.value();
|
|
}
|
|
|
|
[[nodiscard]] std::string url::get_hostname() const {
|
|
return host.value_or("");
|
|
}
|
|
|
|
[[nodiscard]] std::string url::get_search() const {
|
|
// If this's URL's query is either null or the empty string, then return the
|
|
// empty string. Return U+003F (?), followed by this's URL's query.
|
|
return (!query.has_value() || (query->empty())) ? "" : "?" + query.value();
|
|
}
|
|
|
|
[[nodiscard]] const std::string& url::get_username() const noexcept {
|
|
return username;
|
|
}
|
|
|
|
[[nodiscard]] const std::string& url::get_password() const noexcept {
|
|
return password;
|
|
}
|
|
|
|
[[nodiscard]] std::string url::get_port() const {
|
|
return port.has_value() ? std::to_string(port.value()) : "";
|
|
}
|
|
|
|
[[nodiscard]] std::string url::get_hash() const {
|
|
// If this's URL's fragment is either null or the empty string, then return
|
|
// the empty string. Return U+0023 (#), followed by this's URL's fragment.
|
|
return (!hash.has_value() || (hash->empty())) ? "" : "#" + hash.value();
|
|
}
|
|
|
|
template <bool override_hostname>
|
|
bool url::set_host_or_hostname(const std::string_view input) {
|
|
if (has_opaque_path) {
|
|
return false;
|
|
}
|
|
|
|
url saved_url(*this);
|
|
|
|
size_t host_end_pos = input.find('#');
|
|
std::string _host(input.data(), host_end_pos != std::string_view::npos
|
|
? host_end_pos
|
|
: input.size());
|
|
helpers::remove_ascii_tab_or_newline(_host);
|
|
std::string_view new_host(_host);
|
|
|
|
auto check_url_size = [&]() -> bool {
|
|
if (get_href_size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
|
|
// If url's scheme is "file", then set state to file host state, instead of
|
|
// host state.
|
|
if (type != ada::scheme::type::FILE) {
|
|
std::string_view host_view(_host.data(), _host.length());
|
|
auto [location, found_colon] =
|
|
helpers::get_host_delimiter_location(is_special(), host_view);
|
|
|
|
// Otherwise, if c is U+003A (:) and insideBrackets is false, then:
|
|
// Note: the 'found_colon' value is true if and only if a colon was
|
|
// encountered while not inside brackets.
|
|
if (found_colon) {
|
|
// If buffer is the empty string, host-missing validation error, return
|
|
// failure.
|
|
std::string_view buffer = host_view.substr(0, location);
|
|
if (buffer.empty()) {
|
|
return false;
|
|
}
|
|
|
|
// If state override is given and state override is hostname state, then
|
|
// return failure.
|
|
if constexpr (override_hostname) {
|
|
return false;
|
|
}
|
|
|
|
// Let host be the result of host parsing buffer with url is not special.
|
|
bool succeeded = parse_host(buffer);
|
|
if (!succeeded) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
|
|
// Set url's host to host, buffer to the empty string, and state to port
|
|
// state.
|
|
std::string_view port_buffer = new_host.substr(location + 1);
|
|
if (!port_buffer.empty()) {
|
|
set_port(port_buffer);
|
|
}
|
|
return check_url_size();
|
|
}
|
|
// Otherwise, if one of the following is true:
|
|
// - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#)
|
|
// - url is special and c is U+005C (\)
|
|
else {
|
|
// If url is special and host_view is the empty string, host-missing
|
|
// validation error, return failure.
|
|
if (host_view.empty() && is_special()) {
|
|
return false;
|
|
}
|
|
|
|
// Otherwise, if state override is given, host_view is the empty string,
|
|
// and either url includes credentials or url's port is non-null, then
|
|
// return failure.
|
|
if (host_view.empty() && (has_credentials() || port.has_value())) {
|
|
return false;
|
|
}
|
|
|
|
// Let host be the result of host parsing host_view with url is not
|
|
// special.
|
|
if (host_view.empty() && !is_special()) {
|
|
host = "";
|
|
return check_url_size();
|
|
}
|
|
|
|
bool succeeded = parse_host(host_view);
|
|
if (!succeeded) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
return check_url_size();
|
|
}
|
|
}
|
|
|
|
size_t location = new_host.find_first_of("/\\?");
|
|
if (location != std::string_view::npos) {
|
|
new_host.remove_suffix(new_host.length() - location);
|
|
}
|
|
|
|
if (new_host.empty()) {
|
|
// Set url's host to the empty string.
|
|
host = "";
|
|
} else {
|
|
// Let host be the result of host parsing buffer with url is not special.
|
|
if (!parse_host(new_host)) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
|
|
// If host is "localhost", then set host to the empty string.
|
|
if (host == "localhost") {
|
|
host = "";
|
|
}
|
|
}
|
|
return check_url_size();
|
|
}
|
|
|
|
bool url::set_host(const std::string_view input) {
|
|
return set_host_or_hostname<false>(input);
|
|
}
|
|
|
|
bool url::set_hostname(const std::string_view input) {
|
|
return set_host_or_hostname<true>(input);
|
|
}
|
|
|
|
bool url::set_username(const std::string_view input) {
|
|
if (cannot_have_credentials_or_port()) {
|
|
return false;
|
|
}
|
|
auto previous_username = std::move(username);
|
|
username = ada::unicode::percent_encode(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE);
|
|
if (get_href_size() > ada::get_max_input_length()) {
|
|
username = std::move(previous_username);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool url::set_password(const std::string_view input) {
|
|
if (cannot_have_credentials_or_port()) {
|
|
return false;
|
|
}
|
|
auto previous_password = std::move(password);
|
|
password = ada::unicode::percent_encode(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE);
|
|
if (get_href_size() > ada::get_max_input_length()) {
|
|
password = std::move(previous_password);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool url::set_port(const std::string_view input) {
|
|
if (cannot_have_credentials_or_port()) {
|
|
return false;
|
|
}
|
|
|
|
if (input.empty()) {
|
|
port = std::nullopt;
|
|
return true;
|
|
}
|
|
|
|
std::string trimmed(input);
|
|
helpers::remove_ascii_tab_or_newline(trimmed);
|
|
|
|
if (trimmed.empty()) {
|
|
return true;
|
|
}
|
|
|
|
// Input should not start with a non-digit character.
|
|
if (!ada::unicode::is_ascii_digit(trimmed.front())) {
|
|
return false;
|
|
}
|
|
|
|
// Find the first non-digit character to determine the length of digits
|
|
auto first_non_digit =
|
|
std::ranges::find_if_not(trimmed, ada::unicode::is_ascii_digit);
|
|
std::string_view digits_to_parse =
|
|
std::string_view(trimmed.data(), first_non_digit - trimmed.begin());
|
|
|
|
// Revert changes if parse_port fails.
|
|
std::optional<uint16_t> previous_port = port;
|
|
parse_port(digits_to_parse);
|
|
if (is_valid) {
|
|
if (get_href_size() > ada::get_max_input_length()) {
|
|
port = std::move(previous_port);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
port = std::move(previous_port);
|
|
is_valid = true;
|
|
return false;
|
|
}
|
|
|
|
void url::set_hash(const std::string_view input) {
|
|
if (input.empty()) {
|
|
hash = std::nullopt;
|
|
helpers::strip_trailing_spaces_from_opaque_path(*this);
|
|
return;
|
|
}
|
|
|
|
std::string new_value;
|
|
new_value = input[0] == '#' ? input.substr(1) : input;
|
|
helpers::remove_ascii_tab_or_newline(new_value);
|
|
auto previous_hash = std::move(hash);
|
|
hash = unicode::percent_encode(new_value,
|
|
ada::character_sets::FRAGMENT_PERCENT_ENCODE);
|
|
if (get_href_size() > ada::get_max_input_length()) {
|
|
hash = std::move(previous_hash);
|
|
}
|
|
}
|
|
|
|
void url::set_search(const std::string_view input) {
|
|
if (input.empty()) {
|
|
query = std::nullopt;
|
|
helpers::strip_trailing_spaces_from_opaque_path(*this);
|
|
return;
|
|
}
|
|
|
|
std::string new_value;
|
|
new_value = input[0] == '?' ? input.substr(1) : input;
|
|
helpers::remove_ascii_tab_or_newline(new_value);
|
|
|
|
auto query_percent_encode_set =
|
|
is_special() ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE
|
|
: ada::character_sets::QUERY_PERCENT_ENCODE;
|
|
|
|
auto previous_query = std::move(query);
|
|
query = ada::unicode::percent_encode(new_value, query_percent_encode_set);
|
|
if (get_href_size() > ada::get_max_input_length()) {
|
|
query = std::move(previous_query);
|
|
}
|
|
}
|
|
|
|
bool url::set_pathname(const std::string_view input) {
|
|
if (has_opaque_path) {
|
|
return false;
|
|
}
|
|
auto previous_path = std::move(path);
|
|
path.clear();
|
|
parse_path(input);
|
|
if (get_href_size() > ada::get_max_input_length()) {
|
|
path = std::move(previous_path);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool url::set_protocol(const std::string_view input) {
|
|
std::string view(input);
|
|
helpers::remove_ascii_tab_or_newline(view);
|
|
if (view.empty()) {
|
|
return true;
|
|
}
|
|
|
|
// Schemes should start with alpha values.
|
|
if (!checkers::is_alpha(view[0])) {
|
|
return false;
|
|
}
|
|
|
|
view.append(":");
|
|
|
|
std::string::iterator pointer =
|
|
std::ranges::find_if_not(view, unicode::is_alnum_plus);
|
|
|
|
if (pointer != view.end() && *pointer == ':') {
|
|
url saved_url(*this);
|
|
bool result = parse_scheme<true>(
|
|
std::string_view(view.data(), pointer - view.begin()));
|
|
if (result && get_href_size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
return result;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool url::set_href(const std::string_view input) {
|
|
ada::result<ada::url> out = ada::parse<ada::url>(input);
|
|
|
|
if (out) {
|
|
// The parser enforces get_max_input_length() on both the input and the
|
|
// normalized result. This is a defense-in-depth check.
|
|
if (out->get_href_size() > ada::get_max_input_length()) {
|
|
return false;
|
|
}
|
|
*this = *out;
|
|
}
|
|
|
|
return out.has_value();
|
|
}
|
|
|
|
} // namespace ada
|
|
/* end file src/url.cpp */
|
|
/* begin file src/parser.cpp */
|
|
|
|
#include <array>
|
|
#include <cstring>
|
|
#include <limits>
|
|
#include <ranges>
|
|
|
|
|
|
namespace ada::parser {
|
|
|
|
// 0 = host byte, 1 = host delimiter (/ ? #), 2 = reject
|
|
namespace {
|
|
|
|
constexpr std::array<uint8_t, 256> k_host_class = []() consteval {
|
|
std::array<uint8_t, 256> t{};
|
|
for (size_t i = 0; i < 256; ++i) {
|
|
t[i] = 2;
|
|
}
|
|
for (size_t i = 0x21; i <= 0x7E; ++i) {
|
|
t[i] = 0;
|
|
}
|
|
for (uint8_t c :
|
|
{'#', '/', ':', '<', '>', '?', '@', '[', '\\', ']', '^', '|', '%'}) {
|
|
t[c] = 2;
|
|
}
|
|
t[static_cast<uint8_t>('/')] = 1;
|
|
t[static_cast<uint8_t>('?')] = 1;
|
|
t[static_cast<uint8_t>('#')] = 1;
|
|
return t;
|
|
}();
|
|
|
|
// 0 = ok, 1 = ?/#, 2 = reject. Path rejects '%' so "%2e" falls through.
|
|
constexpr std::array<uint8_t, 256> k_rest = []() consteval {
|
|
std::array<uint8_t, 256> t{};
|
|
for (size_t i = 0; i < 256; ++i) {
|
|
t[i] = 2;
|
|
}
|
|
for (uint8_t c = 0x21; c <= 0x7E; ++c) {
|
|
t[c] = 0;
|
|
}
|
|
for (uint8_t c : {static_cast<uint8_t>('"'), static_cast<uint8_t>('<'),
|
|
static_cast<uint8_t>('>'), static_cast<uint8_t>('`'),
|
|
static_cast<uint8_t>('{'), static_cast<uint8_t>('}'),
|
|
static_cast<uint8_t>('^'), static_cast<uint8_t>('\\'),
|
|
static_cast<uint8_t>('%'), static_cast<uint8_t>('\'')}) {
|
|
t[c] = 2;
|
|
}
|
|
t[static_cast<uint8_t>('?')] = 1;
|
|
t[static_cast<uint8_t>('#')] = 1;
|
|
return t;
|
|
}();
|
|
|
|
} // namespace
|
|
|
|
// Fast path for already-normalized absolute http(s) URLs. noinline keeps
|
|
// the fallthrough path small (IPv4 microbenches).
|
|
template <class result_type>
|
|
ada_never_inline bool try_parse_simple_absolute(std::string_view input,
|
|
result_type& out) {
|
|
constexpr bool is_ada_url = std::is_same_v<result_type, ada::url>;
|
|
constexpr bool is_aggregator =
|
|
std::is_same_v<result_type, ada::url_aggregator>;
|
|
static_assert(is_ada_url || is_aggregator);
|
|
|
|
const size_t len = input.size();
|
|
if (len < 8) [[unlikely]] {
|
|
return false;
|
|
}
|
|
const auto* b = reinterpret_cast<const uint8_t*>(input.data());
|
|
|
|
size_t pos;
|
|
ada::scheme::type scheme_type;
|
|
uint32_t protocol_end;
|
|
if (b[0] == 'h' && b[1] == 't' && b[2] == 't' && b[3] == 'p') {
|
|
if (b[4] == ':' && b[5] == '/' && b[6] == '/') {
|
|
pos = 7;
|
|
scheme_type = ada::scheme::type::HTTP;
|
|
protocol_end = 5;
|
|
} else if (len >= 8 && b[4] == 's' && b[5] == ':' && b[6] == '/' &&
|
|
b[7] == '/') {
|
|
pos = 8;
|
|
scheme_type = ada::scheme::type::HTTPS;
|
|
protocol_end = 6;
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
if (pos < len && (b[pos] == '/' || b[pos] == '\\')) [[unlikely]] {
|
|
return false;
|
|
}
|
|
|
|
// Digit-led hosts are IPv4/numeric; skip before scanning.
|
|
if (pos < len && b[pos] >= '0' && b[pos] <= '9') {
|
|
return false;
|
|
}
|
|
|
|
const size_t host_start = pos;
|
|
bool has_upper = false;
|
|
size_t i = pos;
|
|
for (; i < len; ++i) {
|
|
const uint8_t c = b[i];
|
|
const uint8_t cls = k_host_class[c];
|
|
if (cls == 1) {
|
|
break;
|
|
}
|
|
if (cls == 2) [[unlikely]] {
|
|
return false;
|
|
}
|
|
if (c >= 'A' && c <= 'Z') {
|
|
has_upper = true;
|
|
}
|
|
}
|
|
const size_t host_end = i;
|
|
if (host_start == host_end) [[unlikely]] {
|
|
return false;
|
|
}
|
|
const size_t host_len = host_end - host_start;
|
|
if (host_len > 253) [[unlikely]] {
|
|
return false;
|
|
}
|
|
{
|
|
std::string_view hv(input.data() + host_start, host_len);
|
|
char host_buf[256];
|
|
if (has_upper) [[unlikely]] {
|
|
std::memcpy(host_buf, input.data() + host_start, host_len);
|
|
unicode::to_lower_ascii(host_buf, host_len);
|
|
hv = std::string_view(host_buf, host_len);
|
|
}
|
|
if (checkers::is_ipv4(hv)) [[unlikely]] {
|
|
return false;
|
|
}
|
|
static constexpr std::string_view xn{"xn-", 3};
|
|
if (hv.find(xn) != std::string_view::npos) [[unlikely]] {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
size_t path_start = host_end;
|
|
size_t path_end = host_end;
|
|
size_t query_start = std::string_view::npos;
|
|
size_t hash_start = std::string_view::npos;
|
|
bool has_path = false;
|
|
bool path_has_dot = false;
|
|
|
|
if (i < len && b[i] == '/') {
|
|
has_path = true;
|
|
path_start = i;
|
|
++i;
|
|
for (; i < len; ++i) {
|
|
const uint8_t c = b[i];
|
|
const uint8_t cls = k_rest[c];
|
|
if (cls == 0) {
|
|
path_has_dot |= (c == '.');
|
|
continue;
|
|
}
|
|
if (cls == 1) {
|
|
path_end = i;
|
|
if (c == '?') {
|
|
query_start = i;
|
|
++i;
|
|
goto scan_query;
|
|
}
|
|
hash_start = i;
|
|
++i;
|
|
goto scan_hash;
|
|
}
|
|
return false;
|
|
}
|
|
path_end = i;
|
|
} else if (i < len && b[i] == '?') {
|
|
query_start = i;
|
|
++i;
|
|
goto scan_query;
|
|
} else if (i < len && b[i] == '#') {
|
|
hash_start = i;
|
|
++i;
|
|
goto scan_hash;
|
|
}
|
|
goto after_rest;
|
|
|
|
scan_query:
|
|
for (; i < len; ++i) {
|
|
const uint8_t c = b[i];
|
|
if (c == '#') {
|
|
hash_start = i;
|
|
++i;
|
|
goto scan_hash;
|
|
}
|
|
if (c == '?' || c == '%') {
|
|
continue;
|
|
}
|
|
if (k_rest[c] == 2) [[unlikely]] {
|
|
return false;
|
|
}
|
|
}
|
|
goto after_rest;
|
|
|
|
scan_hash:
|
|
for (; i < len; ++i) {
|
|
const uint8_t c = b[i];
|
|
if (c == '?' || c == '#' || c == '%') {
|
|
continue;
|
|
}
|
|
if (k_rest[c] == 2) [[unlikely]] {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
after_rest:
|
|
if (path_has_dot) [[unlikely]] {
|
|
const std::string_view path_body(input.data() + path_start,
|
|
path_end - path_start);
|
|
if (path_body.size() >= 2 && path_body[1] == '.') {
|
|
if (path_body.size() == 2 || path_body[2] == '/' ||
|
|
(path_body.size() >= 3 && path_body[2] == '.' &&
|
|
(path_body.size() == 3 || path_body[3] == '/'))) {
|
|
return false;
|
|
}
|
|
}
|
|
static constexpr std::string_view slash_dot{"/.", 2};
|
|
size_t p = 1;
|
|
while ((p = path_body.find(slash_dot, p)) != std::string_view::npos) {
|
|
const size_t after = p + 2;
|
|
if (after == path_body.size() || path_body[after] == '/' ||
|
|
(after + 1 <= path_body.size() && path_body[after] == '.' &&
|
|
(after + 1 == path_body.size() || path_body[after + 1] == '/'))) {
|
|
return false;
|
|
}
|
|
p = after;
|
|
}
|
|
}
|
|
|
|
const bool need_slash = !has_path;
|
|
out.type = scheme_type;
|
|
out.is_valid = true;
|
|
out.has_opaque_path = false;
|
|
out.host_type = DEFAULT;
|
|
|
|
if constexpr (is_aggregator) {
|
|
if (!need_slash) {
|
|
out.buffer.resize(len);
|
|
// NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
|
|
std::memcpy(out.buffer.data(), input.data(), len);
|
|
if (has_upper) {
|
|
unicode::to_lower_ascii(out.buffer.data() + host_start,
|
|
host_end - host_start);
|
|
}
|
|
out.components.protocol_end = protocol_end;
|
|
out.components.username_end = protocol_end + 2;
|
|
out.components.host_start = protocol_end + 2;
|
|
out.components.host_end = static_cast<uint32_t>(host_end);
|
|
out.components.port = url_components::omitted;
|
|
out.components.pathname_start = static_cast<uint32_t>(path_start);
|
|
out.components.search_start = (query_start != std::string_view::npos)
|
|
? static_cast<uint32_t>(query_start)
|
|
: url_components::omitted;
|
|
out.components.hash_start = (hash_start != std::string_view::npos)
|
|
? static_cast<uint32_t>(hash_start)
|
|
: url_components::omitted;
|
|
} else {
|
|
out.buffer.resize(len + 1);
|
|
// NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
|
|
std::memcpy(out.buffer.data(), input.data(), host_end);
|
|
out.buffer[host_end] = '/';
|
|
if (host_end < len) {
|
|
std::memcpy(out.buffer.data() + host_end + 1, input.data() + host_end,
|
|
len - host_end);
|
|
}
|
|
if (has_upper) {
|
|
unicode::to_lower_ascii(out.buffer.data() + host_start,
|
|
host_end - host_start);
|
|
}
|
|
out.components.protocol_end = protocol_end;
|
|
out.components.username_end = protocol_end + 2;
|
|
out.components.host_start = protocol_end + 2;
|
|
out.components.host_end = static_cast<uint32_t>(host_end);
|
|
out.components.port = url_components::omitted;
|
|
out.components.pathname_start = static_cast<uint32_t>(host_end);
|
|
out.components.search_start = (query_start != std::string_view::npos)
|
|
? static_cast<uint32_t>(query_start + 1)
|
|
: url_components::omitted;
|
|
out.components.hash_start = (hash_start != std::string_view::npos)
|
|
? static_cast<uint32_t>(hash_start + 1)
|
|
: url_components::omitted;
|
|
}
|
|
} else {
|
|
std::string host_str(input.substr(host_start, host_end - host_start));
|
|
if (has_upper) {
|
|
unicode::to_lower_ascii(host_str.data(), host_str.size());
|
|
}
|
|
out.host = std::move(host_str);
|
|
if (need_slash) {
|
|
out.path = "/";
|
|
} else {
|
|
out.path.assign(input.data() + path_start, path_end - path_start);
|
|
}
|
|
if (query_start != std::string_view::npos) {
|
|
const size_t q_end =
|
|
(hash_start != std::string_view::npos) ? hash_start : len;
|
|
out.query.emplace(input.data() + query_start + 1,
|
|
q_end - query_start - 1);
|
|
}
|
|
if (hash_start != std::string_view::npos) {
|
|
out.hash.emplace(input.data() + hash_start + 1, len - hash_start - 1);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
template <class result_type, bool store_values>
|
|
result_type parse_url_impl(std::string_view user_input,
|
|
const result_type* base_url) {
|
|
// We can specialize the implementation per type.
|
|
// Important: result_type_is_ada_url is evaluated at *compile time*. This
|
|
// means that doing if constexpr(result_type_is_ada_url) { something } else {
|
|
// something else } is free (at runtime). This means that ada::url_aggregator
|
|
// and ada::url **do not have to support the exact same API**.
|
|
constexpr bool result_type_is_ada_url = std::is_same_v<url, result_type>;
|
|
constexpr bool result_type_is_ada_url_aggregator =
|
|
std::is_same_v<url_aggregator, result_type>;
|
|
static_assert(result_type_is_ada_url ||
|
|
result_type_is_ada_url_aggregator); // We don't support
|
|
// anything else for now.
|
|
|
|
ada_log("ada::parser::parse_url('", user_input, "' [", user_input.size(),
|
|
" bytes],", (base_url != nullptr ? base_url->to_string() : "null"),
|
|
")");
|
|
|
|
state state = state::SCHEME_START;
|
|
result_type url{};
|
|
|
|
const uint32_t max_input_length = ada::get_max_input_length();
|
|
|
|
// We refuse to parse URL strings that exceed the maximum input length.
|
|
// By default, this is 4GB but can be configured via
|
|
// ada::set_max_input_length().
|
|
if (user_input.size() > max_input_length) [[unlikely]] {
|
|
url.is_valid = false;
|
|
}
|
|
// Going forward, user_input.size() is in [0,
|
|
// std::numeric_limits<uint32_t>::max). If we are provided with an invalid
|
|
// base, or the optional_url was invalid, we must return.
|
|
if (base_url != nullptr) {
|
|
url.is_valid &= base_url->is_valid;
|
|
}
|
|
if (!url.is_valid) {
|
|
return url;
|
|
}
|
|
|
|
// Simple absolute http(s) fast path (before tabs/newline scan).
|
|
// Skip digit-led hosts (IPv4) with a cheap peek.
|
|
if constexpr (store_values) {
|
|
if (base_url == nullptr) {
|
|
const auto* p = reinterpret_cast<const uint8_t*>(user_input.data());
|
|
const size_t n = user_input.size();
|
|
const bool digit_led_host = (n >= 8 && p[4] == ':' && p[5] == '/' &&
|
|
p[6] == '/' && p[7] >= '0' && p[7] <= '9') ||
|
|
(n >= 9 && p[5] == ':' && p[6] == '/' &&
|
|
p[7] == '/' && p[8] >= '0' && p[8] <= '9');
|
|
if (!digit_led_host && try_parse_simple_absolute(user_input, url)) {
|
|
if constexpr (result_type_is_ada_url_aggregator) {
|
|
if (url.buffer.size() > max_input_length) [[unlikely]] {
|
|
url.is_valid = false;
|
|
}
|
|
} else {
|
|
if (url.get_href_size() > max_input_length) [[unlikely]] {
|
|
url.is_valid = false;
|
|
}
|
|
}
|
|
return url;
|
|
}
|
|
}
|
|
}
|
|
|
|
std::string tmp_buffer;
|
|
std::string_view url_data;
|
|
if (unicode::has_tabs_or_newline(user_input)) [[unlikely]] {
|
|
tmp_buffer = user_input;
|
|
// Optimization opportunity: Instead of copying and then pruning, we could
|
|
// just directly build the string from user_input.
|
|
helpers::remove_ascii_tab_or_newline(tmp_buffer);
|
|
url_data = tmp_buffer;
|
|
} else [[likely]] {
|
|
url_data = user_input;
|
|
}
|
|
|
|
// Leading and trailing control characters are uncommon and easy to deal with
|
|
// (no performance concern).
|
|
helpers::trim_c0_whitespace(url_data);
|
|
|
|
if constexpr (result_type_is_ada_url_aggregator && store_values) {
|
|
// Most of the time, we just need user_input.size().
|
|
// In some instances, we may need a bit more.
|
|
///////////////////////////
|
|
// This is *very* important. This line should *not* be removed
|
|
// hastily. There are principled reasons why reserve is important
|
|
// for performance. If you have a benchmark with small inputs,
|
|
// it may not matter, but in other instances, it could.
|
|
////
|
|
// This rounds up to the next power of two.
|
|
// We know that user_input.size() is in [0,
|
|
// std::numeric_limits<uint32_t>::max).
|
|
uint32_t reserve_capacity =
|
|
(0xFFFFFFFF >>
|
|
helpers::leading_zeroes(uint32_t(1 | user_input.size()))) +
|
|
1;
|
|
url.reserve(reserve_capacity);
|
|
}
|
|
|
|
// Optimization opportunity. Most websites do not have fragment.
|
|
std::optional<std::string_view> fragment = helpers::prune_hash(url_data);
|
|
// We add it last so that an implementation like ada::url_aggregator
|
|
// can append it last to its internal buffer, thus improving performance.
|
|
|
|
// Here url_data no longer has its fragment.
|
|
// We are going to access the data from url_data (it is immutable).
|
|
// At any given time, we are pointing at byte 'input_position' in url_data.
|
|
// The input_position variable should range from 0 to input_size.
|
|
// It is illegal to access url_data at input_size.
|
|
size_t input_position = 0;
|
|
const size_t input_size = url_data.size();
|
|
// Keep running the following state machine by switching on state.
|
|
// If after a run pointer points to the EOF code point, go to the next step.
|
|
// Otherwise, increase pointer by 1 and continue with the state machine.
|
|
// We never decrement input_position.
|
|
while (input_position <= input_size) {
|
|
ada_log("In parsing at ", input_position, " out of ", input_size,
|
|
" in state ", ada::to_string(state));
|
|
switch (state) {
|
|
case state::SCHEME_START: {
|
|
ada_log("SCHEME_START ", helpers::substring(url_data, input_position));
|
|
// If c is an ASCII alpha, append c, lowercased, to buffer, and set
|
|
// state to scheme state.
|
|
if ((input_position != input_size) &&
|
|
checkers::is_alpha(url_data[input_position])) {
|
|
state = state::SCHEME;
|
|
input_position++;
|
|
} else {
|
|
// Otherwise, if state override is not given, set state to no scheme
|
|
// state and decrease pointer by 1.
|
|
state = state::NO_SCHEME;
|
|
}
|
|
break;
|
|
}
|
|
case state::SCHEME: {
|
|
ada_log("SCHEME ", helpers::substring(url_data, input_position));
|
|
// If c is an ASCII alphanumeric, U+002B (+), U+002D (-), or U+002E (.),
|
|
// append c, lowercased, to buffer.
|
|
while ((input_position != input_size) &&
|
|
(unicode::is_alnum_plus(url_data[input_position]))) {
|
|
input_position++;
|
|
}
|
|
// Otherwise, if c is U+003A (:), then:
|
|
if ((input_position != input_size) &&
|
|
(url_data[input_position] == ':')) {
|
|
ada_log("SCHEME the scheme should be ",
|
|
url_data.substr(0, input_position));
|
|
if constexpr (result_type_is_ada_url) {
|
|
if (!url.parse_scheme(url_data.substr(0, input_position))) {
|
|
return url;
|
|
}
|
|
} else {
|
|
// we pass the colon along instead of painfully adding it back.
|
|
if (!url.parse_scheme_with_colon(
|
|
url_data.substr(0, input_position + 1))) {
|
|
return url;
|
|
}
|
|
}
|
|
ada_log("SCHEME the scheme is ", url.get_protocol());
|
|
|
|
// If url's scheme is "file", then:
|
|
// NOLINTNEXTLINE(bugprone-branch-clone)
|
|
if (url.type == scheme::type::FILE) {
|
|
// Set state to file state.
|
|
state = state::FILE;
|
|
}
|
|
// Otherwise, if url is special, base is non-null, and base's scheme
|
|
// is url's scheme: Note: Doing base_url->scheme is unsafe if base_url
|
|
// != nullptr is false.
|
|
else if (url.is_special() && base_url != nullptr &&
|
|
base_url->type == url.type) {
|
|
// Set state to special relative or authority state.
|
|
state = state::SPECIAL_RELATIVE_OR_AUTHORITY;
|
|
}
|
|
// Otherwise, if url is special, set state to special authority
|
|
// slashes state.
|
|
else if (url.is_special()) {
|
|
state = state::SPECIAL_AUTHORITY_SLASHES;
|
|
}
|
|
// Otherwise, if remaining starts with an U+002F (/), set state to
|
|
// path or authority state and increase pointer by 1.
|
|
else if (input_position + 1 < input_size &&
|
|
url_data[input_position + 1] == '/') {
|
|
state = state::PATH_OR_AUTHORITY;
|
|
input_position++;
|
|
}
|
|
// Otherwise, set url's path to the empty string and set state to
|
|
// opaque path state.
|
|
else {
|
|
state = state::OPAQUE_PATH;
|
|
}
|
|
}
|
|
// Otherwise, if state override is not given, set buffer to the empty
|
|
// string, state to no scheme state, and start over (from the first code
|
|
// point in input).
|
|
else {
|
|
state = state::NO_SCHEME;
|
|
input_position = 0;
|
|
break;
|
|
}
|
|
input_position++;
|
|
break;
|
|
}
|
|
case state::NO_SCHEME: {
|
|
ada_log("NO_SCHEME ", helpers::substring(url_data, input_position));
|
|
// The fragment was pruned from url_data before the state machine ran,
|
|
// so 'c is U+0023 (#)' holds exactly when a fragment was found and
|
|
// nothing else remains in front of it.
|
|
const bool c_is_hash =
|
|
fragment.has_value() && input_position == input_size;
|
|
// If base is null, or base has an opaque path and c is not U+0023 (#),
|
|
// validation error, return failure.
|
|
if (base_url == nullptr || (base_url->has_opaque_path && !c_is_hash)) {
|
|
ada_log("NO_SCHEME validation error");
|
|
url.is_valid = false;
|
|
return url;
|
|
}
|
|
// Otherwise, if base has an opaque path and c is U+0023 (#),
|
|
// set url's scheme to base's scheme, url's path to base's path, url's
|
|
// query to base's query, and set state to fragment state.
|
|
else if (base_url->has_opaque_path && c_is_hash) {
|
|
ada_log("NO_SCHEME opaque base with fragment");
|
|
url.copy_scheme(*base_url);
|
|
url.has_opaque_path = base_url->has_opaque_path;
|
|
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.path = base_url->path;
|
|
url.query = base_url->query;
|
|
} else {
|
|
url.update_base_pathname(base_url->get_pathname());
|
|
if (base_url->has_search()) {
|
|
// get_search() returns "" for an empty query string (URL ends
|
|
// with '?'). update_base_search("") would incorrectly clear the
|
|
// query, so pass "?" to preserve the empty query distinction.
|
|
auto s = base_url->get_search();
|
|
url.update_base_search(s.empty() ? std::string_view("?") : s);
|
|
}
|
|
}
|
|
url.update_unencoded_base_hash(*fragment);
|
|
return url;
|
|
}
|
|
// Otherwise, if base's scheme is not "file", set state to relative
|
|
// state and decrease pointer by 1.
|
|
// NOLINTNEXTLINE(bugprone-branch-clone)
|
|
else if (base_url->type != scheme::type::FILE) {
|
|
ada_log("NO_SCHEME non-file relative path");
|
|
state = state::RELATIVE_SCHEME;
|
|
}
|
|
// Otherwise, set state to file state and decrease pointer by 1.
|
|
else {
|
|
ada_log("NO_SCHEME file base type");
|
|
state = state::FILE;
|
|
}
|
|
break;
|
|
}
|
|
case state::AUTHORITY: {
|
|
ada_log("AUTHORITY ", helpers::substring(url_data, input_position));
|
|
// most URLs have no @. Having no @ tells us that we don't have to worry
|
|
// about AUTHORITY. Of course, we could have @ and still not have to
|
|
// worry about AUTHORITY.
|
|
// TODO: Instead of just collecting a bool, collect the location of the
|
|
// '@' and do something useful with it.
|
|
// TODO: We could do various processing early on, using a single pass
|
|
// over the string to collect information about it, e.g., telling us
|
|
// whether there is a @ and if so, where (or how many).
|
|
|
|
// Check if url data contains an @.
|
|
if (url_data.find('@', input_position) == std::string_view::npos) {
|
|
state = state::HOST;
|
|
break;
|
|
}
|
|
bool at_sign_seen{false};
|
|
bool password_token_seen{false};
|
|
/**
|
|
* We expect something of the sort...
|
|
* https://user:pass@example.com:1234/foo/bar?baz#quux
|
|
* --------^
|
|
*/
|
|
do {
|
|
std::string_view view = url_data.substr(input_position);
|
|
// The delimiters are @, /, ? \\.
|
|
size_t location =
|
|
url.is_special() ? helpers::find_authority_delimiter_special(view)
|
|
: helpers::find_authority_delimiter(view);
|
|
std::string_view authority_view = view.substr(0, location);
|
|
size_t end_of_authority = input_position + authority_view.size();
|
|
// If c is U+0040 (@), then:
|
|
if ((end_of_authority != input_size) &&
|
|
(url_data[end_of_authority] == '@')) {
|
|
// If atSignSeen is true, then prepend "%40" to buffer.
|
|
if (at_sign_seen) {
|
|
if (password_token_seen) {
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.password += "%40";
|
|
} else {
|
|
url.append_base_password("%40");
|
|
}
|
|
} else {
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.username += "%40";
|
|
} else {
|
|
url.append_base_username("%40");
|
|
}
|
|
}
|
|
}
|
|
|
|
at_sign_seen = true;
|
|
|
|
if (!password_token_seen) {
|
|
size_t password_token_location = authority_view.find(':');
|
|
password_token_seen =
|
|
password_token_location != std::string_view::npos;
|
|
|
|
if constexpr (store_values) {
|
|
if (!password_token_seen) {
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.username += unicode::percent_encode(
|
|
authority_view,
|
|
character_sets::USERINFO_PERCENT_ENCODE);
|
|
} else {
|
|
url.append_base_username(unicode::percent_encode(
|
|
authority_view,
|
|
character_sets::USERINFO_PERCENT_ENCODE));
|
|
}
|
|
} else {
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.username += unicode::percent_encode(
|
|
authority_view.substr(0, password_token_location),
|
|
character_sets::USERINFO_PERCENT_ENCODE);
|
|
url.password += unicode::percent_encode(
|
|
authority_view.substr(password_token_location + 1),
|
|
character_sets::USERINFO_PERCENT_ENCODE);
|
|
} else {
|
|
url.append_base_username(unicode::percent_encode(
|
|
authority_view.substr(0, password_token_location),
|
|
character_sets::USERINFO_PERCENT_ENCODE));
|
|
url.append_base_password(unicode::percent_encode(
|
|
authority_view.substr(password_token_location + 1),
|
|
character_sets::USERINFO_PERCENT_ENCODE));
|
|
}
|
|
}
|
|
}
|
|
} else if constexpr (store_values) {
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.password += unicode::percent_encode(
|
|
authority_view, character_sets::USERINFO_PERCENT_ENCODE);
|
|
} else {
|
|
url.append_base_password(unicode::percent_encode(
|
|
authority_view, character_sets::USERINFO_PERCENT_ENCODE));
|
|
}
|
|
}
|
|
}
|
|
// Otherwise, if one of the following is true:
|
|
// - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#)
|
|
// - url is special and c is U+005C (\)
|
|
else if (end_of_authority == input_size ||
|
|
url_data[end_of_authority] == '/' ||
|
|
url_data[end_of_authority] == '?' ||
|
|
(url.is_special() && url_data[end_of_authority] == '\\')) {
|
|
// If atSignSeen is true and authority_view is the empty string,
|
|
// validation error, return failure.
|
|
if (at_sign_seen && authority_view.empty()) {
|
|
url.is_valid = false;
|
|
return url;
|
|
}
|
|
state = state::HOST;
|
|
break;
|
|
}
|
|
if (end_of_authority == input_size) {
|
|
if constexpr (store_values) {
|
|
if (fragment.has_value()) {
|
|
url.update_unencoded_base_hash(*fragment);
|
|
}
|
|
}
|
|
return url;
|
|
}
|
|
input_position = end_of_authority + 1;
|
|
} while (true);
|
|
|
|
break;
|
|
}
|
|
case state::SPECIAL_RELATIVE_OR_AUTHORITY: {
|
|
ada_log("SPECIAL_RELATIVE_OR_AUTHORITY ",
|
|
helpers::substring(url_data, input_position));
|
|
|
|
// If c is U+002F (/) and remaining starts with U+002F (/),
|
|
// then set state to special authority ignore slashes state and increase
|
|
// pointer by 1.
|
|
if (url_data.substr(input_position, 2) == "//") {
|
|
state = state::SPECIAL_AUTHORITY_IGNORE_SLASHES;
|
|
input_position += 2;
|
|
} else {
|
|
// Otherwise, validation error, set state to relative state and
|
|
// decrease pointer by 1.
|
|
state = state::RELATIVE_SCHEME;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case state::PATH_OR_AUTHORITY: {
|
|
ada_log("PATH_OR_AUTHORITY ",
|
|
helpers::substring(url_data, input_position));
|
|
|
|
// If c is U+002F (/), then set state to authority state.
|
|
if ((input_position != input_size) &&
|
|
(url_data[input_position] == '/')) {
|
|
state = state::AUTHORITY;
|
|
input_position++;
|
|
} else {
|
|
// Otherwise, set state to path state, and decrease pointer by 1.
|
|
state = state::PATH;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case state::RELATIVE_SCHEME: {
|
|
ada_log("RELATIVE_SCHEME ",
|
|
helpers::substring(url_data, input_position));
|
|
|
|
// Set url's scheme to base's scheme.
|
|
url.copy_scheme(*base_url);
|
|
|
|
// If c is U+002F (/), then set state to relative slash state.
|
|
if ((input_position != input_size) &&
|
|
// NOLINTNEXTLINE(bugprone-branch-clone)
|
|
(url_data[input_position] == '/')) {
|
|
ada_log(
|
|
"RELATIVE_SCHEME if c is U+002F (/), then set state to relative "
|
|
"slash state");
|
|
state = state::RELATIVE_SLASH;
|
|
} else if (url.is_special() && (input_position != input_size) &&
|
|
(url_data[input_position] == '\\')) {
|
|
// Otherwise, if url is special and c is U+005C (\), validation error,
|
|
// set state to relative slash state.
|
|
ada_log(
|
|
"RELATIVE_SCHEME if url is special and c is U+005C, validation "
|
|
"error, set state to relative slash state");
|
|
state = state::RELATIVE_SLASH;
|
|
} else {
|
|
ada_log("RELATIVE_SCHEME otherwise");
|
|
// Set url's username to base's username, url's password to base's
|
|
// password, url's host to base's host, url's port to base's port,
|
|
// url's path to a clone of base's path, and url's query to base's
|
|
// query.
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.username = base_url->username;
|
|
url.password = base_url->password;
|
|
url.host = base_url->host;
|
|
url.port = base_url->port;
|
|
// cloning the base path includes cloning the has_opaque_path flag
|
|
url.has_opaque_path = base_url->has_opaque_path;
|
|
url.path = base_url->path;
|
|
url.query = base_url->query;
|
|
} else {
|
|
url.update_base_authority(base_url->get_href(),
|
|
base_url->get_components());
|
|
url.update_host_to_base_host(base_url->get_hostname());
|
|
url.update_base_port(base_url->retrieve_base_port());
|
|
// cloning the base path includes cloning the has_opaque_path flag
|
|
url.has_opaque_path = base_url->has_opaque_path;
|
|
url.update_base_pathname(base_url->get_pathname());
|
|
if (base_url->has_search()) {
|
|
// get_search() returns "" for an empty query string (URL ends
|
|
// with '?'). update_base_search("") would incorrectly clear the
|
|
// query, so pass "?" to preserve the empty query distinction.
|
|
auto s = base_url->get_search();
|
|
url.update_base_search(s.empty() ? std::string_view("?") : s);
|
|
}
|
|
}
|
|
|
|
url.has_opaque_path = base_url->has_opaque_path;
|
|
|
|
// If c is U+003F (?), then set url's query to the empty string, and
|
|
// state to query state.
|
|
if ((input_position != input_size) &&
|
|
(url_data[input_position] == '?')) {
|
|
state = state::QUERY;
|
|
}
|
|
// Otherwise, if c is not the EOF code point:
|
|
else if (input_position != input_size) {
|
|
// Set url's query to null.
|
|
url.clear_search();
|
|
if constexpr (result_type_is_ada_url) {
|
|
// Shorten url's path.
|
|
helpers::shorten_path(url.path, url.type);
|
|
} else {
|
|
std::string_view path = url.get_pathname();
|
|
if (helpers::shorten_path(path, url.type)) {
|
|
url.update_base_pathname(std::move(std::string(path)));
|
|
}
|
|
}
|
|
// Set state to path state and decrease pointer by 1.
|
|
state = state::PATH;
|
|
break;
|
|
}
|
|
}
|
|
input_position++;
|
|
break;
|
|
}
|
|
case state::RELATIVE_SLASH: {
|
|
ada_log("RELATIVE_SLASH ",
|
|
helpers::substring(url_data, input_position));
|
|
|
|
// If url is special and c is U+002F (/) or U+005C (\), then:
|
|
// NOLINTNEXTLINE(bugprone-branch-clone)
|
|
if (url.is_special() && (input_position != input_size) &&
|
|
(url_data[input_position] == '/' ||
|
|
url_data[input_position] == '\\')) {
|
|
// Set state to special authority ignore slashes state.
|
|
state = state::SPECIAL_AUTHORITY_IGNORE_SLASHES;
|
|
}
|
|
// Otherwise, if c is U+002F (/), then set state to authority state.
|
|
else if ((input_position != input_size) &&
|
|
(url_data[input_position] == '/')) {
|
|
state = state::AUTHORITY;
|
|
}
|
|
// Otherwise, set
|
|
// - url's username to base's username,
|
|
// - url's password to base's password,
|
|
// - url's host to base's host,
|
|
// - url's port to base's port,
|
|
// - state to path state, and then, decrease pointer by 1.
|
|
else {
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.username = base_url->username;
|
|
url.password = base_url->password;
|
|
url.host = base_url->host;
|
|
url.port = base_url->port;
|
|
} else {
|
|
url.update_base_authority(base_url->get_href(),
|
|
base_url->get_components());
|
|
url.update_host_to_base_host(base_url->get_hostname());
|
|
url.update_base_port(base_url->retrieve_base_port());
|
|
}
|
|
state = state::PATH;
|
|
break;
|
|
}
|
|
|
|
input_position++;
|
|
break;
|
|
}
|
|
case state::SPECIAL_AUTHORITY_SLASHES: {
|
|
ada_log("SPECIAL_AUTHORITY_SLASHES ",
|
|
helpers::substring(url_data, input_position));
|
|
|
|
// If c is U+002F (/) and remaining starts with U+002F (/),
|
|
// then set state to special authority ignore slashes state and increase
|
|
// pointer by 1.
|
|
if (url_data.substr(input_position, 2) == "//") {
|
|
input_position += 2;
|
|
}
|
|
|
|
[[fallthrough]];
|
|
}
|
|
case state::SPECIAL_AUTHORITY_IGNORE_SLASHES: {
|
|
ada_log("SPECIAL_AUTHORITY_IGNORE_SLASHES ",
|
|
helpers::substring(url_data, input_position));
|
|
|
|
// If c is neither U+002F (/) nor U+005C (\), then set state to
|
|
// authority state and decrease pointer by 1.
|
|
while ((input_position != input_size) &&
|
|
((url_data[input_position] == '/') ||
|
|
(url_data[input_position] == '\\'))) {
|
|
input_position++;
|
|
}
|
|
state = state::AUTHORITY;
|
|
|
|
break;
|
|
}
|
|
case state::QUERY: {
|
|
ada_log("QUERY ", helpers::substring(url_data, input_position));
|
|
if constexpr (store_values) {
|
|
// Let queryPercentEncodeSet be the special-query percent-encode set
|
|
// if url is special; otherwise the query percent-encode set.
|
|
const uint8_t* query_percent_encode_set =
|
|
url.is_special() ? character_sets::SPECIAL_QUERY_PERCENT_ENCODE
|
|
: character_sets::QUERY_PERCENT_ENCODE;
|
|
|
|
// Percent-encode after encoding, with encoding, buffer, and
|
|
// queryPercentEncodeSet, and append the result to url's query.
|
|
url.update_base_search(url_data.substr(input_position),
|
|
query_percent_encode_set);
|
|
ada_log("QUERY update_base_search completed ");
|
|
if (fragment.has_value()) {
|
|
url.update_unencoded_base_hash(*fragment);
|
|
}
|
|
}
|
|
return url;
|
|
}
|
|
case state::HOST: {
|
|
ada_log("HOST ", helpers::substring(url_data, input_position));
|
|
|
|
std::string_view host_view = url_data.substr(input_position);
|
|
auto [location, found_colon] =
|
|
helpers::get_host_delimiter_location(url.is_special(), host_view);
|
|
input_position = (location != std::string_view::npos)
|
|
? input_position + location
|
|
: input_size;
|
|
// Otherwise, if c is U+003A (:) and insideBrackets is false, then:
|
|
// Note: the 'found_colon' value is true if and only if a colon was
|
|
// encountered while not inside brackets.
|
|
if (found_colon) {
|
|
// If buffer is the empty string, validation error, return failure.
|
|
// Let host be the result of host parsing buffer with url is not
|
|
// special.
|
|
ada_log("HOST parsing ", host_view);
|
|
if (!url.parse_host(host_view)) {
|
|
return url;
|
|
}
|
|
ada_log("HOST parsing results in ", url.get_hostname());
|
|
// Set url's host to host, buffer to the empty string, and state to
|
|
// port state.
|
|
state = state::PORT;
|
|
input_position++;
|
|
}
|
|
// Otherwise, if one of the following is true:
|
|
// - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#)
|
|
// - url is special and c is U+005C (\)
|
|
// The get_host_delimiter_location function either brings us to
|
|
// the colon outside of the bracket, or to one of those characters.
|
|
else {
|
|
// If url is special and host_view is the empty string, validation
|
|
// error, return failure.
|
|
if (host_view.empty() && url.is_special()) {
|
|
url.is_valid = false;
|
|
return url;
|
|
}
|
|
ada_log("HOST parsing ", host_view, " href=", url.get_href());
|
|
// Let host be the result of host parsing host_view with url is not
|
|
// special.
|
|
if (host_view.empty()) {
|
|
url.update_base_hostname("");
|
|
} else if (!url.parse_host(host_view)) {
|
|
return url;
|
|
}
|
|
ada_log("HOST parsing results in ", url.get_hostname(),
|
|
" href=", url.get_href());
|
|
|
|
// Set url's host to host, and state to path start state.
|
|
state = state::PATH_START;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case state::OPAQUE_PATH: {
|
|
ada_log("OPAQUE_PATH ", helpers::substring(url_data, input_position));
|
|
// Opaque path, query, and fragment are structurally always valid:
|
|
// the parser would just percent-encode whatever is there. When we
|
|
// are not storing values (can_parse), we can return immediately.
|
|
// We must set has_opaque_path = true before returning so that when
|
|
// this URL is used as an internal base inside can_parse, NO_SCHEME
|
|
// correctly rejects relative inputs against an opaque-path base
|
|
// (e.g. can_parse("", &"W:") must return false).
|
|
if constexpr (!store_values) {
|
|
url.has_opaque_path = true;
|
|
return url;
|
|
}
|
|
std::string_view view = url_data.substr(input_position);
|
|
// If c is U+003F (?), then set url's query to the empty string and
|
|
// state to query state.
|
|
size_t location = view.find('?');
|
|
if (location != std::string_view::npos) {
|
|
view.remove_suffix(view.size() - location);
|
|
state = state::QUERY;
|
|
input_position += location + 1;
|
|
} else {
|
|
input_position = input_size + 1;
|
|
}
|
|
url.has_opaque_path = true;
|
|
|
|
// This is a really unlikely scenario in real world. We should not seek
|
|
// to optimize it.
|
|
if (view.ends_with(' ')) {
|
|
std::string modified_view =
|
|
std::string(view.substr(0, view.size() - 1)) + "%20";
|
|
url.update_base_pathname(unicode::percent_encode(
|
|
modified_view, character_sets::C0_CONTROL_PERCENT_ENCODE));
|
|
} else {
|
|
url.update_base_pathname(unicode::percent_encode(
|
|
view, character_sets::C0_CONTROL_PERCENT_ENCODE));
|
|
}
|
|
break;
|
|
}
|
|
case state::PORT: {
|
|
ada_log("PORT ", helpers::substring(url_data, input_position));
|
|
std::string_view port_view = url_data.substr(input_position);
|
|
input_position += url.parse_port(port_view, true);
|
|
if (!url.is_valid) {
|
|
return url;
|
|
}
|
|
state = state::PATH_START;
|
|
[[fallthrough]];
|
|
}
|
|
case state::PATH_START: {
|
|
ada_log("PATH_START ", helpers::substring(url_data, input_position));
|
|
// Path, query, and fragment are structurally always valid: the
|
|
// parser would just percent-encode whatever is there. When we are
|
|
// not storing values (can_parse), we can return immediately since
|
|
// no subsequent state can invalidate the URL.
|
|
if constexpr (!store_values) {
|
|
return url;
|
|
}
|
|
|
|
// If url is special, then:
|
|
if (url.is_special()) {
|
|
// Set state to path state.
|
|
state = state::PATH;
|
|
|
|
// Optimization: Avoiding going into PATH state improves the
|
|
// performance of urls ending with /.
|
|
if (input_position == input_size) {
|
|
if constexpr (store_values) {
|
|
url.update_base_pathname("/");
|
|
if (fragment.has_value()) {
|
|
url.update_unencoded_base_hash(*fragment);
|
|
}
|
|
}
|
|
return url;
|
|
}
|
|
// If c is neither U+002F (/) nor U+005C (\), then decrease pointer
|
|
// by 1. We know that (input_position == input_size) is impossible
|
|
// here, because of the previous if-check.
|
|
if ((url_data[input_position] != '/') &&
|
|
(url_data[input_position] != '\\')) {
|
|
break;
|
|
}
|
|
}
|
|
// Otherwise, if state override is not given and c is U+003F (?),
|
|
// set url's query to the empty string and state to query state.
|
|
else if ((input_position != input_size) &&
|
|
(url_data[input_position] == '?')) {
|
|
state = state::QUERY;
|
|
}
|
|
// Otherwise, if c is not the EOF code point:
|
|
else if (input_position != input_size) {
|
|
// Set state to path state.
|
|
state = state::PATH;
|
|
|
|
// If c is not U+002F (/), then decrease pointer by 1.
|
|
if (url_data[input_position] != '/') {
|
|
break;
|
|
}
|
|
}
|
|
|
|
input_position++;
|
|
break;
|
|
}
|
|
case state::PATH: {
|
|
ada_log("PATH ", helpers::substring(url_data, input_position));
|
|
// Path, query, and fragment are structurally always valid: the
|
|
// parser would just percent-encode whatever is there. When we are
|
|
// not storing values (can_parse), we can return immediately since
|
|
// no subsequent state can invalidate the URL.
|
|
if constexpr (!store_values) {
|
|
return url;
|
|
}
|
|
std::string_view view = url_data.substr(input_position);
|
|
|
|
// Most time, we do not need percent encoding.
|
|
// Furthermore, we can immediately locate the '?'.
|
|
size_t locofquestionmark = view.find('?');
|
|
if (locofquestionmark != std::string_view::npos) {
|
|
state = state::QUERY;
|
|
view.remove_suffix(view.size() - locofquestionmark);
|
|
input_position += locofquestionmark + 1;
|
|
} else {
|
|
input_position = input_size + 1;
|
|
}
|
|
if constexpr (store_values) {
|
|
if constexpr (result_type_is_ada_url) {
|
|
helpers::parse_prepared_path(view, url.type, url.path);
|
|
} else {
|
|
url.consume_prepared_path(view);
|
|
ADA_ASSERT_TRUE(url.validate());
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case state::FILE_SLASH: {
|
|
ada_log("FILE_SLASH ", helpers::substring(url_data, input_position));
|
|
|
|
// If c is U+002F (/) or U+005C (\), then:
|
|
if ((input_position != input_size) &&
|
|
(url_data[input_position] == '/' ||
|
|
url_data[input_position] == '\\')) {
|
|
ada_log("FILE_SLASH c is U+002F or U+005C");
|
|
// Set state to file host state.
|
|
state = state::FILE_HOST;
|
|
input_position++;
|
|
} else {
|
|
ada_log("FILE_SLASH otherwise");
|
|
// If base is non-null and base's scheme is "file", then:
|
|
// Note: it is unsafe to do base_url->scheme unless you know that
|
|
// base_url_has_value() is true.
|
|
if (base_url != nullptr && base_url->type == scheme::type::FILE) {
|
|
// Set url's host to base's host.
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.host = base_url->host;
|
|
} else {
|
|
url.update_host_to_base_host(base_url->get_host());
|
|
}
|
|
// If the code point substring from pointer to the end of input does
|
|
// not start with a Windows drive letter and base's path[0] is a
|
|
// normalized Windows drive letter, then append base's path[0] to
|
|
// url's path.
|
|
if (!base_url->get_pathname().empty()) {
|
|
if (!checkers::is_windows_drive_letter(
|
|
url_data.substr(input_position))) {
|
|
std::string_view first_base_url_path =
|
|
base_url->get_pathname().substr(1);
|
|
size_t loc = first_base_url_path.find('/');
|
|
if (loc != std::string_view::npos) {
|
|
helpers::resize(first_base_url_path, loc);
|
|
}
|
|
if (checkers::is_normalized_windows_drive_letter(
|
|
first_base_url_path)) {
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.path += '/';
|
|
url.path += first_base_url_path;
|
|
} else {
|
|
url.append_base_pathname(
|
|
helpers::concat("/", first_base_url_path));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Set state to path state, and decrease pointer by 1.
|
|
state = state::PATH;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case state::FILE_HOST: {
|
|
ada_log("FILE_HOST ", helpers::substring(url_data, input_position));
|
|
std::string_view view = url_data.substr(input_position);
|
|
|
|
size_t location = view.find_first_of("/\\?");
|
|
std::string_view file_host_buffer = view.substr(
|
|
0, (location != std::string_view::npos) ? location : view.size());
|
|
|
|
if (checkers::is_windows_drive_letter(file_host_buffer)) {
|
|
state = state::PATH;
|
|
} else if (file_host_buffer.empty()) {
|
|
// Set url's host to the empty string.
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.host = "";
|
|
} else {
|
|
url.update_base_hostname("");
|
|
}
|
|
// Set state to path start state.
|
|
state = state::PATH_START;
|
|
} else {
|
|
size_t consumed_bytes = file_host_buffer.size();
|
|
input_position += consumed_bytes;
|
|
// Let host be the result of host parsing buffer with url is not
|
|
// special.
|
|
if (!url.parse_host(file_host_buffer)) {
|
|
return url;
|
|
}
|
|
|
|
if constexpr (result_type_is_ada_url) {
|
|
// If host is "localhost", then set host to the empty string.
|
|
if (url.host.has_value() && url.host.value() == "localhost") {
|
|
url.host = "";
|
|
}
|
|
} else {
|
|
if (url.get_hostname() == "localhost") {
|
|
url.update_base_hostname("");
|
|
}
|
|
}
|
|
|
|
// Set buffer to the empty string and state to path start state.
|
|
state = state::PATH_START;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case state::FILE: {
|
|
ada_log("FILE ", helpers::substring(url_data, input_position));
|
|
std::string_view file_view = url_data.substr(input_position);
|
|
|
|
url.set_protocol_as_file();
|
|
if constexpr (result_type_is_ada_url) {
|
|
// Set url's host to the empty string.
|
|
url.host = "";
|
|
} else {
|
|
url.update_base_hostname("");
|
|
}
|
|
// If c is U+002F (/) or U+005C (\), then:
|
|
if (input_position != input_size &&
|
|
(url_data[input_position] == '/' ||
|
|
url_data[input_position] == '\\')) {
|
|
ada_log("FILE c is U+002F or U+005C");
|
|
// Set state to file slash state.
|
|
state = state::FILE_SLASH;
|
|
}
|
|
// Otherwise, if base is non-null and base's scheme is "file":
|
|
else if (base_url != nullptr && base_url->type == scheme::type::FILE) {
|
|
// Set url's host to base's host, url's path to a clone of base's
|
|
// path, and url's query to base's query.
|
|
ada_log("FILE base non-null");
|
|
if constexpr (result_type_is_ada_url) {
|
|
url.host = base_url->host;
|
|
url.path = base_url->path;
|
|
url.query = base_url->query;
|
|
} else {
|
|
url.update_host_to_base_host(base_url->get_hostname());
|
|
url.update_base_pathname(base_url->get_pathname());
|
|
if (base_url->has_search()) {
|
|
// get_search() returns "" for an empty query string (URL ends
|
|
// with '?'). update_base_search("") would incorrectly clear the
|
|
// query, so pass "?" to preserve the empty query distinction.
|
|
auto s = base_url->get_search();
|
|
url.update_base_search(s.empty() ? std::string_view("?") : s);
|
|
}
|
|
}
|
|
url.has_opaque_path = base_url->has_opaque_path;
|
|
|
|
// If c is U+003F (?), then set url's query to the empty string and
|
|
// state to query state.
|
|
if (input_position != input_size && url_data[input_position] == '?') {
|
|
state = state::QUERY;
|
|
}
|
|
// Otherwise, if c is not the EOF code point:
|
|
else if (input_position != input_size) {
|
|
// Set url's query to null.
|
|
url.clear_search();
|
|
// If the code point substring from pointer to the end of input does
|
|
// not start with a Windows drive letter, then shorten url's path.
|
|
if (!checkers::is_windows_drive_letter(file_view)) {
|
|
if constexpr (result_type_is_ada_url) {
|
|
helpers::shorten_path(url.path, url.type);
|
|
} else {
|
|
std::string_view path = url.get_pathname();
|
|
if (helpers::shorten_path(path, url.type)) {
|
|
url.update_base_pathname(std::move(std::string(path)));
|
|
}
|
|
}
|
|
}
|
|
// Otherwise:
|
|
else {
|
|
// Set url's path to an empty list.
|
|
url.clear_pathname();
|
|
url.has_opaque_path = true;
|
|
}
|
|
|
|
// Set state to path state and decrease pointer by 1.
|
|
state = state::PATH;
|
|
break;
|
|
}
|
|
}
|
|
// Otherwise, set state to path state, and decrease pointer by 1.
|
|
else {
|
|
ada_log("FILE go to path");
|
|
state = state::PATH;
|
|
break;
|
|
}
|
|
|
|
input_position++;
|
|
break;
|
|
}
|
|
default:
|
|
unreachable();
|
|
}
|
|
}
|
|
if constexpr (store_values) {
|
|
if (fragment.has_value()) {
|
|
url.update_unencoded_base_hash(*fragment);
|
|
}
|
|
}
|
|
// Check the resulting (normalized) URL size against the maximum input length.
|
|
// Normalization (percent-encoding, IDNA, etc.) can expand the URL beyond the
|
|
// original input size.
|
|
if constexpr (store_values) {
|
|
if (url.is_valid) {
|
|
if constexpr (result_type_is_ada_url_aggregator) {
|
|
if (url.buffer.size() > max_input_length) {
|
|
url.is_valid = false;
|
|
}
|
|
} else {
|
|
if (url.get_href_size() > max_input_length) {
|
|
url.is_valid = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return url;
|
|
}
|
|
|
|
template url parse_url_impl<url, true>(std::string_view user_input,
|
|
const url* base_url = nullptr);
|
|
template url_aggregator parse_url_impl<url_aggregator, true>(
|
|
std::string_view user_input, const url_aggregator* base_url = nullptr);
|
|
template url_aggregator parse_url_impl<url_aggregator, false>(
|
|
std::string_view user_input, const url_aggregator* base_url = nullptr);
|
|
|
|
template <class result_type>
|
|
result_type parse_url(std::string_view user_input,
|
|
const result_type* base_url) {
|
|
return parse_url_impl<result_type, true>(user_input, base_url);
|
|
}
|
|
|
|
template url parse_url<url>(std::string_view user_input,
|
|
const url* base_url = nullptr);
|
|
template url_aggregator parse_url<url_aggregator>(
|
|
std::string_view user_input, const url_aggregator* base_url = nullptr);
|
|
} // namespace ada::parser
|
|
/* end file src/parser.cpp */
|
|
/* begin file src/url_components.cpp */
|
|
|
|
#include <iterator>
|
|
#include <string>
|
|
|
|
namespace ada {
|
|
|
|
[[nodiscard]] std::string url_components::to_string() const {
|
|
std::string answer;
|
|
auto back = std::back_insert_iterator(answer);
|
|
answer.append("{\n");
|
|
|
|
answer.append("\t\"protocol_end\":\"");
|
|
helpers::encode_json(std::to_string(protocol_end), back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\t\"username_end\":\"");
|
|
helpers::encode_json(std::to_string(username_end), back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\t\"host_start\":\"");
|
|
helpers::encode_json(std::to_string(host_start), back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\t\"host_end\":\"");
|
|
helpers::encode_json(std::to_string(host_end), back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\t\"port\":\"");
|
|
helpers::encode_json(std::to_string(port), back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\t\"pathname_start\":\"");
|
|
helpers::encode_json(std::to_string(pathname_start), back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\t\"search_start\":\"");
|
|
helpers::encode_json(std::to_string(search_start), back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\t\"hash_start\":\"");
|
|
helpers::encode_json(std::to_string(hash_start), back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\n}");
|
|
return answer;
|
|
}
|
|
|
|
} // namespace ada
|
|
/* end file src/url_components.cpp */
|
|
/* begin file src/url_aggregator.cpp */
|
|
|
|
#include <array>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <iterator>
|
|
#include <ranges>
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
namespace {
|
|
|
|
ada_really_inline void apply_shifted_non_scheme_offsets(
|
|
ada::url_components& components, uint32_t new_difference) {
|
|
components.username_end += new_difference;
|
|
components.host_start += new_difference;
|
|
components.host_end += new_difference;
|
|
components.pathname_start += new_difference;
|
|
if (components.search_start != ada::url_components::omitted) {
|
|
components.search_start += new_difference;
|
|
}
|
|
if (components.hash_start != ada::url_components::omitted) {
|
|
components.hash_start += new_difference;
|
|
}
|
|
}
|
|
|
|
} // namespace
|
|
|
|
namespace ada {
|
|
template <bool has_state_override>
|
|
[[nodiscard]] ada_really_inline bool url_aggregator::parse_scheme_with_colon(
|
|
const std::string_view input_with_colon) {
|
|
ada_log("url_aggregator::parse_scheme_with_colon ", input_with_colon);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input_with_colon, buffer));
|
|
std::string_view input{input_with_colon};
|
|
input.remove_suffix(1);
|
|
auto parsed_type = ada::scheme::get_scheme_type(input);
|
|
const bool is_input_special = (parsed_type != ada::scheme::NOT_SPECIAL);
|
|
/**
|
|
* In the common case, we will immediately recognize a special scheme (e.g.,
|
|
*http, https), in which case, we can go really fast.
|
|
**/
|
|
if (is_input_special) { // fast path!!!
|
|
if constexpr (has_state_override) {
|
|
// If url's scheme is not a special scheme and buffer is a special scheme,
|
|
// then return.
|
|
if (is_special() != is_input_special) {
|
|
return false;
|
|
}
|
|
|
|
// If url includes credentials or has a non-null port, and buffer is
|
|
// "file", then return.
|
|
if ((has_credentials() || components.port != url_components::omitted) &&
|
|
parsed_type == ada::scheme::type::FILE) {
|
|
return false;
|
|
}
|
|
|
|
// If url's scheme is "file" and its host is an empty host, then return.
|
|
// An empty host is the empty string.
|
|
if (type == ada::scheme::type::FILE &&
|
|
components.host_start == components.host_end) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
type = parsed_type;
|
|
set_scheme_from_view_with_colon(input_with_colon);
|
|
|
|
if constexpr (has_state_override) {
|
|
// This is uncommon.
|
|
uint16_t urls_scheme_port = get_special_port();
|
|
|
|
if (urls_scheme_port) {
|
|
// If url's port is url's scheme's default port, then set url's port to
|
|
// null.
|
|
if (components.port == urls_scheme_port) {
|
|
clear_port();
|
|
}
|
|
}
|
|
}
|
|
} else { // slow path
|
|
std::string _buffer(input);
|
|
// Next function is only valid if the input is ASCII and returns false
|
|
// otherwise, but it seems that we always have ascii content so we do not
|
|
// need to check the return value.
|
|
unicode::to_lower_ascii(_buffer.data(), _buffer.size());
|
|
|
|
if constexpr (has_state_override) {
|
|
// The state-override validation errors below ("return" in the WHATWG URL
|
|
// parser) leave the URL unchanged. The setter contract is
|
|
// "true on success, false if the scheme is invalid" -- the fast path
|
|
// above already returns false here, so the slow path must agree.
|
|
|
|
// If url's scheme is a special scheme and buffer is not a special scheme,
|
|
// then return. If url's scheme is not a special scheme and buffer is a
|
|
// special scheme, then return.
|
|
if (is_special() != ada::scheme::is_special(_buffer)) {
|
|
return false;
|
|
}
|
|
|
|
// If url includes credentials or has a non-null port, and buffer is
|
|
// "file", then return.
|
|
if ((has_credentials() || components.port != url_components::omitted) &&
|
|
_buffer == "file") {
|
|
return false;
|
|
}
|
|
|
|
// If url's scheme is "file" and its host is an empty host, then return.
|
|
// An empty host is the empty string.
|
|
if (type == ada::scheme::type::FILE &&
|
|
components.host_start == components.host_end) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
set_scheme(_buffer);
|
|
|
|
if constexpr (has_state_override) {
|
|
// This is uncommon.
|
|
uint16_t urls_scheme_port = get_special_port();
|
|
|
|
if (urls_scheme_port) {
|
|
// If url's port is url's scheme's default port, then set url's port to
|
|
// null.
|
|
if (components.port == urls_scheme_port) {
|
|
clear_port();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
return true;
|
|
}
|
|
|
|
inline void url_aggregator::copy_scheme(const url_aggregator& u) {
|
|
ada_log("url_aggregator::copy_scheme ", u.buffer);
|
|
ADA_ASSERT_TRUE(validate());
|
|
// next line could overflow but unsigned arithmetic has well-defined
|
|
// overflows.
|
|
uint32_t new_difference = u.components.protocol_end - components.protocol_end;
|
|
|
|
type = u.type;
|
|
buffer.erase(0, components.protocol_end);
|
|
buffer.insert(0, u.get_protocol());
|
|
components.protocol_end = u.components.protocol_end;
|
|
|
|
// No need to update the components
|
|
if (new_difference == 0) {
|
|
return;
|
|
}
|
|
|
|
apply_shifted_non_scheme_offsets(components, new_difference);
|
|
ADA_ASSERT_TRUE(validate());
|
|
}
|
|
|
|
inline void url_aggregator::set_scheme_from_view_with_colon(
|
|
std::string_view new_scheme_with_colon) {
|
|
ada_log("url_aggregator::set_scheme_from_view_with_colon ",
|
|
new_scheme_with_colon);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!new_scheme_with_colon.empty() &&
|
|
new_scheme_with_colon.back() == ':');
|
|
// next line could overflow but unsigned arithmetic has well-defined
|
|
// overflows.
|
|
uint32_t new_difference =
|
|
uint32_t(new_scheme_with_colon.size()) - components.protocol_end;
|
|
|
|
if (buffer.empty()) {
|
|
buffer.append(new_scheme_with_colon);
|
|
} else {
|
|
buffer.erase(0, components.protocol_end);
|
|
buffer.insert(0, new_scheme_with_colon);
|
|
}
|
|
components.protocol_end += new_difference;
|
|
|
|
apply_shifted_non_scheme_offsets(components, new_difference);
|
|
ADA_ASSERT_TRUE(validate());
|
|
}
|
|
|
|
inline void url_aggregator::set_scheme(std::string_view new_scheme) {
|
|
ada_log("url_aggregator::set_scheme ", new_scheme);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(new_scheme.empty() || new_scheme.back() != ':');
|
|
// next line could overflow but unsigned arithmetic has well-defined
|
|
// overflows.
|
|
uint32_t new_difference =
|
|
uint32_t(new_scheme.size()) - components.protocol_end + 1;
|
|
|
|
type = ada::scheme::get_scheme_type(new_scheme);
|
|
if (buffer.empty()) {
|
|
buffer.append(helpers::concat(new_scheme, ":"));
|
|
} else {
|
|
buffer.erase(0, components.protocol_end);
|
|
buffer.insert(0, helpers::concat(new_scheme, ":"));
|
|
}
|
|
components.protocol_end = uint32_t(new_scheme.size() + 1);
|
|
|
|
apply_shifted_non_scheme_offsets(components, new_difference);
|
|
ADA_ASSERT_TRUE(validate());
|
|
}
|
|
|
|
bool url_aggregator::set_protocol(const std::string_view input) {
|
|
ada_log("url_aggregator::set_protocol ", input);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
std::string view(input);
|
|
helpers::remove_ascii_tab_or_newline(view);
|
|
if (view.empty()) {
|
|
return true;
|
|
}
|
|
|
|
// Schemes should start with alpha values.
|
|
if (!checkers::is_alpha(view[0])) {
|
|
return false;
|
|
}
|
|
|
|
view.append(":");
|
|
|
|
std::string::iterator pointer =
|
|
std::ranges::find_if_not(view, unicode::is_alnum_plus);
|
|
|
|
if (pointer != view.end() && *pointer == ':') {
|
|
url_aggregator saved_url(*this);
|
|
bool result = parse_scheme_with_colon<true>(
|
|
view.substr(0, pointer - view.begin() + 1));
|
|
if (result && buffer.size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
return result;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool url_aggregator::set_username(const std::string_view input) {
|
|
ada_log("url_aggregator::set_username '", input, "' ");
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (cannot_have_credentials_or_port()) {
|
|
return false;
|
|
}
|
|
url_aggregator saved_url(*this);
|
|
size_t idx = ada::unicode::percent_encode_index(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE);
|
|
if (idx == input.size()) {
|
|
update_base_username(input);
|
|
} else {
|
|
// We only create a temporary string if we have to!
|
|
update_base_username(ada::unicode::percent_encode(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE, idx));
|
|
}
|
|
if (buffer.size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
return true;
|
|
}
|
|
|
|
bool url_aggregator::set_password(const std::string_view input) {
|
|
ada_log("url_aggregator::set_password '", input, "'");
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (cannot_have_credentials_or_port()) {
|
|
return false;
|
|
}
|
|
url_aggregator saved_url(*this);
|
|
size_t idx = ada::unicode::percent_encode_index(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE);
|
|
if (idx == input.size()) {
|
|
update_base_password(input);
|
|
} else {
|
|
// We only create a temporary string if we have to!
|
|
update_base_password(ada::unicode::percent_encode(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE, idx));
|
|
}
|
|
if (buffer.size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
return true;
|
|
}
|
|
|
|
bool url_aggregator::set_port(const std::string_view input) {
|
|
ada_log("url_aggregator::set_port ", input);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (cannot_have_credentials_or_port()) {
|
|
return false;
|
|
}
|
|
|
|
if (input.empty()) {
|
|
clear_port();
|
|
return true;
|
|
}
|
|
|
|
std::string trimmed(input);
|
|
helpers::remove_ascii_tab_or_newline(trimmed);
|
|
|
|
if (trimmed.empty()) {
|
|
return true;
|
|
}
|
|
|
|
// Input should not start with a non-digit character.
|
|
if (!ada::unicode::is_ascii_digit(trimmed.front())) {
|
|
return false;
|
|
}
|
|
|
|
// Find the first non-digit character to determine the length of digits
|
|
auto first_non_digit =
|
|
std::ranges::find_if_not(trimmed, ada::unicode::is_ascii_digit);
|
|
std::string_view digits_to_parse =
|
|
std::string_view(trimmed.data(), first_non_digit - trimmed.begin());
|
|
|
|
// Revert changes if parse_port fails.
|
|
url_aggregator saved_url(*this);
|
|
parse_port(digits_to_parse);
|
|
if (is_valid) {
|
|
if (buffer.size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
*this = std::move(saved_url);
|
|
is_valid = true;
|
|
ADA_ASSERT_TRUE(validate());
|
|
return false;
|
|
}
|
|
|
|
bool url_aggregator::set_pathname(const std::string_view input) {
|
|
ada_log("url_aggregator::set_pathname ", input);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (has_opaque_path) {
|
|
return false;
|
|
}
|
|
url_aggregator saved_url(*this);
|
|
clear_pathname();
|
|
parse_path(input);
|
|
if (get_pathname().starts_with("//") && !has_authority() && !has_dash_dot()) {
|
|
buffer.insert(components.pathname_start, "/.");
|
|
components.pathname_start += 2;
|
|
if (components.search_start != url_components::omitted) {
|
|
components.search_start += 2;
|
|
}
|
|
if (components.hash_start != url_components::omitted) {
|
|
components.hash_start += 2;
|
|
}
|
|
}
|
|
if (buffer.size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
return true;
|
|
}
|
|
|
|
ada_really_inline void url_aggregator::parse_path(std::string_view input) {
|
|
ada_log("url_aggregator::parse_path ", input);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
std::string tmp_buffer;
|
|
std::string_view internal_input;
|
|
if (unicode::has_tabs_or_newline(input)) {
|
|
tmp_buffer = input;
|
|
// Optimization opportunity: Instead of copying and then pruning, we could
|
|
// just directly build the string from user_input.
|
|
helpers::remove_ascii_tab_or_newline(tmp_buffer);
|
|
internal_input = tmp_buffer;
|
|
} else {
|
|
internal_input = input;
|
|
}
|
|
|
|
// If url is special, then:
|
|
if (is_special()) {
|
|
if (internal_input.empty()) {
|
|
update_base_pathname("/");
|
|
} else if ((internal_input[0] == '/') || (internal_input[0] == '\\')) {
|
|
consume_prepared_path(internal_input.substr(1));
|
|
} else {
|
|
consume_prepared_path(internal_input);
|
|
}
|
|
} else if (!internal_input.empty()) {
|
|
if (internal_input[0] == '/') {
|
|
consume_prepared_path(internal_input.substr(1));
|
|
} else {
|
|
consume_prepared_path(internal_input);
|
|
}
|
|
} else {
|
|
// Non-special URLs with an empty host can have their paths erased
|
|
// Path-only URLs cannot have their paths erased
|
|
if (components.host_start == components.host_end && !has_authority()) {
|
|
update_base_pathname("/");
|
|
}
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
}
|
|
|
|
void url_aggregator::set_search(const std::string_view input) {
|
|
ada_log("url_aggregator::set_search ", input);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (input.empty()) {
|
|
clear_search();
|
|
helpers::strip_trailing_spaces_from_opaque_path(*this);
|
|
return;
|
|
}
|
|
|
|
std::string new_value;
|
|
new_value = input[0] == '?' ? input.substr(1) : input;
|
|
helpers::remove_ascii_tab_or_newline(new_value);
|
|
|
|
auto query_percent_encode_set =
|
|
is_special() ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE
|
|
: ada::character_sets::QUERY_PERCENT_ENCODE;
|
|
|
|
url_aggregator saved_url(*this);
|
|
update_base_search(new_value, query_percent_encode_set);
|
|
if (buffer.size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return;
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
}
|
|
|
|
void url_aggregator::set_hash(const std::string_view input) {
|
|
ada_log("url_aggregator::set_hash ", input);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (input.empty()) {
|
|
if (components.hash_start != url_components::omitted) {
|
|
buffer.resize(components.hash_start);
|
|
components.hash_start = url_components::omitted;
|
|
}
|
|
helpers::strip_trailing_spaces_from_opaque_path(*this);
|
|
return;
|
|
}
|
|
|
|
std::string new_value;
|
|
new_value = input[0] == '#' ? input.substr(1) : input;
|
|
helpers::remove_ascii_tab_or_newline(new_value);
|
|
url_aggregator saved_url(*this);
|
|
update_unencoded_base_hash(new_value);
|
|
if (buffer.size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return;
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
}
|
|
|
|
bool url_aggregator::set_href(const std::string_view input) {
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
ada_log("url_aggregator::set_href ", input, " [", input.size(), " bytes]");
|
|
ada::result<url_aggregator> out = ada::parse<url_aggregator>(input);
|
|
ada_log("url_aggregator::set_href, success :", out.has_value());
|
|
|
|
if (out) {
|
|
// The parser enforces get_max_input_length() on both the input and the
|
|
// normalized result. This is a defense-in-depth check.
|
|
if (out->buffer.size() > ada::get_max_input_length()) {
|
|
return false;
|
|
}
|
|
ada_log("url_aggregator::set_href, parsed ", out->to_string());
|
|
// TODO: Figure out why the following line puts test to never finish.
|
|
*this = *out;
|
|
}
|
|
|
|
return out.has_value();
|
|
}
|
|
|
|
ada_really_inline bool url_aggregator::parse_host(std::string_view input) {
|
|
ada_log("url_aggregator:parse_host \"", input, "\" [", input.size(),
|
|
" bytes]");
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (input.empty()) {
|
|
return is_valid = false;
|
|
} // technically unnecessary.
|
|
// If input starts with U+005B ([), then:
|
|
if (input[0] == '[') {
|
|
// If input does not end with U+005D (]), validation error, return failure.
|
|
if (input.back() != ']') {
|
|
return is_valid = false;
|
|
}
|
|
ada_log("parse_host ipv6");
|
|
|
|
// Return the result of IPv6 parsing input with its leading U+005B ([) and
|
|
// trailing U+005D (]) removed.
|
|
input.remove_prefix(1);
|
|
input.remove_suffix(1);
|
|
return parse_ipv6(input);
|
|
}
|
|
|
|
// If isNotSpecial is true, then return the result of opaque-host parsing
|
|
// input.
|
|
if (!is_special()) {
|
|
return parse_opaque_host(input);
|
|
}
|
|
// Let domain be the result of running UTF-8 decode without BOM on the
|
|
// percent-decoding of input. Let asciiDomain be the result of running domain
|
|
// to ASCII with domain and false. The most common case is an ASCII input, in
|
|
// which case we do not need to call the expensive 'to_ascii' if a few
|
|
// conditions are met: no '%' and no 'xn-' subsequence.
|
|
|
|
// Often, the input does not contain any forbidden code points, and no upper
|
|
// case ASCII letter, then we can just copy it to the buffer. We want to
|
|
// optimize for such a common case.
|
|
|
|
// Fast path: try to parse as pure decimal IPv4(a.b.c.d) first.
|
|
const uint64_t fast_result = checkers::try_parse_ipv4_fast(input);
|
|
if (fast_result < checkers::ipv4_fast_fail) {
|
|
// Fast path succeeded - input is pure decimal IPv4
|
|
if (!input.empty() && input.back() == '.') {
|
|
update_base_hostname(input.substr(0, input.size() - 1));
|
|
} else {
|
|
update_base_hostname(input);
|
|
}
|
|
host_type = IPV4;
|
|
is_valid = true;
|
|
ada_log("parse_host fast path decimal ipv4");
|
|
ADA_ASSERT_TRUE(validate());
|
|
return true;
|
|
}
|
|
uint8_t is_forbidden_or_upper =
|
|
unicode::contains_forbidden_domain_code_point_or_upper(input.data(),
|
|
input.size());
|
|
// Minor optimization opportunity:
|
|
// contains_forbidden_domain_code_point_or_upper could be extend to check for
|
|
// the presence of characters that cannot appear in the ipv4 address and we
|
|
// could also check whether x and n and - are present, and so we could skip
|
|
// some of the checks below. However, the gains are likely to be small, and
|
|
// the code would be more complex.
|
|
static constexpr std::string_view xn_dash{"xn-", 3};
|
|
if (is_forbidden_or_upper == 0 &&
|
|
input.find(xn_dash) == std::string_view::npos) {
|
|
// fast path
|
|
update_base_hostname(input);
|
|
|
|
// Check for other IPv4 formats (hex, octal, etc.)
|
|
if (checkers::is_ipv4(get_hostname())) {
|
|
ada_log("parse_host fast path ipv4");
|
|
return parse_ipv4(get_hostname(), true);
|
|
}
|
|
ada_log("parse_host fast path ", get_hostname());
|
|
is_valid = true;
|
|
return true;
|
|
}
|
|
// We have encountered at least one forbidden code point or the input contains
|
|
// 'xn-' (case insensitive), so we need to call 'to_ascii' to perform the full
|
|
// conversion.
|
|
|
|
ada_log("parse_host calling to_ascii");
|
|
std::optional<std::string> host = std::string(get_hostname());
|
|
is_valid = ada::unicode::to_ascii(host, input, input.find('%'));
|
|
if (!is_valid) {
|
|
ada_log("parse_host to_ascii returns false");
|
|
return is_valid = false;
|
|
}
|
|
ada_log("parse_host to_ascii succeeded ", *host, " [", host->size(),
|
|
" bytes]");
|
|
|
|
if (std::ranges::any_of(host.value(),
|
|
ada::unicode::is_forbidden_domain_code_point)) {
|
|
return is_valid = false;
|
|
}
|
|
|
|
// If asciiDomain ends in a number, then return the result of IPv4 parsing
|
|
// asciiDomain.
|
|
if (checkers::is_ipv4(host.value())) {
|
|
ada_log("parse_host got ipv4 ", *host);
|
|
return parse_ipv4(host.value(), false);
|
|
}
|
|
|
|
update_base_hostname(host.value());
|
|
ADA_ASSERT_TRUE(validate());
|
|
return true;
|
|
}
|
|
|
|
template <bool override_hostname>
|
|
bool url_aggregator::set_host_or_hostname(const std::string_view input) {
|
|
ada_log("url_aggregator::set_host_or_hostname ", input);
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (has_opaque_path) {
|
|
return false;
|
|
}
|
|
|
|
url_aggregator saved_url(*this);
|
|
|
|
size_t host_end_pos = input.find('#');
|
|
std::string _host(input.data(), host_end_pos != std::string_view::npos
|
|
? host_end_pos
|
|
: input.size());
|
|
helpers::remove_ascii_tab_or_newline(_host);
|
|
std::string_view new_host(_host);
|
|
|
|
auto check_url_size = [&]() -> bool {
|
|
if (buffer.size() > ada::get_max_input_length()) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
|
|
// If url's scheme is "file", then set state to file host state, instead of
|
|
// host state.
|
|
if (type != ada::scheme::type::FILE) {
|
|
std::string_view host_view(_host.data(), _host.length());
|
|
auto [location, found_colon] =
|
|
helpers::get_host_delimiter_location(is_special(), host_view);
|
|
|
|
// Otherwise, if c is U+003A (:) and insideBrackets is false, then:
|
|
// Note: the 'found_colon' value is true if and only if a colon was
|
|
// encountered while not inside brackets.
|
|
if (found_colon) {
|
|
// If buffer is the empty string, host-missing validation error, return
|
|
// failure.
|
|
std::string_view host_buffer = host_view.substr(0, location);
|
|
if (host_buffer.empty()) {
|
|
return false;
|
|
}
|
|
|
|
// If state override is given and state override is hostname state, then
|
|
// return failure.
|
|
if constexpr (override_hostname) {
|
|
return false;
|
|
}
|
|
|
|
// Let host be the result of host parsing buffer with url is not special.
|
|
bool succeeded = parse_host(host_buffer);
|
|
if (!succeeded) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
} else if (has_dash_dot()) {
|
|
// The url now has a non-null host, so the "/." that guarded a
|
|
// leading "//" path is no longer needed. Drop it before the port is
|
|
// inserted at host_end, otherwise it stays wedged in the path.
|
|
delete_dash_dot();
|
|
}
|
|
|
|
// Set url's host to host, buffer to the empty string, and state to port
|
|
// state.
|
|
std::string_view port_buffer = new_host.substr(location + 1);
|
|
if (!port_buffer.empty()) {
|
|
set_port(port_buffer);
|
|
}
|
|
return check_url_size();
|
|
}
|
|
// Otherwise, if one of the following is true:
|
|
// - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#)
|
|
// - url is special and c is U+005C (\)
|
|
else {
|
|
// If url is special and host_view is the empty string, host-missing
|
|
// validation error, return failure.
|
|
if (host_view.empty() && is_special()) {
|
|
return false;
|
|
}
|
|
|
|
// Otherwise, if state override is given, host_view is the empty string,
|
|
// and either url includes credentials or url's port is non-null, then
|
|
// return failure.
|
|
if (host_view.empty() && (has_credentials() || has_port())) {
|
|
return false;
|
|
}
|
|
|
|
// Let host be the result of host parsing host_view with url is not
|
|
// special.
|
|
if (host_view.empty() && !is_special()) {
|
|
if (has_hostname()) {
|
|
clear_hostname(); // easy!
|
|
} else if (has_dash_dot()) {
|
|
add_authority_slashes_if_needed();
|
|
delete_dash_dot();
|
|
} else {
|
|
// The url has no authority yet (e.g. "foo:/bar"); setting an empty
|
|
// host must still give it an (empty) authority, matching ada::url.
|
|
add_authority_slashes_if_needed();
|
|
}
|
|
return check_url_size();
|
|
}
|
|
|
|
bool succeeded = parse_host(host_view);
|
|
if (!succeeded) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
} else if (has_dash_dot()) {
|
|
// Should remove dash_dot from pathname
|
|
delete_dash_dot();
|
|
}
|
|
return check_url_size();
|
|
}
|
|
}
|
|
|
|
size_t location = new_host.find_first_of("/\\?");
|
|
if (location != std::string_view::npos) {
|
|
new_host.remove_suffix(new_host.length() - location);
|
|
}
|
|
|
|
if (new_host.empty()) {
|
|
// Set url's host to the empty string.
|
|
clear_hostname();
|
|
} else {
|
|
// Let host be the result of host parsing buffer with url is not special.
|
|
if (!parse_host(new_host)) {
|
|
*this = std::move(saved_url);
|
|
return false;
|
|
}
|
|
|
|
// If host is "localhost", then set host to the empty string.
|
|
if (helpers::substring(buffer, components.host_start,
|
|
components.host_end) == "localhost") {
|
|
clear_hostname();
|
|
}
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
return check_url_size();
|
|
}
|
|
|
|
bool url_aggregator::set_host(const std::string_view input) {
|
|
ada_log("url_aggregator::set_host '", input, "'");
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
return set_host_or_hostname<false>(input);
|
|
}
|
|
|
|
bool url_aggregator::set_hostname(const std::string_view input) {
|
|
ada_log("url_aggregator::set_hostname '", input, "'");
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
return set_host_or_hostname<true>(input);
|
|
}
|
|
|
|
[[nodiscard]] std::string url_aggregator::get_origin() const {
|
|
ada_log("url_aggregator::get_origin");
|
|
if (is_special()) {
|
|
// Return a new opaque origin.
|
|
if (type == scheme::FILE) {
|
|
return "null";
|
|
}
|
|
|
|
return helpers::concat(get_protocol(), "//", get_host());
|
|
}
|
|
|
|
if (get_protocol() == "blob:") {
|
|
std::string_view path = get_pathname();
|
|
if (!path.empty()) {
|
|
auto out = ada::parse<ada::url_aggregator>(path);
|
|
if (out && (out->type == scheme::HTTP || out->type == scheme::HTTPS)) {
|
|
// If pathURL's scheme is not "http" and not "https", then return a
|
|
// new opaque origin.
|
|
return helpers::concat(out->get_protocol(), "//", out->get_host());
|
|
}
|
|
}
|
|
}
|
|
|
|
// Return a new opaque origin.
|
|
return "null";
|
|
}
|
|
|
|
[[nodiscard]] std::string_view url_aggregator::get_username() const
|
|
ada_lifetime_bound {
|
|
ada_log("url_aggregator::get_username");
|
|
if (has_non_empty_username()) {
|
|
return helpers::substring(buffer, components.protocol_end + 2,
|
|
components.username_end);
|
|
}
|
|
return "";
|
|
}
|
|
|
|
[[nodiscard]] std::string_view url_aggregator::get_password() const
|
|
ada_lifetime_bound {
|
|
ada_log("url_aggregator::get_password");
|
|
if (has_non_empty_password()) {
|
|
return helpers::substring(buffer, components.username_end + 1,
|
|
components.host_start);
|
|
}
|
|
return "";
|
|
}
|
|
|
|
[[nodiscard]] std::string_view url_aggregator::get_port() const
|
|
ada_lifetime_bound {
|
|
ada_log("url_aggregator::get_port");
|
|
if (components.port == url_components::omitted) {
|
|
return "";
|
|
}
|
|
return helpers::substring(buffer, components.host_end + 1,
|
|
components.pathname_start);
|
|
}
|
|
|
|
[[nodiscard]] std::string_view url_aggregator::get_hash() const
|
|
ada_lifetime_bound {
|
|
ada_log("url_aggregator::get_hash");
|
|
// If this's URL's fragment is either null or the empty string, then return
|
|
// the empty string. Return U+0023 (#), followed by this's URL's fragment.
|
|
if (components.hash_start == url_components::omitted) {
|
|
return "";
|
|
}
|
|
if (buffer.size() - components.hash_start <= 1) {
|
|
return "";
|
|
}
|
|
return helpers::substring(buffer, components.hash_start);
|
|
}
|
|
|
|
[[nodiscard]] std::string_view url_aggregator::get_host() const
|
|
ada_lifetime_bound {
|
|
ada_log("url_aggregator::get_host");
|
|
// Technically, we should check if there is a hostname, but
|
|
// the code below works even if there isn't.
|
|
// if(!has_hostname()) { return ""; }
|
|
size_t start = components.host_start;
|
|
if (components.host_end > components.host_start &&
|
|
buffer[components.host_start] == '@') {
|
|
start++;
|
|
}
|
|
// if we have an empty host, then the space between components.host_end and
|
|
// components.pathname_start may be occupied by /.
|
|
if (start == components.host_end) {
|
|
return {};
|
|
}
|
|
return helpers::substring(buffer, start, components.pathname_start);
|
|
}
|
|
|
|
[[nodiscard]] std::string_view url_aggregator::get_hostname() const
|
|
ada_lifetime_bound {
|
|
ada_log("url_aggregator::get_hostname");
|
|
// Technically, we should check if there is a hostname, but
|
|
// the code below works even if there isn't.
|
|
// if(!has_hostname()) { return ""; }
|
|
size_t start = components.host_start;
|
|
// So host_start is not where the host begins.
|
|
if (components.host_end > components.host_start &&
|
|
buffer[components.host_start] == '@') {
|
|
start++;
|
|
}
|
|
return helpers::substring(buffer, start, components.host_end);
|
|
}
|
|
|
|
[[nodiscard]] std::string_view url_aggregator::get_search() const
|
|
ada_lifetime_bound {
|
|
ada_log("url_aggregator::get_search");
|
|
// If this's URL's query is either null or the empty string, then return the
|
|
// empty string. Return U+003F (?), followed by this's URL's query.
|
|
if (components.search_start == url_components::omitted) {
|
|
return "";
|
|
}
|
|
auto ending_index = uint32_t(buffer.size());
|
|
if (components.hash_start != url_components::omitted) {
|
|
ending_index = components.hash_start;
|
|
}
|
|
if (ending_index - components.search_start <= 1) {
|
|
return "";
|
|
}
|
|
return helpers::substring(buffer, components.search_start, ending_index);
|
|
}
|
|
|
|
[[nodiscard]] std::string_view url_aggregator::get_protocol() const
|
|
ada_lifetime_bound {
|
|
ada_log("url_aggregator::get_protocol");
|
|
return helpers::substring(buffer, 0, components.protocol_end);
|
|
}
|
|
|
|
[[nodiscard]] std::string ada::url_aggregator::to_string() const {
|
|
ada_log("url_aggregator::to_string buffer:", buffer, " [", buffer.size(),
|
|
" bytes]");
|
|
if (!is_valid) {
|
|
return "null";
|
|
}
|
|
|
|
std::string answer;
|
|
auto back = std::back_insert_iterator(answer);
|
|
answer.append("{\n");
|
|
|
|
answer.append("\t\"buffer\":\"");
|
|
helpers::encode_json(buffer, back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\t\"protocol\":\"");
|
|
helpers::encode_json(get_protocol(), back);
|
|
answer.append("\",\n");
|
|
|
|
if (has_credentials()) {
|
|
answer.append("\t\"username\":\"");
|
|
helpers::encode_json(get_username(), back);
|
|
answer.append("\",\n");
|
|
answer.append("\t\"password\":\"");
|
|
helpers::encode_json(get_password(), back);
|
|
answer.append("\",\n");
|
|
}
|
|
|
|
answer.append("\t\"host\":\"");
|
|
helpers::encode_json(get_host(), back);
|
|
answer.append("\",\n");
|
|
|
|
answer.append("\t\"path\":\"");
|
|
helpers::encode_json(get_pathname(), back);
|
|
answer.append("\",\n");
|
|
answer.append("\t\"opaque path\":");
|
|
answer.append((has_opaque_path ? "true" : "false"));
|
|
answer.append(",\n");
|
|
|
|
if (components.search_start != url_components::omitted) {
|
|
answer.append("\t\"query\":\"");
|
|
helpers::encode_json(get_search(), back);
|
|
answer.append("\",\n");
|
|
}
|
|
if (components.hash_start != url_components::omitted) {
|
|
answer.append("\t\"fragment\":\"");
|
|
helpers::encode_json(get_hash(), back);
|
|
answer.append("\",\n");
|
|
}
|
|
|
|
auto convert_offset_to_string = [](uint32_t offset) -> std::string {
|
|
if (offset == url_components::omitted) {
|
|
return "null";
|
|
} else {
|
|
return std::to_string(offset);
|
|
}
|
|
};
|
|
|
|
answer.append("\t\"protocol_end\":");
|
|
answer.append(convert_offset_to_string(components.protocol_end));
|
|
answer.append(",\n");
|
|
|
|
answer.append("\t\"username_end\":");
|
|
answer.append(convert_offset_to_string(components.username_end));
|
|
answer.append(",\n");
|
|
|
|
answer.append("\t\"host_start\":");
|
|
answer.append(convert_offset_to_string(components.host_start));
|
|
answer.append(",\n");
|
|
|
|
answer.append("\t\"host_end\":");
|
|
answer.append(convert_offset_to_string(components.host_end));
|
|
answer.append(",\n");
|
|
|
|
answer.append("\t\"port\":");
|
|
answer.append(convert_offset_to_string(components.port));
|
|
answer.append(",\n");
|
|
|
|
answer.append("\t\"pathname_start\":");
|
|
answer.append(convert_offset_to_string(components.pathname_start));
|
|
answer.append(",\n");
|
|
|
|
answer.append("\t\"search_start\":");
|
|
answer.append(convert_offset_to_string(components.search_start));
|
|
answer.append(",\n");
|
|
|
|
answer.append("\t\"hash_start\":");
|
|
answer.append(convert_offset_to_string(components.hash_start));
|
|
answer.append("\n}");
|
|
|
|
return answer;
|
|
}
|
|
|
|
[[nodiscard]] bool url_aggregator::has_valid_domain() const noexcept {
|
|
if (components.host_start == components.host_end) {
|
|
return false;
|
|
}
|
|
// Avoid allocation: construct a string_view directly into the buffer.
|
|
size_t start = components.host_start;
|
|
if (components.host_end > components.host_start &&
|
|
buffer[components.host_start] == '@') {
|
|
start++;
|
|
}
|
|
return checkers::verify_dns_length(
|
|
std::string_view(buffer.data() + start, components.host_end - start));
|
|
}
|
|
|
|
bool url_aggregator::parse_ipv4(std::string_view input, bool in_place) {
|
|
ada_log("parse_ipv4 ", input, " [", input.size(),
|
|
" bytes], overlaps with buffer: ",
|
|
helpers::overlaps(input, buffer) ? "yes" : "no");
|
|
ADA_ASSERT_TRUE(validate());
|
|
if (input.empty()) {
|
|
return is_valid = false;
|
|
}
|
|
const bool trailing_dot = (input.back() == '.');
|
|
if (trailing_dot) {
|
|
input.remove_suffix(1);
|
|
if (input.empty()) {
|
|
return is_valid = false;
|
|
}
|
|
}
|
|
|
|
const uint64_t fast = checkers::try_parse_ipv4_fast(input);
|
|
if (fast < checkers::ipv4_fast_fail) [[likely]] {
|
|
// Pure decimal: keep the buffer when it already holds the address.
|
|
// Otherwise write the (trailing-dot-stripped) input.
|
|
if (!(in_place && !trailing_dot)) {
|
|
update_base_hostname(input);
|
|
}
|
|
host_type = IPV4;
|
|
ADA_ASSERT_TRUE(validate());
|
|
return true;
|
|
}
|
|
|
|
const char* p = input.data();
|
|
const char* end = p + input.size();
|
|
uint64_t ipv4 = 0;
|
|
int digit_count = 0;
|
|
int pure_decimal_count = 0;
|
|
|
|
for (; digit_count < 4 && p < end; ++digit_count) {
|
|
uint64_t segment = 0;
|
|
bool pure = false;
|
|
if (!detail::parse_ipv4_number(p, end, segment, pure)) {
|
|
return is_valid = false;
|
|
}
|
|
if (pure) {
|
|
++pure_decimal_count;
|
|
}
|
|
if (p >= end) {
|
|
const unsigned shift = static_cast<unsigned>(32 - digit_count * 8);
|
|
if (segment >= (uint64_t{1} << shift)) {
|
|
return is_valid = false;
|
|
}
|
|
ipv4 = (ipv4 << shift) | segment;
|
|
goto ipv4_done;
|
|
}
|
|
if (segment > 255 || *p != '.') {
|
|
return is_valid = false;
|
|
}
|
|
ipv4 = (ipv4 << 8) | segment;
|
|
++p;
|
|
}
|
|
if (digit_count != 4 || p != end) {
|
|
return is_valid = false;
|
|
}
|
|
ipv4_done:
|
|
ada_log("url_aggregator::parse_ipv4 completed ", get_href(),
|
|
" host: ", get_host());
|
|
if (in_place && pure_decimal_count == 4 && !trailing_dot) {
|
|
ada_log(
|
|
"url_aggregator::parse_ipv4 completed and was already correct in the "
|
|
"buffer");
|
|
} else {
|
|
update_base_hostname(ada::serializers::ipv4(ipv4));
|
|
}
|
|
host_type = IPV4;
|
|
ADA_ASSERT_TRUE(validate());
|
|
return true;
|
|
}
|
|
|
|
bool url_aggregator::parse_ipv6(std::string_view input) {
|
|
ada_log("parse_ipv6 ", input, " [", input.size(), " bytes]");
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (input.empty() || input.size() > 45) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
#if defined(ADA_AVX512)
|
|
if (!detail::ipv6_structure_plausible(input.data(), input.size()))
|
|
[[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
#endif
|
|
|
|
std::array<uint16_t, 8> address{};
|
|
const char* pointer = input.data();
|
|
const char* const end = pointer + input.size();
|
|
int piece_index = 0;
|
|
int compress = -1;
|
|
|
|
if (*pointer == ':') {
|
|
if (input.size() == 1 || pointer[1] != ':') [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
pointer += 2;
|
|
compress = ++piece_index;
|
|
}
|
|
|
|
while (pointer != end) {
|
|
if (piece_index == 8) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
if (*pointer == ':') {
|
|
if (compress != -1) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
++pointer;
|
|
compress = ++piece_index;
|
|
continue;
|
|
}
|
|
|
|
uint16_t value = 0;
|
|
const int length = detail::parse_hex_piece(pointer, end, value);
|
|
|
|
if (pointer != end && *pointer == '.') {
|
|
if (length == 0) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
pointer -= length;
|
|
if (piece_index > 6) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
|
|
int numbers_seen = 0;
|
|
while (pointer != end) {
|
|
int ipv4_piece = -1;
|
|
if (numbers_seen > 0) {
|
|
if (*pointer == '.' && numbers_seen < 4) {
|
|
++pointer;
|
|
} else {
|
|
return is_valid = false;
|
|
}
|
|
}
|
|
if (pointer == end || *pointer < '0' || *pointer > '9') [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
ipv4_piece = *pointer - '0';
|
|
++pointer;
|
|
if (pointer != end && *pointer >= '0' && *pointer <= '9') {
|
|
if (ipv4_piece == 0) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
ipv4_piece = ipv4_piece * 10 + (*pointer - '0');
|
|
++pointer;
|
|
if (pointer != end && *pointer >= '0' && *pointer <= '9') {
|
|
ipv4_piece = ipv4_piece * 10 + (*pointer - '0');
|
|
++pointer;
|
|
if (ipv4_piece > 255) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
}
|
|
}
|
|
address[static_cast<size_t>(piece_index)] = static_cast<uint16_t>(
|
|
address[static_cast<size_t>(piece_index)] * 0x100 +
|
|
static_cast<uint16_t>(ipv4_piece));
|
|
++numbers_seen;
|
|
if (numbers_seen == 2 || numbers_seen == 4) {
|
|
++piece_index;
|
|
}
|
|
}
|
|
if (numbers_seen != 4) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (length == 0) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
|
|
if (pointer != end && *pointer == ':') {
|
|
++pointer;
|
|
if (pointer == end) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
} else if (pointer != end) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
|
|
address[static_cast<size_t>(piece_index)] = value;
|
|
++piece_index;
|
|
}
|
|
|
|
if (compress != -1) {
|
|
const int right = piece_index - compress;
|
|
if (right > 0) {
|
|
const size_t dest = static_cast<size_t>(8 - right);
|
|
const size_t src = static_cast<size_t>(compress);
|
|
if (dest != src) {
|
|
for (size_t i = static_cast<size_t>(right); i-- > 0;) {
|
|
address[dest + i] = address[src + i];
|
|
address[src + i] = 0;
|
|
}
|
|
}
|
|
}
|
|
} else if (piece_index != 8) [[unlikely]] {
|
|
return is_valid = false;
|
|
}
|
|
|
|
// Serialize once; skip rewrite when hostname is already canonical.
|
|
const std::string serialized = ada::serializers::ipv6(address);
|
|
const std::string_view current = get_hostname();
|
|
if (current.size() == serialized.size() &&
|
|
std::memcmp(current.data(), serialized.data(), serialized.size()) == 0) {
|
|
ada_log("parse_ipv6 in-place canonical match");
|
|
} else {
|
|
update_base_hostname(serialized);
|
|
}
|
|
ada_log("parse_ipv6 ", get_hostname());
|
|
ADA_ASSERT_TRUE(validate());
|
|
host_type = IPV6;
|
|
return true;
|
|
}
|
|
|
|
bool url_aggregator::parse_opaque_host(std::string_view input) {
|
|
ada_log("parse_opaque_host ", input, " [", input.size(), " bytes]");
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer));
|
|
if (std::ranges::any_of(input, ada::unicode::is_forbidden_host_code_point)) {
|
|
return is_valid = false;
|
|
}
|
|
|
|
// Return the result of running UTF-8 percent-encode on input using the C0
|
|
// control percent-encode set.
|
|
size_t idx = ada::unicode::percent_encode_index(
|
|
input, character_sets::C0_CONTROL_PERCENT_ENCODE);
|
|
if (idx == input.size()) {
|
|
update_base_hostname(input);
|
|
} else {
|
|
// We only create a temporary string if we need to.
|
|
update_base_hostname(ada::unicode::percent_encode(
|
|
input, character_sets::C0_CONTROL_PERCENT_ENCODE, idx));
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
return true;
|
|
}
|
|
|
|
[[nodiscard]] std::string url_aggregator::to_diagram() const {
|
|
if (!is_valid) {
|
|
return "invalid";
|
|
}
|
|
std::string answer;
|
|
answer.append(buffer);
|
|
answer.append(" [");
|
|
answer.append(std::to_string(buffer.size()));
|
|
answer.append(" bytes]");
|
|
answer.append("\n");
|
|
// first line
|
|
std::string line1;
|
|
line1.resize(buffer.size(), ' ');
|
|
if (components.hash_start != url_components::omitted) {
|
|
line1[components.hash_start] = '|';
|
|
}
|
|
if (components.search_start != url_components::omitted) {
|
|
line1[components.search_start] = '|';
|
|
}
|
|
if (components.pathname_start != buffer.size()) {
|
|
line1[components.pathname_start] = '|';
|
|
}
|
|
if (components.host_end != buffer.size()) {
|
|
line1[components.host_end] = '|';
|
|
}
|
|
if (components.host_start != buffer.size()) {
|
|
line1[components.host_start] = '|';
|
|
}
|
|
if (components.username_end != buffer.size()) {
|
|
line1[components.username_end] = '|';
|
|
}
|
|
if (components.protocol_end != buffer.size()) {
|
|
line1[components.protocol_end] = '|';
|
|
}
|
|
answer.append(line1);
|
|
answer.append("\n");
|
|
|
|
std::string line2 = line1;
|
|
if (components.hash_start != url_components::omitted) {
|
|
line2[components.hash_start] = '`';
|
|
line1[components.hash_start] = ' ';
|
|
|
|
for (size_t i = components.hash_start + 1; i < line2.size(); i++) {
|
|
line2[i] = '-';
|
|
}
|
|
line2.append(" hash_start");
|
|
answer.append(line2);
|
|
answer.append("\n");
|
|
}
|
|
|
|
std::string line3 = line1;
|
|
if (components.search_start != url_components::omitted) {
|
|
line3[components.search_start] = '`';
|
|
line1[components.search_start] = ' ';
|
|
|
|
for (size_t i = components.search_start + 1; i < line3.size(); i++) {
|
|
line3[i] = '-';
|
|
}
|
|
line3.append(" search_start ");
|
|
line3.append(std::to_string(components.search_start));
|
|
answer.append(line3);
|
|
answer.append("\n");
|
|
}
|
|
|
|
std::string line4 = line1;
|
|
if (components.pathname_start != buffer.size()) {
|
|
line4[components.pathname_start] = '`';
|
|
line1[components.pathname_start] = ' ';
|
|
for (size_t i = components.pathname_start + 1; i < line4.size(); i++) {
|
|
line4[i] = '-';
|
|
}
|
|
line4.append(" pathname_start ");
|
|
line4.append(std::to_string(components.pathname_start));
|
|
answer.append(line4);
|
|
answer.append("\n");
|
|
}
|
|
|
|
std::string line5 = line1;
|
|
if (components.host_end != buffer.size()) {
|
|
line5[components.host_end] = '`';
|
|
line1[components.host_end] = ' ';
|
|
|
|
for (size_t i = components.host_end + 1; i < line5.size(); i++) {
|
|
line5[i] = '-';
|
|
}
|
|
line5.append(" host_end ");
|
|
line5.append(std::to_string(components.host_end));
|
|
answer.append(line5);
|
|
answer.append("\n");
|
|
}
|
|
|
|
std::string line6 = line1;
|
|
if (components.host_start != buffer.size()) {
|
|
line6[components.host_start] = '`';
|
|
line1[components.host_start] = ' ';
|
|
|
|
for (size_t i = components.host_start + 1; i < line6.size(); i++) {
|
|
line6[i] = '-';
|
|
}
|
|
line6.append(" host_start ");
|
|
line6.append(std::to_string(components.host_start));
|
|
answer.append(line6);
|
|
answer.append("\n");
|
|
}
|
|
|
|
std::string line7 = line1;
|
|
if (components.username_end != buffer.size()) {
|
|
line7[components.username_end] = '`';
|
|
line1[components.username_end] = ' ';
|
|
|
|
for (size_t i = components.username_end + 1; i < line7.size(); i++) {
|
|
line7[i] = '-';
|
|
}
|
|
line7.append(" username_end ");
|
|
line7.append(std::to_string(components.username_end));
|
|
answer.append(line7);
|
|
answer.append("\n");
|
|
}
|
|
|
|
std::string line8 = line1;
|
|
if (components.protocol_end != buffer.size()) {
|
|
line8[components.protocol_end] = '`';
|
|
line1[components.protocol_end] = ' ';
|
|
|
|
for (size_t i = components.protocol_end + 1; i < line8.size(); i++) {
|
|
line8[i] = '-';
|
|
}
|
|
line8.append(" protocol_end ");
|
|
line8.append(std::to_string(components.protocol_end));
|
|
answer.append(line8);
|
|
answer.append("\n");
|
|
}
|
|
|
|
if (components.hash_start == url_components::omitted) {
|
|
answer.append("note: hash omitted\n");
|
|
}
|
|
if (components.search_start == url_components::omitted) {
|
|
answer.append("note: search omitted\n");
|
|
}
|
|
if (components.protocol_end > buffer.size()) {
|
|
answer.append("warning: protocol_end overflows\n");
|
|
}
|
|
if (components.username_end > buffer.size()) {
|
|
answer.append("warning: username_end overflows\n");
|
|
}
|
|
if (components.host_start > buffer.size()) {
|
|
answer.append("warning: host_start overflows\n");
|
|
}
|
|
if (components.host_end > buffer.size()) {
|
|
answer.append("warning: host_end overflows\n");
|
|
}
|
|
if (components.pathname_start > buffer.size()) {
|
|
answer.append("warning: pathname_start overflows\n");
|
|
}
|
|
return answer;
|
|
}
|
|
|
|
void url_aggregator::delete_dash_dot() {
|
|
ada_log("url_aggregator::delete_dash_dot");
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(has_dash_dot());
|
|
buffer.erase(components.host_end, 2);
|
|
components.pathname_start -= 2;
|
|
if (components.search_start != url_components::omitted) {
|
|
components.search_start -= 2;
|
|
}
|
|
if (components.hash_start != url_components::omitted) {
|
|
components.hash_start -= 2;
|
|
}
|
|
ADA_ASSERT_TRUE(validate());
|
|
ADA_ASSERT_TRUE(!has_dash_dot());
|
|
}
|
|
|
|
inline void url_aggregator::consume_prepared_path(std::string_view input) {
|
|
ada_log("url_aggregator::consume_prepared_path ", input);
|
|
/***
|
|
* This is largely duplicated code from helpers::parse_prepared_path, which is
|
|
* unfortunate. This particular function is nearly identical, except that it
|
|
* is a method on url_aggregator. The idea is that the trivial path (which is
|
|
* very common) merely appends to the buffer. This is the same trivial path as
|
|
* with helpers::parse_prepared_path, except that we have the additional check
|
|
* for is_at_path(). Otherwise, we grab a copy of the current path and we
|
|
* modify it, and then insert it back into the buffer.
|
|
*/
|
|
uint8_t accumulator = checkers::path_signature(input);
|
|
// Let us first detect a trivial case.
|
|
// If it is special, we check that we have no dot, no %, no \ and no
|
|
// character needing percent encoding. Otherwise, we check that we have no %,
|
|
// no dot, and no character needing percent encoding.
|
|
constexpr uint8_t need_encoding = 1;
|
|
constexpr uint8_t backslash_char = 2;
|
|
constexpr uint8_t dot_char = 4;
|
|
constexpr uint8_t percent_char = 8;
|
|
bool special = type != ada::scheme::NOT_SPECIAL;
|
|
bool may_need_slow_file_handling = (type == ada::scheme::type::FILE &&
|
|
checkers::is_windows_drive_letter(input));
|
|
bool trivial_path =
|
|
(special ? (accumulator == 0)
|
|
: ((accumulator & (need_encoding | dot_char | percent_char)) ==
|
|
0)) &&
|
|
(!may_need_slow_file_handling);
|
|
if (accumulator == dot_char && !may_need_slow_file_handling) {
|
|
// '4' means that we have at least one dot, but nothing that requires
|
|
// percent encoding or decoding. The only part that is not trivial is
|
|
// that we may have single dots and double dots path segments.
|
|
// If we have such segments, then we either have a path that begins
|
|
// with '.' (easy to check), or we have the sequence './'.
|
|
// Note: input cannot be empty, it must at least contain one character ('.')
|
|
// Note: we know that '\' is not present.
|
|
if (input[0] != '.') {
|
|
size_t slashdot = 0;
|
|
bool dot_is_file = true;
|
|
for (;;) {
|
|
slashdot = input.find("/.", slashdot);
|
|
if (slashdot == std::string_view::npos) { // common case
|
|
break;
|
|
} else { // uncommon
|
|
// only three cases matter: /./, /.. or a final /
|
|
slashdot += 2;
|
|
dot_is_file &= !(slashdot == input.size() || input[slashdot] == '.' ||
|
|
input[slashdot] == '/');
|
|
}
|
|
}
|
|
trivial_path = dot_is_file;
|
|
}
|
|
}
|
|
if (trivial_path && is_at_path()) {
|
|
ada_log("parse_path trivial");
|
|
buffer += '/';
|
|
buffer += input;
|
|
return;
|
|
}
|
|
std::string path = std::string(get_pathname());
|
|
// We are going to need to look a bit at the path, but let us see if we can
|
|
// ignore percent encoding *and* backslashes *and* percent characters.
|
|
// Except for the trivial case, this is likely to capture 99% of paths out
|
|
// there.
|
|
bool fast_path =
|
|
(special &&
|
|
(accumulator & (need_encoding | backslash_char | percent_char)) == 0) &&
|
|
(type != ada::scheme::type::FILE);
|
|
if (fast_path) {
|
|
ada_log("parse_prepared_path fast");
|
|
// Here we don't need to worry about \ or percent encoding.
|
|
// We also do not have a file protocol. We might have dots, however,
|
|
// but dots must as appear as '.', and they cannot be encoded because
|
|
// the symbol '%' is not present.
|
|
size_t previous_location = 0; // We start at 0.
|
|
do {
|
|
size_t new_location = input.find('/', previous_location);
|
|
// std::string_view path_view = input;
|
|
// We process the last segment separately:
|
|
if (new_location == std::string_view::npos) {
|
|
std::string_view path_view = input.substr(previous_location);
|
|
if (path_view == "..") { // The path ends with ..
|
|
// e.g., if you receive ".." with an empty path, you go to "/".
|
|
if (path.empty()) {
|
|
path = '/';
|
|
update_base_pathname(path);
|
|
return;
|
|
}
|
|
// Fast case where we have nothing to do:
|
|
if (path.back() == '/') {
|
|
update_base_pathname(path);
|
|
return;
|
|
}
|
|
// If you have the path "/joe/myfriend",
|
|
// then you delete 'myfriend'.
|
|
path.resize(path.rfind('/') + 1);
|
|
update_base_pathname(path);
|
|
return;
|
|
}
|
|
path += '/';
|
|
if (path_view != ".") {
|
|
path.append(path_view);
|
|
}
|
|
update_base_pathname(path);
|
|
return;
|
|
} else {
|
|
// This is a non-final segment.
|
|
std::string_view path_view =
|
|
input.substr(previous_location, new_location - previous_location);
|
|
previous_location = new_location + 1;
|
|
if (path_view == "..") {
|
|
size_t last_delimiter = path.rfind('/');
|
|
if (last_delimiter != std::string::npos) {
|
|
path.erase(last_delimiter);
|
|
}
|
|
} else if (path_view != ".") {
|
|
path += '/';
|
|
path.append(path_view);
|
|
}
|
|
}
|
|
} while (true);
|
|
} else {
|
|
ada_log("parse_path slow");
|
|
// we have reached the general case
|
|
bool needs_percent_encoding = (accumulator & 1);
|
|
std::string path_buffer_tmp;
|
|
do {
|
|
size_t location = (special && (accumulator & 2))
|
|
? input.find_first_of("/\\")
|
|
: input.find('/');
|
|
std::string_view path_view = input;
|
|
if (location != std::string_view::npos) {
|
|
path_view.remove_suffix(path_view.size() - location);
|
|
input.remove_prefix(location + 1);
|
|
}
|
|
// path_buffer is either path_view or it might point at a percent encoded
|
|
// temporary string.
|
|
std::string_view path_buffer =
|
|
(needs_percent_encoding &&
|
|
ada::unicode::percent_encode<false>(
|
|
path_view, character_sets::PATH_PERCENT_ENCODE, path_buffer_tmp))
|
|
? path_buffer_tmp
|
|
: path_view;
|
|
if (unicode::is_double_dot_path_segment(path_buffer)) {
|
|
helpers::shorten_path(path, type);
|
|
if (location == std::string_view::npos) {
|
|
path += '/';
|
|
}
|
|
} else if (unicode::is_single_dot_path_segment(path_buffer) &&
|
|
(location == std::string_view::npos)) {
|
|
path += '/';
|
|
}
|
|
// Otherwise, if path_buffer is not a single-dot path segment, then:
|
|
else if (!unicode::is_single_dot_path_segment(path_buffer)) {
|
|
// If url's scheme is "file", url's path is empty, and path_buffer is a
|
|
// Windows drive letter, then replace the second code point in
|
|
// path_buffer with U+003A (:).
|
|
if (type == ada::scheme::type::FILE && path.empty() &&
|
|
checkers::is_windows_drive_letter(path_buffer)) {
|
|
path += '/';
|
|
path += path_buffer[0];
|
|
path += ':';
|
|
path_buffer.remove_prefix(2);
|
|
path.append(path_buffer);
|
|
} else {
|
|
// Append path_buffer to url's path.
|
|
path += '/';
|
|
path.append(path_buffer);
|
|
}
|
|
}
|
|
if (location == std::string_view::npos) {
|
|
update_base_pathname(path);
|
|
return;
|
|
}
|
|
} while (true);
|
|
}
|
|
}
|
|
} // namespace ada
|
|
/* end file src/url_aggregator.cpp */
|
|
|
|
#if ADA_INCLUDE_URL_PATTERN
|
|
/* begin file src/url_pattern.cpp */
|
|
#if ADA_INCLUDE_URL_PATTERN
|
|
|
|
|
|
#include <algorithm>
|
|
#include <optional>
|
|
#include <string>
|
|
|
|
namespace ada {
|
|
|
|
tl::expected<url_pattern_init, errors> url_pattern_init::process(
|
|
const url_pattern_init& init, url_pattern_init::process_type type,
|
|
std::optional<std::string_view> protocol,
|
|
std::optional<std::string_view> username,
|
|
std::optional<std::string_view> password,
|
|
std::optional<std::string_view> hostname,
|
|
std::optional<std::string_view> port,
|
|
std::optional<std::string_view> pathname,
|
|
std::optional<std::string_view> search,
|
|
std::optional<std::string_view> hash) {
|
|
// Let result be the result of creating a new URLPatternInit.
|
|
auto result = url_pattern_init{};
|
|
|
|
// If protocol is not null, set result["protocol"] to protocol.
|
|
if (protocol.has_value()) result.protocol = *protocol;
|
|
|
|
// If username is not null, set result["username"] to username.
|
|
if (username.has_value()) result.username = *username;
|
|
|
|
// If password is not null, set result["password"] to password.
|
|
if (password.has_value()) result.password = *password;
|
|
|
|
// If hostname is not null, set result["hostname"] to hostname.
|
|
if (hostname.has_value()) result.hostname = *hostname;
|
|
|
|
// If port is not null, set result["port"] to port.
|
|
if (port.has_value()) result.port = *port;
|
|
|
|
// If pathname is not null, set result["pathname"] to pathname.
|
|
if (pathname.has_value()) result.pathname = *pathname;
|
|
|
|
// If search is not null, set result["search"] to search.
|
|
if (search.has_value()) result.search = *search;
|
|
|
|
// If hash is not null, set result["hash"] to hash.
|
|
if (hash.has_value()) result.hash = *hash;
|
|
|
|
// Let baseURL be null.
|
|
std::optional<url_aggregator> base_url{};
|
|
|
|
// If init["baseURL"] exists:
|
|
if (init.base_url.has_value()) {
|
|
// Set baseURL to the result of parsing init["baseURL"].
|
|
auto parsing_result = ada::parse<url_aggregator>(*init.base_url);
|
|
// If baseURL is failure, then throw a TypeError.
|
|
if (!parsing_result) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
base_url = std::move(*parsing_result);
|
|
|
|
// If init["protocol"] does not exist, then set result["protocol"] to the
|
|
// result of processing a base URL string given baseURL's scheme and type.
|
|
if (!init.protocol.has_value()) {
|
|
ADA_ASSERT_TRUE(base_url.has_value());
|
|
std::string_view base_url_protocol = base_url->get_protocol();
|
|
if (base_url_protocol.ends_with(":")) base_url_protocol.remove_suffix(1);
|
|
result.protocol =
|
|
url_pattern_helpers::process_base_url_string(base_url_protocol, type);
|
|
}
|
|
|
|
// If type is not "pattern" and init contains none of "protocol",
|
|
// "hostname", "port" and "username", then set result["username"] to the
|
|
// result of processing a base URL string given baseURL's username and type.
|
|
if (type != process_type::pattern && !init.protocol && !init.hostname &&
|
|
!init.port && !init.username) {
|
|
result.username = url_pattern_helpers::process_base_url_string(
|
|
base_url->get_username(), type);
|
|
}
|
|
|
|
// TODO: Optimization opportunity: Merge this with the previous check.
|
|
// If type is not "pattern" and init contains none of "protocol",
|
|
// "hostname", "port", "username" and "password", then set
|
|
// result["password"] to the result of processing a base URL string given
|
|
// baseURL's password and type.
|
|
if (type != process_type::pattern && !init.protocol && !init.hostname &&
|
|
!init.port && !init.username && !init.password) {
|
|
result.password = url_pattern_helpers::process_base_url_string(
|
|
base_url->get_password(), type);
|
|
}
|
|
|
|
// If init contains neither "protocol" nor "hostname", then:
|
|
if (!init.protocol && !init.hostname) {
|
|
// Let baseHost be baseURL's host.
|
|
// If baseHost is null, then set baseHost to the empty string.
|
|
auto base_host = base_url->get_hostname();
|
|
// Set result["hostname"] to the result of processing a base URL string
|
|
// given baseHost and type.
|
|
result.hostname =
|
|
url_pattern_helpers::process_base_url_string(base_host, type);
|
|
}
|
|
|
|
// If init contains none of "protocol", "hostname", and "port", then:
|
|
if (!init.protocol && !init.hostname && !init.port) {
|
|
// If baseURL's port is null, then set result["port"] to the empty string.
|
|
// Otherwise, set result["port"] to baseURL's port, serialized.
|
|
result.port = base_url->get_port();
|
|
}
|
|
|
|
// If init contains none of "protocol", "hostname", "port", and "pathname",
|
|
// then set result["pathname"] to the result of processing a base URL string
|
|
// given the result of URL path serializing baseURL and type.
|
|
if (!init.protocol && !init.hostname && !init.port && !init.pathname) {
|
|
result.pathname = url_pattern_helpers::process_base_url_string(
|
|
base_url->get_pathname(), type);
|
|
}
|
|
|
|
// If init contains none of "protocol", "hostname", "port", "pathname", and
|
|
// "search", then:
|
|
if (!init.protocol && !init.hostname && !init.port && !init.pathname &&
|
|
!init.search) {
|
|
// Let baseQuery be baseURL's query. get_search() carries the leading "?"
|
|
// delimiter, but the spec inherits the query itself, so drop it.
|
|
std::string_view base_query = base_url->get_search();
|
|
if (base_query.starts_with("?")) base_query.remove_prefix(1);
|
|
// Set result["search"] to the result of processing a base URL string
|
|
// given baseQuery and type.
|
|
result.search =
|
|
url_pattern_helpers::process_base_url_string(base_query, type);
|
|
}
|
|
|
|
// If init contains none of "protocol", "hostname", "port", "pathname",
|
|
// "search", and "hash", then:
|
|
if (!init.protocol && !init.hostname && !init.port && !init.pathname &&
|
|
!init.search && !init.hash) {
|
|
// Let baseFragment be baseURL's fragment. get_hash() carries the leading
|
|
// "#" delimiter, but the spec inherits the fragment itself, so drop it.
|
|
std::string_view base_fragment = base_url->get_hash();
|
|
if (base_fragment.starts_with("#")) base_fragment.remove_prefix(1);
|
|
// Set result["hash"] to the result of processing a base URL string given
|
|
// baseFragment and type.
|
|
result.hash =
|
|
url_pattern_helpers::process_base_url_string(base_fragment, type);
|
|
}
|
|
}
|
|
|
|
// If init["protocol"] exists, then set result["protocol"] to the result of
|
|
// process protocol for init given init["protocol"] and type.
|
|
if (init.protocol) {
|
|
auto process_result = process_protocol(*init.protocol, type);
|
|
if (!process_result) {
|
|
return tl::unexpected(process_result.error());
|
|
}
|
|
result.protocol = std::move(*process_result);
|
|
}
|
|
|
|
// If init["username"] exists, then set result["username"] to the result of
|
|
// process username for init given init["username"] and type.
|
|
if (init.username.has_value()) {
|
|
auto process_result = process_username(*init.username, type);
|
|
if (!process_result) {
|
|
return tl::unexpected(process_result.error());
|
|
}
|
|
result.username = std::move(*process_result);
|
|
}
|
|
|
|
// If init["password"] exists, then set result["password"] to the result of
|
|
// process password for init given init["password"] and type.
|
|
if (init.password.has_value()) {
|
|
auto process_result = process_password(*init.password, type);
|
|
if (!process_result) {
|
|
return tl::unexpected(process_result.error());
|
|
}
|
|
result.password = std::move(*process_result);
|
|
}
|
|
|
|
// If init["hostname"] exists, then set result["hostname"] to the result of
|
|
// process hostname for init given init["hostname"] and type.
|
|
if (init.hostname.has_value()) {
|
|
auto process_result = process_hostname(*init.hostname, type);
|
|
if (!process_result) {
|
|
return tl::unexpected(process_result.error());
|
|
}
|
|
result.hostname = std::move(*process_result);
|
|
}
|
|
|
|
// If init["port"] exists, then set result["port"] to the result of process
|
|
// port for init given init["port"], result["protocol"], and type.
|
|
if (init.port) {
|
|
auto process_result =
|
|
process_port(*init.port, result.protocol.value_or("fake"), type);
|
|
if (!process_result) {
|
|
return tl::unexpected(process_result.error());
|
|
}
|
|
result.port = std::move(*process_result);
|
|
}
|
|
|
|
// If init["pathname"] exists:
|
|
if (init.pathname.has_value()) {
|
|
// Set result["pathname"] to init["pathname"].
|
|
result.pathname = init.pathname;
|
|
|
|
// If the following are all true:
|
|
// - baseURL is not null;
|
|
// - baseURL has an opaque path; and
|
|
// - the result of running is an absolute pathname given result["pathname"]
|
|
// and type is false,
|
|
if (base_url && !base_url->has_opaque_path &&
|
|
!url_pattern_helpers::is_absolute_pathname(*result.pathname, type)) {
|
|
// Let baseURLPath be the result of running process a base URL string
|
|
// given the result of URL path serializing baseURL and type.
|
|
// TODO: Optimization opportunity: Avoid returning a string if no slash
|
|
// exist.
|
|
std::string base_url_path = url_pattern_helpers::process_base_url_string(
|
|
base_url->get_pathname(), type);
|
|
|
|
// Let slash index be the index of the last U+002F (/) code point found in
|
|
// baseURLPath, interpreted as a sequence of code points, or null if there
|
|
// are no instances of the code point.
|
|
auto slash_index = base_url_path.find_last_of('/');
|
|
|
|
// If slash index is not null:
|
|
if (slash_index != std::string::npos) {
|
|
// Let new pathname be the code point substring from 0 to slash index +
|
|
// 1 within baseURLPath.
|
|
base_url_path.resize(slash_index + 1);
|
|
// Append result["pathname"] to the end of new pathname.
|
|
ADA_ASSERT_TRUE(result.pathname.has_value());
|
|
base_url_path.append(std::move(*result.pathname));
|
|
// Set result["pathname"] to new pathname.
|
|
result.pathname = std::move(base_url_path);
|
|
}
|
|
}
|
|
|
|
// Set result["pathname"] to the result of process pathname for init given
|
|
// result["pathname"], result["protocol"], and type.
|
|
auto pathname_processing_result =
|
|
process_pathname(*result.pathname, result.protocol.value_or(""), type);
|
|
if (!pathname_processing_result) {
|
|
return tl::unexpected(pathname_processing_result.error());
|
|
}
|
|
result.pathname = std::move(*pathname_processing_result);
|
|
}
|
|
|
|
// If init["search"] exists then set result["search"] to the result of process
|
|
// search for init given init["search"] and type.
|
|
if (init.search) {
|
|
auto process_result = process_search(*init.search, type);
|
|
if (!process_result) {
|
|
return tl::unexpected(process_result.error());
|
|
}
|
|
result.search = std::move(*process_result);
|
|
}
|
|
|
|
// If init["hash"] exists then set result["hash"] to the result of process
|
|
// hash for init given init["hash"] and type.
|
|
if (init.hash) {
|
|
auto process_result = process_hash(*init.hash, type);
|
|
if (!process_result) {
|
|
return tl::unexpected(process_result.error());
|
|
}
|
|
result.hash = std::move(*process_result);
|
|
}
|
|
// Return result.
|
|
return result;
|
|
}
|
|
|
|
tl::expected<std::string, errors> url_pattern_init::process_protocol(
|
|
std::string_view value, process_type type) {
|
|
ada_log("process_protocol=", value, " [", type, "]");
|
|
// Let strippedValue be the given value with a single trailing U+003A (:)
|
|
// removed, if any.
|
|
if (value.ends_with(":")) {
|
|
value.remove_suffix(1);
|
|
}
|
|
// If type is "pattern" then return strippedValue.
|
|
if (type == process_type::pattern) {
|
|
return std::string(value);
|
|
}
|
|
// Return the result of running canonicalize a protocol given strippedValue.
|
|
return url_pattern_helpers::canonicalize_protocol(value);
|
|
}
|
|
|
|
tl::expected<std::string, errors> url_pattern_init::process_username(
|
|
std::string_view value, process_type type) {
|
|
// If type is "pattern" then return value.
|
|
if (type == process_type::pattern) {
|
|
return std::string(value);
|
|
}
|
|
// Return the result of running canonicalize a username given value.
|
|
return url_pattern_helpers::canonicalize_username(value);
|
|
}
|
|
|
|
tl::expected<std::string, errors> url_pattern_init::process_password(
|
|
std::string_view value, process_type type) {
|
|
// If type is "pattern" then return value.
|
|
if (type == process_type::pattern) {
|
|
return std::string(value);
|
|
}
|
|
// Return the result of running canonicalize a password given value.
|
|
return url_pattern_helpers::canonicalize_password(value);
|
|
}
|
|
|
|
tl::expected<std::string, errors> url_pattern_init::process_hostname(
|
|
std::string_view value, process_type type) {
|
|
ada_log("process_hostname value=", value, " type=", type);
|
|
// If type is "pattern" then return value.
|
|
if (type == process_type::pattern) {
|
|
return std::string(value);
|
|
}
|
|
// Return the result of running canonicalize a hostname given value.
|
|
return url_pattern_helpers::canonicalize_hostname(value);
|
|
}
|
|
|
|
tl::expected<std::string, errors> url_pattern_init::process_port(
|
|
std::string_view port, std::string_view protocol, process_type type) {
|
|
// If type is "pattern" then return portValue.
|
|
if (type == process_type::pattern) {
|
|
return std::string(port);
|
|
}
|
|
// Return the result of running canonicalize a port given portValue and
|
|
// protocolValue.
|
|
return url_pattern_helpers::canonicalize_port_with_protocol(port, protocol);
|
|
}
|
|
|
|
tl::expected<std::string, errors> url_pattern_init::process_pathname(
|
|
std::string_view value, std::string_view protocol, process_type type) {
|
|
// If type is "pattern" then return pathnameValue.
|
|
if (type == process_type::pattern) {
|
|
return std::string(value);
|
|
}
|
|
|
|
// If protocolValue is a special scheme or the empty string, then return the
|
|
// result of running canonicalize a pathname given pathnameValue.
|
|
if (protocol.empty() || scheme::is_special(protocol)) {
|
|
return url_pattern_helpers::canonicalize_pathname(value);
|
|
}
|
|
|
|
// Return the result of running canonicalize an opaque pathname given
|
|
// pathnameValue.
|
|
return url_pattern_helpers::canonicalize_opaque_pathname(value);
|
|
}
|
|
|
|
tl::expected<std::string, errors> url_pattern_init::process_search(
|
|
std::string_view value, process_type type) {
|
|
// Let strippedValue be the given value with a single leading U+003F (?)
|
|
// removed, if any.
|
|
if (value.starts_with("?")) {
|
|
value.remove_prefix(1);
|
|
}
|
|
// We cannot assert that the value is no longer starting with a single
|
|
// question mark because technically it can start. The question is whether or
|
|
// not we should remove the first question mark. Ref:
|
|
// https://github.com/ada-url/ada/pull/992 The spec is not clear on this.
|
|
|
|
// If type is "pattern" then return strippedValue.
|
|
if (type == process_type::pattern) {
|
|
return std::string(value);
|
|
}
|
|
// Return the result of running canonicalize a search given strippedValue.
|
|
return url_pattern_helpers::canonicalize_search(value);
|
|
}
|
|
|
|
tl::expected<std::string, errors> url_pattern_init::process_hash(
|
|
std::string_view value, process_type type) {
|
|
// Let strippedValue be the given value with a single leading U+0023 (#)
|
|
// removed, if any.
|
|
if (value.starts_with("#")) {
|
|
value.remove_prefix(1);
|
|
}
|
|
ADA_ASSERT_TRUE(!value.starts_with("#"));
|
|
// If type is "pattern" then return strippedValue.
|
|
if (type == process_type::pattern) {
|
|
return std::string(value);
|
|
}
|
|
// Return the result of running canonicalize a hash given strippedValue.
|
|
return url_pattern_helpers::canonicalize_hash(value);
|
|
}
|
|
|
|
} // namespace ada
|
|
|
|
#endif // ADA_INCLUDE_URL_PATTERN
|
|
/* end file src/url_pattern.cpp */
|
|
/* begin file src/url_pattern_helpers.cpp */
|
|
#if ADA_INCLUDE_URL_PATTERN
|
|
|
|
#include <algorithm>
|
|
#include <array>
|
|
#include <charconv>
|
|
#include <optional>
|
|
#include <ranges>
|
|
#include <string>
|
|
|
|
|
|
namespace ada::url_pattern_helpers {
|
|
|
|
std::tuple<std::string, std::vector<std::string>>
|
|
generate_regular_expression_and_name_list(
|
|
const std::vector<url_pattern_part>& part_list,
|
|
url_pattern_compile_component_options options) {
|
|
// Let result be "^"
|
|
std::string result = "^";
|
|
// Reserve capacity to reduce reallocations
|
|
result.reserve(part_list.size() * 16);
|
|
|
|
// Let name list be a new list
|
|
std::vector<std::string> name_list{};
|
|
name_list.reserve(part_list.size());
|
|
|
|
// Pre-generate segment wildcard regexp if needed (avoids repeated generation)
|
|
std::string segment_wildcard_regexp;
|
|
|
|
// For each part of part list:
|
|
for (const url_pattern_part& part : part_list) {
|
|
// If part's type is "fixed-text":
|
|
if (part.type == url_pattern_part_type::FIXED_TEXT) {
|
|
// If part's modifier is "none"
|
|
if (part.modifier == url_pattern_part_modifier::none) {
|
|
result.append(escape_regexp_string(part.value));
|
|
} else {
|
|
// (?:<fixed text>)<modifier>
|
|
result.append("(?:");
|
|
result.append(escape_regexp_string(part.value));
|
|
result.push_back(')');
|
|
result.append(convert_modifier_to_string(part.modifier));
|
|
}
|
|
continue;
|
|
}
|
|
|
|
// Assert: part's name is not the empty string
|
|
ADA_ASSERT_TRUE(!part.name.empty());
|
|
name_list.push_back(part.name);
|
|
|
|
// Use string_view to avoid copies where possible
|
|
std::string_view regexp_value = part.value;
|
|
|
|
if (part.type == url_pattern_part_type::SEGMENT_WILDCARD) {
|
|
// Lazy generate segment wildcard regexp
|
|
if (segment_wildcard_regexp.empty()) {
|
|
segment_wildcard_regexp = generate_segment_wildcard_regexp(options);
|
|
}
|
|
regexp_value = segment_wildcard_regexp;
|
|
} else if (part.type == url_pattern_part_type::FULL_WILDCARD) {
|
|
regexp_value = ".*";
|
|
}
|
|
|
|
// If part's prefix is the empty string and part's suffix is the empty
|
|
// string
|
|
if (part.prefix.empty() && part.suffix.empty()) {
|
|
// If part's modifier is "none" or "optional"
|
|
if (part.modifier == url_pattern_part_modifier::none ||
|
|
part.modifier == url_pattern_part_modifier::optional) {
|
|
// (<regexp value>)<modifier>
|
|
result.push_back('(');
|
|
result.append(regexp_value);
|
|
result.push_back(')');
|
|
result.append(convert_modifier_to_string(part.modifier));
|
|
} else {
|
|
// ((?:<regexp value>)<modifier>)
|
|
result.append("((?:");
|
|
result.append(regexp_value);
|
|
result.push_back(')');
|
|
result.append(convert_modifier_to_string(part.modifier));
|
|
result.push_back(')');
|
|
}
|
|
continue;
|
|
}
|
|
|
|
// If part's modifier is "none" or "optional"
|
|
if (part.modifier == url_pattern_part_modifier::none ||
|
|
part.modifier == url_pattern_part_modifier::optional) {
|
|
// (?:<prefix>(<regexp value>)<suffix>)<modifier>
|
|
result.append("(?:");
|
|
result.append(escape_regexp_string(part.prefix));
|
|
result.push_back('(');
|
|
result.append(regexp_value);
|
|
result.push_back(')');
|
|
result.append(escape_regexp_string(part.suffix));
|
|
result.push_back(')');
|
|
result.append(convert_modifier_to_string(part.modifier));
|
|
continue;
|
|
}
|
|
|
|
// Assert: part's modifier is "zero-or-more" or "one-or-more"
|
|
ADA_ASSERT_TRUE(part.modifier == url_pattern_part_modifier::zero_or_more ||
|
|
part.modifier == url_pattern_part_modifier::one_or_more);
|
|
|
|
// Assert: part's prefix is not the empty string or part's suffix is not the
|
|
// empty string
|
|
ADA_ASSERT_TRUE(!part.prefix.empty() || !part.suffix.empty());
|
|
|
|
// (?:<prefix>((?:<regexp value>)(?:<suffix><prefix>(?:<regexp
|
|
// value>))*)<suffix>)?
|
|
// Append "(?:" to the end of result.
|
|
result.append("(?:");
|
|
// Append the result of running escape a regexp string given part's prefix
|
|
// to the end of result.
|
|
result.append(escape_regexp_string(part.prefix));
|
|
// Append "((?:" to the end of result.
|
|
result.append("((?:");
|
|
// Append regexp value to the end of result.
|
|
result.append(regexp_value);
|
|
// Append ")(?:" to the end of result.
|
|
result.append(")(?:");
|
|
// Append the result of running escape a regexp string given part's suffix
|
|
// to the end of result.
|
|
result.append(escape_regexp_string(part.suffix));
|
|
// Append the result of running escape a regexp string given part's prefix
|
|
// to the end of result.
|
|
result.append(escape_regexp_string(part.prefix));
|
|
// Append "(?:" to the end of result.
|
|
result.append("(?:");
|
|
// Append regexp value to the end of result.
|
|
result.append(regexp_value);
|
|
// Append "))*)" to the end of result.
|
|
result.append("))*)");
|
|
// Append the result of running escape a regexp string given part's suffix
|
|
// to the end of result.
|
|
result.append(escape_regexp_string(part.suffix));
|
|
// Append ")" to the end of result.
|
|
result.append(")");
|
|
|
|
// If part's modifier is "zero-or-more" then append "?" to the end of result
|
|
if (part.modifier == url_pattern_part_modifier::zero_or_more) {
|
|
result += "?";
|
|
}
|
|
}
|
|
|
|
// Append "$" to the end of result
|
|
result += "$";
|
|
|
|
// Return (result, name list)
|
|
return {std::move(result), std::move(name_list)};
|
|
}
|
|
|
|
bool is_ipv6_address(std::string_view input) noexcept {
|
|
// If input's code point length is less than 2, then return false.
|
|
if (input.size() < 2) return false;
|
|
|
|
// Let input code points be input interpreted as a list of code points.
|
|
// If input code points[0] is U+005B ([), then return true.
|
|
if (input.front() == '[') return true;
|
|
// If input code points[0] is U+007B ({) and input code points[1] is U+005B
|
|
// ([), then return true.
|
|
if (input.starts_with("{[")) return true;
|
|
// If input code points[0] is U+005C (\) and input code points[1] is U+005B
|
|
// ([), then return true.
|
|
return input.starts_with("\\[");
|
|
}
|
|
|
|
std::string_view convert_modifier_to_string(
|
|
url_pattern_part_modifier modifier) {
|
|
switch (modifier) {
|
|
// If modifier is "zero-or-more", then return "*".
|
|
case url_pattern_part_modifier::zero_or_more:
|
|
return "*";
|
|
// If modifier is "optional", then return "?".
|
|
case url_pattern_part_modifier::optional:
|
|
return "?";
|
|
// If modifier is "one-or-more", then return "+".
|
|
case url_pattern_part_modifier::one_or_more:
|
|
return "+";
|
|
// Return the empty string.
|
|
default:
|
|
return "";
|
|
}
|
|
}
|
|
|
|
std::string generate_segment_wildcard_regexp(
|
|
url_pattern_compile_component_options options) {
|
|
// Let result be "[^".
|
|
std::string result = "[^";
|
|
// Append the result of running escape a regexp string given options's
|
|
// delimiter code point to the end of result.
|
|
result.append(escape_regexp_string(options.get_delimiter()));
|
|
// Append "]+?" to the end of result.
|
|
result.append("]+?");
|
|
// Return result.
|
|
ada_log("generate_segment_wildcard_regexp result: ", result);
|
|
return result;
|
|
}
|
|
|
|
namespace {
|
|
// Unified lookup table for URL pattern character classification
|
|
// Bit flags for different character types
|
|
constexpr uint8_t CHAR_SCHEME = 1; // valid in scheme (a-z, A-Z, 0-9, +, -, .)
|
|
constexpr uint8_t CHAR_UPPER = 2; // uppercase letter (needs lowercasing)
|
|
constexpr uint8_t CHAR_SIMPLE_HOSTNAME = 4; // simple hostname (a-z, 0-9, -, .)
|
|
constexpr uint8_t CHAR_SIMPLE_PATHNAME =
|
|
8; // simple pathname (a-z, A-Z, 0-9, /, -, _, ~)
|
|
|
|
constexpr std::array<uint8_t, 256> char_class_table = []() consteval {
|
|
std::array<uint8_t, 256> table{};
|
|
for (int c = 'a'; c <= 'z'; c++)
|
|
table[c] = CHAR_SCHEME | CHAR_SIMPLE_HOSTNAME | CHAR_SIMPLE_PATHNAME;
|
|
for (int c = 'A'; c <= 'Z'; c++)
|
|
table[c] = CHAR_SCHEME | CHAR_UPPER | CHAR_SIMPLE_PATHNAME;
|
|
for (int c = '0'; c <= '9'; c++)
|
|
table[c] = CHAR_SCHEME | CHAR_SIMPLE_HOSTNAME | CHAR_SIMPLE_PATHNAME;
|
|
table['+'] = CHAR_SCHEME;
|
|
table['-'] = CHAR_SCHEME | CHAR_SIMPLE_HOSTNAME | CHAR_SIMPLE_PATHNAME;
|
|
table['.'] =
|
|
CHAR_SCHEME | CHAR_SIMPLE_HOSTNAME; // not pathname (needs normalization)
|
|
table['/'] = CHAR_SIMPLE_PATHNAME;
|
|
table['_'] = CHAR_SIMPLE_PATHNAME;
|
|
table['~'] = CHAR_SIMPLE_PATHNAME;
|
|
return table;
|
|
}();
|
|
} // namespace
|
|
|
|
tl::expected<std::string, errors> canonicalize_protocol(
|
|
std::string_view input) {
|
|
ada_log("canonicalize_protocol called with input=", input);
|
|
if (input.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
|
|
if (input.ends_with(":")) {
|
|
input.remove_suffix(1);
|
|
}
|
|
|
|
// Fast path: special schemes are already canonical
|
|
if (scheme::is_special(input)) {
|
|
return std::string(input);
|
|
}
|
|
|
|
// Fast path: validate scheme chars and check for uppercase
|
|
// First char must be alpha (not +, -, ., or digit)
|
|
uint8_t first_flags = char_class_table[static_cast<uint8_t>(input[0])];
|
|
if (!(first_flags & CHAR_SCHEME) || input[0] == '+' || input[0] == '-' ||
|
|
input[0] == '.' || unicode::is_ascii_digit(input[0])) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
|
|
uint8_t needs_lowercase = first_flags & CHAR_UPPER;
|
|
for (size_t i = 1; i < input.size(); i++) {
|
|
uint8_t flags = char_class_table[static_cast<uint8_t>(input[i])];
|
|
if (!(flags & CHAR_SCHEME)) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
needs_lowercase |= flags & CHAR_UPPER;
|
|
}
|
|
|
|
if (needs_lowercase == 0) {
|
|
return std::string(input);
|
|
}
|
|
|
|
std::string result(input);
|
|
unicode::to_lower_ascii(result.data(), result.size());
|
|
return result;
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_username(
|
|
std::string_view input) {
|
|
// If value is the empty string, return value.
|
|
if (input.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
// Percent-encode the input using the userinfo percent-encode set.
|
|
size_t idx = ada::unicode::percent_encode_index(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE);
|
|
if (idx == input.size()) {
|
|
// No encoding needed, return input as-is
|
|
return std::string(input);
|
|
}
|
|
// Percent-encode from the first character that needs encoding
|
|
return ada::unicode::percent_encode(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE, idx);
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_password(
|
|
std::string_view input) {
|
|
// If value is the empty string, return value.
|
|
if (input.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
// Percent-encode the input using the userinfo percent-encode set.
|
|
size_t idx = ada::unicode::percent_encode_index(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE);
|
|
if (idx == input.size()) {
|
|
// No encoding needed, return input as-is
|
|
return std::string(input);
|
|
}
|
|
// Percent-encode from the first character that needs encoding
|
|
return ada::unicode::percent_encode(
|
|
input, character_sets::USERINFO_PERCENT_ENCODE, idx);
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_hostname(
|
|
std::string_view input) {
|
|
ada_log("canonicalize_hostname input=", input);
|
|
if (input.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
|
|
// Fast path: simple hostnames (lowercase ASCII, digits, -, .) need no IDNA.
|
|
// The simple character set also covers IPv4-shaped hosts, which the slow
|
|
// path rewrites ("0" -> "0.0.0.0", "0x7f.1" -> "127.0.0.1"). Exclude those
|
|
// so the fast path can't return a non-canonical hostname.
|
|
//
|
|
// Pure-ASCII "xn--" labels are intentionally left on the fast path: with
|
|
// beStrict=false, domain-to-ASCII returns the lowercased ASCII input even
|
|
// when Unicode ToASCII would fail (e.g. invalid ACE "xn--a"). See
|
|
// https://url.spec.whatwg.org/#concept-domain-to-ascii
|
|
bool needs_processing = false;
|
|
for (char c : input) {
|
|
needs_processing |=
|
|
!(char_class_table[static_cast<uint8_t>(c)] & CHAR_SIMPLE_HOSTNAME);
|
|
}
|
|
if (!needs_processing && !checkers::is_ipv4(input)) {
|
|
return std::string(input);
|
|
}
|
|
|
|
// Let dummyURL be a new URL record.
|
|
// Let parseResult be the result of running the basic URL parser given value
|
|
// with dummyURL as url and hostname state as state override.
|
|
|
|
// IMPORTANT: The protocol needs to be a special protocol, otherwise the
|
|
// hostname will not be converted using IDNA.
|
|
auto url = ada::parse<url_aggregator>("https://dummy.test", nullptr);
|
|
ADA_ASSERT_TRUE(url);
|
|
// if (!isValidHostnameInput(hostname)) return kj::none;
|
|
if (!url->set_hostname(input)) {
|
|
// If parseResult is failure, then throw a TypeError.
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
// Return dummyURL's host, serialized, or empty string if it is null.
|
|
return std::string(url->get_hostname());
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_ipv6_hostname(
|
|
std::string_view input) {
|
|
ada_log("canonicalize_ipv6_hostname input=", input);
|
|
// TODO: Optimization opportunity: Use lookup table to speed up checking
|
|
if (std::ranges::any_of(input, [](char c) {
|
|
return c != '[' && c != ']' && c != ':' &&
|
|
!unicode::is_ascii_hex_digit(c);
|
|
})) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
// Append the result of running ASCII lowercase given code point to the end of
|
|
// result.
|
|
auto hostname = std::string(input);
|
|
unicode::to_lower_ascii(hostname.data(), hostname.size());
|
|
return hostname;
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_port(
|
|
std::string_view port_value) {
|
|
// If portValue is the empty string, return portValue.
|
|
if (port_value.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
|
|
// Remove ASCII tab or newline characters
|
|
std::string trimmed(port_value);
|
|
helpers::remove_ascii_tab_or_newline(trimmed);
|
|
|
|
if (trimmed.empty()) {
|
|
return "";
|
|
}
|
|
|
|
// Input should start with a digit character
|
|
if (!unicode::is_ascii_digit(trimmed.front())) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
|
|
// Find the first non-digit character
|
|
auto first_non_digit =
|
|
std::ranges::find_if_not(trimmed, unicode::is_ascii_digit);
|
|
std::string_view digits_to_parse =
|
|
std::string_view(trimmed.data(), first_non_digit - trimmed.begin());
|
|
|
|
// Here we have a range of ASCII digit characters identified by
|
|
// digits_to_parse. It is non-empty. The port state of the URL parser reads
|
|
// it as an integer, so leading zeros are part of the number: "0080" is 80
|
|
// and "065535" is 65535, not a six-digit overflow. Only the significant
|
|
// digits count toward the 5-digit maximum, matching the fast path in
|
|
// implementation.cpp.
|
|
size_t first_significant = digits_to_parse.find_first_not_of('0');
|
|
if (first_significant == std::string_view::npos) {
|
|
// The value is all zeros, i.e. port 0.
|
|
return "0";
|
|
}
|
|
digits_to_parse.remove_prefix(first_significant);
|
|
// We want to determine whether it is a valid port number (0-65535).
|
|
// Clearly, if the length is greater than 5, it is invalid.
|
|
// If the length is 5, we need to compare lexicographically to "65535".
|
|
// Otherwise it is valid.
|
|
if (digits_to_parse.size() == 5) {
|
|
if (digits_to_parse > "65535") {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
} else if (digits_to_parse.size() > 5) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
// It is valid! Most times, we do not need to parse it into an integer.
|
|
return std::string(digits_to_parse);
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_port_with_protocol(
|
|
std::string_view port_value, std::string_view protocol) {
|
|
// If portValue is the empty string, return portValue.
|
|
if (port_value.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
|
|
// Handle empty or trailing colon in protocol
|
|
if (protocol.empty()) {
|
|
protocol = "fake";
|
|
} else if (protocol.ends_with(":")) {
|
|
protocol.remove_suffix(1);
|
|
}
|
|
|
|
// Remove ASCII tab or newline characters
|
|
std::string trimmed(port_value);
|
|
helpers::remove_ascii_tab_or_newline(trimmed);
|
|
|
|
if (trimmed.empty()) {
|
|
return "";
|
|
}
|
|
|
|
// Input should start with a digit character
|
|
if (!unicode::is_ascii_digit(trimmed.front())) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
|
|
// Find the first non-digit character
|
|
auto first_non_digit =
|
|
std::ranges::find_if_not(trimmed, unicode::is_ascii_digit);
|
|
std::string_view digits_to_parse =
|
|
std::string_view(trimmed.data(), first_non_digit - trimmed.begin());
|
|
|
|
// Parse the port number
|
|
uint16_t parsed_port{};
|
|
// NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
|
|
auto result = std::from_chars(digits_to_parse.data(),
|
|
digits_to_parse.data() + digits_to_parse.size(),
|
|
parsed_port);
|
|
|
|
if (result.ec == std::errc::result_out_of_range) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
|
|
if (result.ec == std::errc()) {
|
|
// Check if this is the default port for the scheme
|
|
uint16_t default_port = scheme::get_special_port(protocol);
|
|
|
|
// If it's the default port for a special scheme, return empty string
|
|
if (default_port != 0 && default_port == parsed_port) {
|
|
return "";
|
|
}
|
|
|
|
// Successfully parsed, return as string
|
|
return std::to_string(parsed_port);
|
|
}
|
|
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_pathname(
|
|
std::string_view input) {
|
|
if (input.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
|
|
// Fast path: simple pathnames (no . which needs normalization) can be
|
|
// returned as-is
|
|
bool needs_processing = false;
|
|
for (char c : input) {
|
|
needs_processing |=
|
|
!(char_class_table[static_cast<uint8_t>(c)] & CHAR_SIMPLE_PATHNAME);
|
|
}
|
|
if (!needs_processing) {
|
|
return std::string(input);
|
|
}
|
|
|
|
// Let leading slash be true if the first code point in value is U+002F (/)
|
|
// and otherwise false.
|
|
const bool leading_slash = input.starts_with("/");
|
|
// Let modified value be "/-" if leading slash is false and otherwise the
|
|
// empty string.
|
|
const auto modified_value =
|
|
(leading_slash ? std::string() : std::string("/-")) + std::string(input);
|
|
// The spec runs the basic URL parser with the path in state override, where
|
|
// '?' and '#' are ordinary path code points (percent-encoded) and leading or
|
|
// trailing C0 control or space is kept. Building a full URL string and
|
|
// parsing it (no state override) instead let '?' and '#' start the
|
|
// query/fragment, so the pathname was silently truncated at the first literal
|
|
// '?' or '#'. set_pathname runs the parser in path state override, matching
|
|
// how canonicalize_hostname uses set_hostname.
|
|
auto url = ada::parse<url_aggregator>("fake://fake-url", nullptr);
|
|
ADA_ASSERT_TRUE(url);
|
|
if (!url->set_pathname(modified_value)) {
|
|
// If parseResult is failure, then throw a TypeError.
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
const auto pathname = url->get_pathname();
|
|
// If leading slash is false, then set result to the code point substring
|
|
// from 2 to the end of the string within result.
|
|
if (!leading_slash) {
|
|
// pathname should start with "/-" but path traversal (e.g. "../../")
|
|
// can reduce it to just "/" which is shorter than 2 characters.
|
|
if (pathname.size() < 2) {
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
return std::string(pathname.substr(2));
|
|
}
|
|
return std::string(pathname);
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_opaque_pathname(
|
|
std::string_view input) {
|
|
// If value is the empty string, return value.
|
|
if (input.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
// Let dummyURL be a new URL record.
|
|
// Set dummyURL's path to the empty string.
|
|
// Let parseResult be the result of running URL parsing given value with
|
|
// dummyURL as url and opaque path state as state override.
|
|
if (auto url =
|
|
ada::parse<url_aggregator>("fake:" + std::string(input), nullptr)) {
|
|
// Return the result of URL path serializing dummyURL.
|
|
return std::string(url->get_pathname());
|
|
}
|
|
// If parseResult is failure, then throw a TypeError.
|
|
return tl::unexpected(errors::type_error);
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_search(std::string_view input) {
|
|
// If value is the empty string, return value.
|
|
if (input.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
// A leading '?' is a valid query code point here: it is the caller (process a
|
|
// search) that removes a single delimiter, not this step, which mirrors the
|
|
// basic URL parser's query state.
|
|
std::string new_value(input);
|
|
// Remove ASCII tab or newline characters
|
|
helpers::remove_ascii_tab_or_newline(new_value);
|
|
|
|
if (new_value.empty()) {
|
|
return "";
|
|
}
|
|
|
|
// Percent-encode using QUERY_PERCENT_ENCODE (for non-special URLs)
|
|
// Note: "fake://dummy.test" is not a special URL, so we use
|
|
// QUERY_PERCENT_ENCODE
|
|
size_t idx = ada::unicode::percent_encode_index(
|
|
new_value, character_sets::QUERY_PERCENT_ENCODE);
|
|
if (idx == new_value.size()) {
|
|
// No encoding needed
|
|
return new_value;
|
|
}
|
|
// Percent-encode from the first character that needs encoding
|
|
return ada::unicode::percent_encode(
|
|
new_value, character_sets::QUERY_PERCENT_ENCODE, idx);
|
|
}
|
|
|
|
tl::expected<std::string, errors> canonicalize_hash(std::string_view input) {
|
|
// If value is the empty string, return value.
|
|
if (input.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
// A leading '#' is a valid fragment code point here: it is the caller
|
|
// (process a hash) that removes a single delimiter, not this step, which
|
|
// mirrors the basic URL parser's fragment state.
|
|
std::string new_value(input);
|
|
// Remove ASCII tab or newline characters
|
|
helpers::remove_ascii_tab_or_newline(new_value);
|
|
|
|
if (new_value.empty()) {
|
|
return "";
|
|
}
|
|
|
|
// Percent-encode using FRAGMENT_PERCENT_ENCODE
|
|
size_t idx = ada::unicode::percent_encode_index(
|
|
new_value, character_sets::FRAGMENT_PERCENT_ENCODE);
|
|
if (idx == new_value.size()) {
|
|
// No encoding needed
|
|
return new_value;
|
|
}
|
|
// Percent-encode from the first character that needs encoding
|
|
return ada::unicode::percent_encode(
|
|
new_value, character_sets::FRAGMENT_PERCENT_ENCODE, idx);
|
|
}
|
|
|
|
tl::expected<std::vector<token>, errors> tokenize(std::string_view input,
|
|
token_policy policy) {
|
|
ada_log("tokenize input: ", input);
|
|
// Let tokenizer be a new tokenizer.
|
|
// Set tokenizer's input to input.
|
|
// Set tokenizer's policy to policy.
|
|
auto tokenizer = Tokenizer(input, policy);
|
|
// While tokenizer's index is less than tokenizer's input's code point length:
|
|
while (tokenizer.index < tokenizer.input.size()) {
|
|
// Run seek and get the next code point given tokenizer and tokenizer's
|
|
// index.
|
|
tokenizer.seek_and_get_next_code_point(tokenizer.index);
|
|
|
|
// Malformed UTF-8 must not stall tokenization: report an invalid-char
|
|
// token (lenient) or fail fast (strict), while always making progress.
|
|
if (tokenizer.had_invalid_code_point()) {
|
|
if (auto error = tokenizer.process_tokenizing_error(tokenizer.next_index,
|
|
tokenizer.index)) {
|
|
return tl::unexpected(*error);
|
|
}
|
|
continue;
|
|
}
|
|
|
|
// If tokenizer's code point is U+002A (*):
|
|
if (tokenizer.code_point == '*') {
|
|
// Run add a token with default position and length given tokenizer and
|
|
// "asterisk".
|
|
tokenizer.add_token_with_defaults(token_type::ASTERISK);
|
|
ada_log("add ASTERISK token");
|
|
// Continue.
|
|
continue;
|
|
}
|
|
|
|
// If tokenizer's code point is U+002B (+) or U+003F (?):
|
|
if (tokenizer.code_point == '+' || tokenizer.code_point == '?') {
|
|
// Run add a token with default position and length given tokenizer and
|
|
// "other-modifier".
|
|
tokenizer.add_token_with_defaults(token_type::OTHER_MODIFIER);
|
|
// Continue.
|
|
continue;
|
|
}
|
|
|
|
// If tokenizer's code point is U+005C (\):
|
|
if (tokenizer.code_point == '\\') {
|
|
// If tokenizer's index is equal to tokenizer's input's code point length
|
|
// - 1:
|
|
if (tokenizer.index == tokenizer.input.size() - 1) {
|
|
// Run process a tokenizing error given tokenizer, tokenizer's next
|
|
// index, and tokenizer's index.
|
|
if (auto error = tokenizer.process_tokenizing_error(
|
|
tokenizer.next_index, tokenizer.index)) {
|
|
ada_log("process_tokenizing_error failed");
|
|
return tl::unexpected(*error);
|
|
}
|
|
continue;
|
|
}
|
|
|
|
// Let escaped index be tokenizer's next index.
|
|
auto escaped_index = tokenizer.next_index;
|
|
// Run get the next code point given tokenizer.
|
|
tokenizer.get_next_code_point();
|
|
if (tokenizer.had_invalid_code_point()) {
|
|
if (auto error = tokenizer.process_tokenizing_error(
|
|
tokenizer.next_index, escaped_index)) {
|
|
return tl::unexpected(*error);
|
|
}
|
|
continue;
|
|
}
|
|
// Run add a token with default length given tokenizer, "escaped-char",
|
|
// tokenizer's next index, and escaped index.
|
|
tokenizer.add_token_with_default_length(
|
|
token_type::ESCAPED_CHAR, tokenizer.next_index, escaped_index);
|
|
ada_log("add ESCAPED_CHAR token on next_index ", tokenizer.next_index,
|
|
" with escaped index ", escaped_index);
|
|
// Continue.
|
|
continue;
|
|
}
|
|
|
|
// If tokenizer's code point is U+007B ({):
|
|
if (tokenizer.code_point == '{') {
|
|
// Run add a token with default position and length given tokenizer and
|
|
// "open".
|
|
tokenizer.add_token_with_defaults(token_type::OPEN);
|
|
ada_log("add OPEN token");
|
|
continue;
|
|
}
|
|
|
|
// If tokenizer's code point is U+007D (}):
|
|
if (tokenizer.code_point == '}') {
|
|
// Run add a token with default position and length given tokenizer and
|
|
// "close".
|
|
tokenizer.add_token_with_defaults(token_type::CLOSE);
|
|
ada_log("add CLOSE token");
|
|
continue;
|
|
}
|
|
|
|
// If tokenizer's code point is U+003A (:):
|
|
if (tokenizer.code_point == ':') {
|
|
// Let name position be tokenizer's next index.
|
|
auto name_position = tokenizer.next_index;
|
|
// Let name start be name position.
|
|
auto name_start = name_position;
|
|
bool invalid_name = false;
|
|
// While name position is less than tokenizer's input's code point length:
|
|
while (name_position < tokenizer.input.size()) {
|
|
// Run seek and get the next code point given tokenizer and name
|
|
// position.
|
|
tokenizer.seek_and_get_next_code_point(name_position);
|
|
if (tokenizer.had_invalid_code_point()) {
|
|
if (auto error = tokenizer.process_tokenizing_error(
|
|
tokenizer.next_index, name_position)) {
|
|
return tl::unexpected(*error);
|
|
}
|
|
invalid_name = true;
|
|
break;
|
|
}
|
|
// Let first code point be true if name position equals name start and
|
|
// false otherwise.
|
|
bool first_code_point = name_position == name_start;
|
|
// Let valid code point be the result of running is a valid name code
|
|
// point given tokenizer's code point and first code point.
|
|
auto valid_code_point =
|
|
idna::valid_name_code_point(tokenizer.code_point, first_code_point);
|
|
ada_log("tokenizer.code_point=", uint32_t(tokenizer.code_point),
|
|
" first_code_point=", first_code_point,
|
|
" valid_code_point=", valid_code_point);
|
|
// If valid code point is false break.
|
|
if (!valid_code_point) break;
|
|
// Set name position to tokenizer's next index.
|
|
name_position = tokenizer.next_index;
|
|
}
|
|
|
|
if (invalid_name) {
|
|
continue;
|
|
}
|
|
|
|
// If name position is less than or equal to name start:
|
|
if (name_position <= name_start) {
|
|
// Run process a tokenizing error given tokenizer, name start, and
|
|
// tokenizer's index.
|
|
if (auto error = tokenizer.process_tokenizing_error(name_start,
|
|
tokenizer.index)) {
|
|
ada_log("process_tokenizing_error failed");
|
|
return tl::unexpected(*error);
|
|
}
|
|
// Continue
|
|
continue;
|
|
}
|
|
|
|
// Run add a token with default length given tokenizer, "name", name
|
|
// position, and name start.
|
|
tokenizer.add_token_with_default_length(token_type::NAME, name_position,
|
|
name_start);
|
|
continue;
|
|
}
|
|
|
|
// If tokenizer's code point is U+0028 (():
|
|
if (tokenizer.code_point == '(') {
|
|
// Let depth be 1.
|
|
size_t depth = 1;
|
|
// Let regexp position be tokenizer's next index.
|
|
auto regexp_position = tokenizer.next_index;
|
|
// Let regexp start be regexp position.
|
|
auto regexp_start = regexp_position;
|
|
// Let error be false.
|
|
bool error = false;
|
|
|
|
// While regexp position is less than tokenizer's input's code point
|
|
// length:
|
|
while (regexp_position < tokenizer.input.size()) {
|
|
// Run seek and get the next code point given tokenizer and regexp
|
|
// position.
|
|
tokenizer.seek_and_get_next_code_point(regexp_position);
|
|
if (tokenizer.had_invalid_code_point()) {
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
tokenizer.next_index, regexp_position)) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
error = true;
|
|
break;
|
|
}
|
|
|
|
// TODO: Optimization opportunity: The next 2 if statements can be
|
|
// merged. If the result of running is ASCII given tokenizer's code
|
|
// point is false:
|
|
if (!unicode::is_ascii(tokenizer.code_point)) {
|
|
// Run process a tokenizing error given tokenizer, regexp start, and
|
|
// tokenizer's index.
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
regexp_start, tokenizer.index)) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
// Set error to true.
|
|
error = true;
|
|
break;
|
|
}
|
|
|
|
// If regexp position equals regexp start and tokenizer's code point is
|
|
// U+003F (?):
|
|
if (regexp_position == regexp_start && tokenizer.code_point == '?') {
|
|
// Run process a tokenizing error given tokenizer, regexp start, and
|
|
// tokenizer's index.
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
regexp_start, tokenizer.index)) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
// Set error to true;
|
|
error = true;
|
|
break;
|
|
}
|
|
|
|
// If tokenizer's code point is U+005C (\):
|
|
if (tokenizer.code_point == '\\') {
|
|
// If regexp position equals tokenizer's input's code point length - 1
|
|
if (regexp_position == tokenizer.input.size() - 1) {
|
|
// Run process a tokenizing error given tokenizer, regexp start, and
|
|
// tokenizer's index.
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
regexp_start, tokenizer.index)) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
// Set error to true.
|
|
error = true;
|
|
break;
|
|
}
|
|
// Run get the next code point given tokenizer.
|
|
auto escaped_index = tokenizer.next_index;
|
|
tokenizer.get_next_code_point();
|
|
if (tokenizer.had_invalid_code_point()) {
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
tokenizer.next_index, escaped_index)) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
error = true;
|
|
break;
|
|
}
|
|
// If the result of running is ASCII given tokenizer's code point is
|
|
// false:
|
|
if (!unicode::is_ascii(tokenizer.code_point)) {
|
|
// Run process a tokenizing error given tokenizer, regexp start, and
|
|
// tokenizer's index.
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
regexp_start, tokenizer.index);
|
|
process_error.has_value()) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
// Set error to true.
|
|
error = true;
|
|
break;
|
|
}
|
|
// Set regexp position to tokenizer's next index.
|
|
regexp_position = tokenizer.next_index;
|
|
continue;
|
|
}
|
|
|
|
// If tokenizer's code point is U+0029 ()):
|
|
if (tokenizer.code_point == ')') {
|
|
// Decrement depth by 1.
|
|
depth--;
|
|
// If depth is 0:
|
|
if (depth == 0) {
|
|
// Set regexp position to tokenizer's next index.
|
|
regexp_position = tokenizer.next_index;
|
|
// Break.
|
|
break;
|
|
}
|
|
} else if (tokenizer.code_point == '(') {
|
|
// Otherwise if tokenizer's code point is U+0028 (():
|
|
// Increment depth by 1.
|
|
depth++;
|
|
// If regexp position equals tokenizer's input's code point length -
|
|
// 1:
|
|
if (regexp_position == tokenizer.input.size() - 1) {
|
|
// Run process a tokenizing error given tokenizer, regexp start, and
|
|
// tokenizer's index.
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
regexp_start, tokenizer.index)) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
// Set error to true.
|
|
error = true;
|
|
break;
|
|
}
|
|
// Let temporary position be tokenizer's next index.
|
|
auto temporary_position = tokenizer.next_index;
|
|
// Run get the next code point given tokenizer.
|
|
tokenizer.get_next_code_point();
|
|
if (tokenizer.had_invalid_code_point()) {
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
tokenizer.next_index, temporary_position)) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
error = true;
|
|
break;
|
|
}
|
|
// If tokenizer's code point is not U+003F (?):
|
|
if (tokenizer.code_point != '?') {
|
|
// Run process a tokenizing error given tokenizer, regexp start, and
|
|
// tokenizer's index.
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
regexp_start, tokenizer.index)) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
// Set error to true.
|
|
error = true;
|
|
break;
|
|
}
|
|
// Set tokenizer's next index to temporary position.
|
|
tokenizer.next_index = temporary_position;
|
|
}
|
|
// Set regexp position to tokenizer's next index.
|
|
regexp_position = tokenizer.next_index;
|
|
}
|
|
|
|
// If error is true continue.
|
|
if (error) continue;
|
|
// If depth is not zero:
|
|
if (depth != 0) {
|
|
// Run process a tokenizing error given tokenizer, regexp start, and
|
|
// tokenizer's index.
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
regexp_start, tokenizer.index)) {
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
continue;
|
|
}
|
|
// Let regexp length be regexp position - regexp start - 1.
|
|
auto regexp_length = regexp_position - regexp_start - 1;
|
|
// If regexp length is zero:
|
|
if (regexp_length == 0) {
|
|
// Run process a tokenizing error given tokenizer, regexp start, and
|
|
// tokenizer's index.
|
|
if (auto process_error = tokenizer.process_tokenizing_error(
|
|
regexp_start, tokenizer.index)) {
|
|
ada_log("process_tokenizing_error failed");
|
|
return tl::unexpected(*process_error);
|
|
}
|
|
continue;
|
|
}
|
|
// Run add a token given tokenizer, "regexp", regexp position, regexp
|
|
// start, and regexp length.
|
|
tokenizer.add_token(token_type::REGEXP, regexp_position, regexp_start,
|
|
regexp_length);
|
|
continue;
|
|
}
|
|
// Run add a token with default position and length given tokenizer and
|
|
// "char".
|
|
tokenizer.add_token_with_defaults(token_type::CHAR);
|
|
}
|
|
// Run add a token with default length given tokenizer, "end", tokenizer's
|
|
// index, and tokenizer's index.
|
|
tokenizer.add_token_with_default_length(token_type::END, tokenizer.index,
|
|
tokenizer.index);
|
|
|
|
ada_log("tokenizer.token_list size is: ", tokenizer.token_list.size());
|
|
// Return tokenizer's token list.
|
|
return tokenizer.token_list;
|
|
}
|
|
|
|
namespace {
|
|
constexpr std::array<uint8_t, 256> escape_pattern_table = []() consteval {
|
|
std::array<uint8_t, 256> out{};
|
|
for (auto& c : {'+', '*', '?', ':', '{', '}', '(', ')', '\\'}) {
|
|
out[c] = 1;
|
|
}
|
|
return out;
|
|
}();
|
|
|
|
constexpr bool should_escape_pattern_char(char c) {
|
|
return escape_pattern_table[static_cast<uint8_t>(c)];
|
|
}
|
|
} // namespace
|
|
|
|
std::string escape_pattern_string(std::string_view input) {
|
|
ada_log("escape_pattern_string called with input=", input);
|
|
if (input.empty()) [[unlikely]] {
|
|
return "";
|
|
}
|
|
// Assert: input is an ASCII string.
|
|
ADA_ASSERT_TRUE(ada::idna::is_ascii(input));
|
|
// Let result be the empty string.
|
|
std::string result{};
|
|
// Reserve extra space for potential escapes
|
|
result.reserve(input.size() * 2);
|
|
|
|
// While index is less than input's length:
|
|
for (const char c : input) {
|
|
if (should_escape_pattern_char(c)) {
|
|
// Append U+005C (\) to the end of result.
|
|
result.push_back('\\');
|
|
}
|
|
// Append c to the end of result.
|
|
result.push_back(c);
|
|
}
|
|
// Return result.
|
|
return result;
|
|
}
|
|
|
|
namespace {
|
|
constexpr std::array<uint8_t, 256> escape_regexp_table = []() consteval {
|
|
std::array<uint8_t, 256> out{};
|
|
for (auto& c : {'.', '+', '*', '?', '^', '$', '{', '}', '(', ')', '[', ']',
|
|
'|', '/', '\\'}) {
|
|
out[c] = 1;
|
|
}
|
|
return out;
|
|
}();
|
|
|
|
constexpr bool should_escape_regexp_char(char c) {
|
|
return escape_regexp_table[(uint8_t)c];
|
|
}
|
|
} // namespace
|
|
|
|
std::string escape_regexp_string(std::string_view input) {
|
|
// Assert: input is an ASCII string.
|
|
ADA_ASSERT_TRUE(idna::is_ascii(input));
|
|
// Let result be the empty string.
|
|
std::string result{};
|
|
// Reserve extra space for potential escapes (worst case: all chars escaped)
|
|
result.reserve(input.size() * 2);
|
|
for (const char c : input) {
|
|
if (should_escape_regexp_char(c)) {
|
|
// Avoid temporary string allocation - directly append characters
|
|
result.push_back('\\');
|
|
result.push_back(c);
|
|
} else {
|
|
result.push_back(c);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
std::string process_base_url_string(std::string_view input,
|
|
url_pattern_init::process_type type) {
|
|
// If type is not "pattern" return input.
|
|
if (type != url_pattern_init::process_type::pattern) {
|
|
return std::string(input);
|
|
}
|
|
// Return the result of escaping a pattern string given input.
|
|
return escape_pattern_string(input);
|
|
}
|
|
|
|
constexpr bool is_absolute_pathname(
|
|
std::string_view input, url_pattern_init::process_type type) noexcept {
|
|
// If input is the empty string, then return false.
|
|
if (input.empty()) [[unlikely]] {
|
|
return false;
|
|
}
|
|
// If input[0] is U+002F (/), then return true.
|
|
if (input.starts_with("/")) return true;
|
|
// If type is "url", then return false.
|
|
if (type == url_pattern_init::process_type::url) return false;
|
|
// If input's code point length is less than 2, then return false.
|
|
if (input.size() < 2) return false;
|
|
// If input[0] is U+005C (\) and input[1] is U+002F (/), then return true.
|
|
// If input[0] is U+007B ({) and input[1] is U+002F (/), then return true.
|
|
// Return false.
|
|
return input[1] == '/' && (input[0] == '\\' || input[0] == '{');
|
|
}
|
|
|
|
std::string generate_pattern_string(
|
|
std::vector<url_pattern_part>& part_list,
|
|
url_pattern_compile_component_options& options) {
|
|
// Let result be the empty string.
|
|
std::string result{};
|
|
// Let index list be the result of getting the indices for part list.
|
|
// For each index of index list:
|
|
for (size_t index = 0; index < part_list.size(); index++) {
|
|
// Let part be part list[index].
|
|
// Use reference to avoid copy
|
|
const auto& part = part_list[index];
|
|
// Let previous part be part list[index - 1] if index is greater than 0,
|
|
// otherwise let it be null.
|
|
// Use pointer to avoid copy
|
|
const url_pattern_part* previous_part =
|
|
index == 0 ? nullptr : &part_list[index - 1];
|
|
// Let next part be part list[index + 1] if index is less than index list's
|
|
// size - 1, otherwise let it be null.
|
|
const url_pattern_part* next_part =
|
|
index < part_list.size() - 1 ? &part_list[index + 1] : nullptr;
|
|
// If part's type is "fixed-text" then:
|
|
if (part.type == url_pattern_part_type::FIXED_TEXT) {
|
|
// If part's modifier is "none" then:
|
|
if (part.modifier == url_pattern_part_modifier::none) {
|
|
// Append the result of running escape a pattern string given part's
|
|
// value to the end of result.
|
|
result.append(escape_pattern_string(part.value));
|
|
continue;
|
|
}
|
|
// Append "{" to the end of result.
|
|
result += "{";
|
|
// Append the result of running escape a pattern string given part's value
|
|
// to the end of result.
|
|
result.append(escape_pattern_string(part.value));
|
|
// Append "}" to the end of result.
|
|
result += "}";
|
|
// Append the result of running convert a modifier to a string given
|
|
// part's modifier to the end of result.
|
|
result.append(convert_modifier_to_string(part.modifier));
|
|
continue;
|
|
}
|
|
// Let custom name be true if part's name[0] is not an ASCII digit;
|
|
// otherwise false.
|
|
bool custom_name = !unicode::is_ascii_digit(part.name[0]);
|
|
// Let needs grouping be true if at least one of the following are true,
|
|
// otherwise let it be false:
|
|
// - part's suffix is not the empty string.
|
|
// - part's prefix is not the empty string and is not options's prefix code
|
|
// point.
|
|
bool needs_grouping =
|
|
!part.suffix.empty() ||
|
|
(!part.prefix.empty() && (options.get_prefix().empty() ||
|
|
part.prefix[0] != options.get_prefix()[0]));
|
|
|
|
// If all of the following are true:
|
|
// - needs grouping is false; and
|
|
// - custom name is true; and
|
|
// - part's type is "segment-wildcard"; and
|
|
// - part's modifier is "none"; and
|
|
// - next part is not null; and
|
|
// - next part's prefix is the empty string; and
|
|
// - next part's suffix is the empty string
|
|
if (!needs_grouping && custom_name &&
|
|
part.type == url_pattern_part_type::SEGMENT_WILDCARD &&
|
|
part.modifier == url_pattern_part_modifier::none && next_part &&
|
|
next_part->prefix.empty() && next_part->suffix.empty()) {
|
|
// If next part's type is "fixed-text":
|
|
if (next_part->type == url_pattern_part_type::FIXED_TEXT) {
|
|
// Set needs grouping to true if the result of running is a valid name
|
|
// code point given next part's value's first code point and the boolean
|
|
// false is true.
|
|
if (idna::valid_name_code_point(next_part->value[0], false)) {
|
|
needs_grouping = true;
|
|
}
|
|
} else {
|
|
// Set needs grouping to true if next part's name[0] is an ASCII digit.
|
|
needs_grouping = !next_part->name.empty() &&
|
|
unicode::is_ascii_digit(next_part->name[0]);
|
|
}
|
|
}
|
|
|
|
// If all of the following are true:
|
|
// - needs grouping is false; and
|
|
// - part's prefix is the empty string; and
|
|
// - previous part is not null; and
|
|
// - previous part's type is "fixed-text"; and
|
|
// - previous part's value's last code point is options's prefix code point.
|
|
// then set needs grouping to true.
|
|
if (!needs_grouping && part.prefix.empty() && previous_part &&
|
|
previous_part->type == url_pattern_part_type::FIXED_TEXT &&
|
|
!previous_part->value.empty() && !options.get_prefix().empty() &&
|
|
previous_part->value.back() == options.get_prefix()[0]) {
|
|
needs_grouping = true;
|
|
}
|
|
|
|
// Assert: part's name is not the empty string or null.
|
|
ADA_ASSERT_TRUE(!part.name.empty());
|
|
|
|
// If needs grouping is true, then append "{" to the end of result.
|
|
if (needs_grouping) {
|
|
result.append("{");
|
|
}
|
|
|
|
// Append the result of running escape a pattern string given part's prefix
|
|
// to the end of result.
|
|
result.append(escape_pattern_string(part.prefix));
|
|
|
|
// If custom name is true:
|
|
if (custom_name) {
|
|
// Append ":" to the end of result.
|
|
result.append(":");
|
|
// Append part's name to the end of result.
|
|
result.append(part.name);
|
|
}
|
|
|
|
// If part's type is "regexp" then:
|
|
if (part.type == url_pattern_part_type::REGEXP) {
|
|
// Append "(" to the end of result.
|
|
result.append("(");
|
|
// Append part's value to the end of result.
|
|
result.append(part.value);
|
|
// Append ")" to the end of result.
|
|
result.append(")");
|
|
} else if (part.type == url_pattern_part_type::SEGMENT_WILDCARD &&
|
|
!custom_name) {
|
|
// Otherwise if part's type is "segment-wildcard" and custom name is
|
|
// false: Append "(" to the end of result.
|
|
result.append("(");
|
|
// Append the result of running generate a segment wildcard regexp given
|
|
// options to the end of result.
|
|
result.append(generate_segment_wildcard_regexp(options));
|
|
// Append ")" to the end of result.
|
|
result.append(")");
|
|
} else if (part.type == url_pattern_part_type::FULL_WILDCARD) {
|
|
// Otherwise if part's type is "full-wildcard":
|
|
// If custom name is false and one of the following is true:
|
|
// - previous part is null; or
|
|
// - previous part's type is "fixed-text"; or
|
|
// - previous part's modifier is not "none"; or
|
|
// - needs grouping is true; or
|
|
// - part's prefix is not the empty string
|
|
// - then append "*" to the end of result.
|
|
if (!custom_name &&
|
|
(!previous_part ||
|
|
previous_part->type == url_pattern_part_type::FIXED_TEXT ||
|
|
previous_part->modifier != url_pattern_part_modifier::none ||
|
|
needs_grouping || !part.prefix.empty())) {
|
|
result.append("*");
|
|
} else {
|
|
// Append "(" to the end of result.
|
|
// Append full wildcard regexp value to the end of result.
|
|
// Append ")" to the end of result.
|
|
result.append("(.*)");
|
|
}
|
|
}
|
|
|
|
// If all of the following are true:
|
|
// - part's type is "segment-wildcard"; and
|
|
// - custom name is true; and
|
|
// - part's suffix is not the empty string; and
|
|
// - The result of running is a valid name code point given part's suffix's
|
|
// first code point and the boolean false is true then append U+005C (\) to
|
|
// the end of result.
|
|
if (part.type == url_pattern_part_type::SEGMENT_WILDCARD && custom_name &&
|
|
!part.suffix.empty() &&
|
|
idna::valid_name_code_point(part.suffix[0], false)) {
|
|
result.append("\\");
|
|
}
|
|
|
|
// Append the result of running escape a pattern string given part's suffix
|
|
// to the end of result.
|
|
result.append(escape_pattern_string(part.suffix));
|
|
// If needs grouping is true, then append "}" to the end of result.
|
|
if (needs_grouping) result.append("}");
|
|
// Append the result of running convert a modifier to a string given part's
|
|
// modifier to the end of result.
|
|
result.append(convert_modifier_to_string(part.modifier));
|
|
}
|
|
// Return result.
|
|
return result;
|
|
}
|
|
} // namespace ada::url_pattern_helpers
|
|
|
|
#endif // ADA_INCLUDE_URL_PATTERN
|
|
/* end file src/url_pattern_helpers.cpp */
|
|
/* begin file src/url_pattern_regex.cpp */
|
|
#if ADA_INCLUDE_URL_PATTERN
|
|
|
|
|
|
namespace ada::url_pattern_regex {
|
|
|
|
#ifdef ADA_USE_UNSAFE_STD_REGEX_PROVIDER
|
|
std::optional<std::regex> std_regex_provider::create_instance(
|
|
std::string_view pattern, bool ignore_case) {
|
|
// Let flags be an empty string.
|
|
// If options's ignore case is true then set flags to "vi".
|
|
// Otherwise set flags to "v"
|
|
auto flags = ignore_case
|
|
? std::regex::icase | std::regex_constants::ECMAScript
|
|
: std::regex_constants::ECMAScript;
|
|
try {
|
|
return std::regex(pattern.data(), pattern.size(), flags);
|
|
} catch (const std::regex_error& e) {
|
|
(void)e;
|
|
ada_log("std_regex_provider::create_instance failed:", e.what());
|
|
return std::nullopt;
|
|
}
|
|
}
|
|
|
|
std::optional<std::vector<std::optional<std::string>>>
|
|
std_regex_provider::regex_search(std::string_view input,
|
|
const std::regex& pattern) {
|
|
// Use iterator-based regex_search to avoid string allocation
|
|
std::match_results<std::string_view::const_iterator> match_result;
|
|
try {
|
|
if (!std::regex_search(input.begin(), input.end(), match_result, pattern,
|
|
std::regex_constants::match_any)) {
|
|
return std::nullopt;
|
|
}
|
|
} catch (const std::regex_error& e) {
|
|
(void)e;
|
|
ada_log("std_regex_provider::regex_search failed:", e.what());
|
|
return std::nullopt;
|
|
}
|
|
std::vector<std::optional<std::string>> matches;
|
|
// An empty input can still match with capture groups (e.g. "(x*)" or an
|
|
// optional ":a?" against ""), so the group values must be extracted here
|
|
// just like for a non-empty input. A successful regex_search always leaves
|
|
// the full match at index 0, so match_result is never empty at this point.
|
|
if (match_result.empty()) {
|
|
return matches;
|
|
}
|
|
matches.reserve(match_result.size());
|
|
for (size_t i = 1; i < match_result.size(); ++i) {
|
|
if (auto entry = match_result[i]; entry.matched) {
|
|
matches.emplace_back(entry.str());
|
|
} else {
|
|
// A capture group that did not participate in the match is undefined,
|
|
// not absent. Emitting nullopt keeps the result aligned by position with
|
|
// the component's group name list; dropping it shifts every later group
|
|
// onto the wrong name.
|
|
matches.emplace_back(std::nullopt);
|
|
}
|
|
}
|
|
return matches;
|
|
}
|
|
|
|
bool std_regex_provider::regex_match(std::string_view input,
|
|
const std::regex& pattern) {
|
|
try {
|
|
return std::regex_match(input.begin(), input.end(), pattern);
|
|
} catch (const std::regex_error& e) {
|
|
(void)e;
|
|
ada_log("std_regex_provider::regex_match failed:", e.what());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
#endif // ADA_USE_UNSAFE_STD_REGEX_PROVIDER
|
|
|
|
} // namespace ada::url_pattern_regex
|
|
|
|
#endif // ADA_INCLUDE_URL_PATTERN
|
|
/* end file src/url_pattern_regex.cpp */
|
|
#endif // ADA_INCLUDE_URL_PATTERN
|
|
|
|
/* begin file src/ada_c.cpp */
|
|
// NOLINTBEGIN(bugprone-exception-escape,
|
|
// bugprone-suspicious-stringview-data-usage)
|
|
|
|
ada::result<ada::url_aggregator>& get_instance(void* result) noexcept {
|
|
return *(ada::result<ada::url_aggregator>*)result;
|
|
}
|
|
|
|
extern "C" {
|
|
typedef void* ada_url;
|
|
typedef void* ada_url_search_params;
|
|
typedef void* ada_strings;
|
|
typedef void* ada_url_search_params_keys_iter;
|
|
typedef void* ada_url_search_params_values_iter;
|
|
typedef void* ada_url_search_params_entries_iter;
|
|
|
|
struct ada_string {
|
|
const char* data;
|
|
size_t length;
|
|
};
|
|
|
|
struct ada_owned_string {
|
|
const char* data;
|
|
size_t length;
|
|
};
|
|
|
|
struct ada_string_pair {
|
|
ada_string key;
|
|
ada_string value;
|
|
};
|
|
|
|
ada_string ada_string_create(const char* data, size_t length) {
|
|
ada_string out{};
|
|
out.data = data;
|
|
out.length = length;
|
|
return out;
|
|
}
|
|
|
|
struct ada_url_components {
|
|
/*
|
|
* By using 32-bit integers, we implicitly assume that the URL string
|
|
* cannot exceed 4 GB.
|
|
*
|
|
* https://user:pass@example.com:1234/foo/bar?baz#quux
|
|
* | | | | ^^^^| | |
|
|
* | | | | | | | `----- hash_start
|
|
* | | | | | | `--------- search_start
|
|
* | | | | | `----------------- pathname_start
|
|
* | | | | `--------------------- port
|
|
* | | | `----------------------- host_end
|
|
* | | `---------------------------------- host_start
|
|
* | `--------------------------------------- username_end
|
|
* `--------------------------------------------- protocol_end
|
|
*/
|
|
uint32_t protocol_end;
|
|
/**
|
|
* Username end is not `omitted` by default (-1) to make username and password
|
|
* getters less costly to implement.
|
|
*/
|
|
uint32_t username_end;
|
|
uint32_t host_start;
|
|
uint32_t host_end;
|
|
uint32_t port;
|
|
uint32_t pathname_start;
|
|
uint32_t search_start;
|
|
uint32_t hash_start;
|
|
};
|
|
|
|
ada_url ada_parse(const char* input, size_t length) noexcept {
|
|
return new ada::result<ada::url_aggregator>(
|
|
ada::parse<ada::url_aggregator>(std::string_view(input, length)));
|
|
}
|
|
|
|
ada_url ada_parse_with_base(const char* input, size_t input_length,
|
|
const char* base, size_t base_length) noexcept {
|
|
auto base_out =
|
|
ada::parse<ada::url_aggregator>(std::string_view(base, base_length));
|
|
|
|
if (!base_out) {
|
|
return new ada::result<ada::url_aggregator>(base_out);
|
|
}
|
|
|
|
return new ada::result<ada::url_aggregator>(ada::parse<ada::url_aggregator>(
|
|
std::string_view(input, input_length), &base_out.value()));
|
|
}
|
|
|
|
bool ada_can_parse(const char* input, size_t length) noexcept {
|
|
return ada::can_parse(std::string_view(input, length));
|
|
}
|
|
|
|
bool ada_can_parse_with_base(const char* input, size_t input_length,
|
|
const char* base, size_t base_length) noexcept {
|
|
std::string_view base_view(base, base_length);
|
|
return ada::can_parse(std::string_view(input, input_length), &base_view);
|
|
}
|
|
|
|
void ada_free(ada_url result) noexcept {
|
|
auto* r = (ada::result<ada::url_aggregator>*)result;
|
|
delete r;
|
|
}
|
|
|
|
ada_url ada_copy(ada_url input) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(input);
|
|
return new ada::result<ada::url_aggregator>(r);
|
|
}
|
|
|
|
bool ada_is_valid(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
return r.has_value();
|
|
}
|
|
|
|
// caller must free the result with ada_free_owned_string
|
|
ada_owned_string ada_get_origin(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
ada_owned_string owned{};
|
|
if (!r) {
|
|
owned.data = nullptr;
|
|
owned.length = 0;
|
|
return owned;
|
|
}
|
|
std::string out = r->get_origin();
|
|
owned.length = out.size();
|
|
owned.data = new char[owned.length];
|
|
memcpy((void*)owned.data, out.data(), owned.length);
|
|
return owned;
|
|
}
|
|
|
|
void ada_free_owned_string(ada_owned_string owned) noexcept {
|
|
delete[] owned.data;
|
|
}
|
|
|
|
ada_string ada_get_href(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_href();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
ada_string ada_get_username(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_username();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
ada_string ada_get_password(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_password();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
ada_string ada_get_port(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_port();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
ada_string ada_get_hash(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_hash();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
ada_string ada_get_host(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_host();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
ada_string ada_get_hostname(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_hostname();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
ada_string ada_get_pathname(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_pathname();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
ada_string ada_get_search(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_search();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
ada_string ada_get_protocol(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view out = r->get_protocol();
|
|
return ada_string_create(out.data(), out.length());
|
|
}
|
|
|
|
uint8_t ada_get_host_type(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return 0;
|
|
}
|
|
return r->host_type;
|
|
}
|
|
|
|
uint8_t ada_get_scheme_type(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return 0;
|
|
}
|
|
return r->type;
|
|
}
|
|
|
|
bool ada_set_href(ada_url result, const char* input, size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->set_href(std::string_view(input, length));
|
|
}
|
|
|
|
bool ada_set_host(ada_url result, const char* input, size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->set_host(std::string_view(input, length));
|
|
}
|
|
|
|
bool ada_set_hostname(ada_url result, const char* input,
|
|
size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->set_hostname(std::string_view(input, length));
|
|
}
|
|
|
|
bool ada_set_protocol(ada_url result, const char* input,
|
|
size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->set_protocol(std::string_view(input, length));
|
|
}
|
|
|
|
bool ada_set_username(ada_url result, const char* input,
|
|
size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->set_username(std::string_view(input, length));
|
|
}
|
|
|
|
bool ada_set_password(ada_url result, const char* input,
|
|
size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->set_password(std::string_view(input, length));
|
|
}
|
|
|
|
bool ada_set_port(ada_url result, const char* input, size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->set_port(std::string_view(input, length));
|
|
}
|
|
|
|
bool ada_set_pathname(ada_url result, const char* input,
|
|
size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->set_pathname(std::string_view(input, length));
|
|
}
|
|
|
|
/**
|
|
* Update the search/query of the URL.
|
|
*
|
|
* If a URL has `?` as the search value, passing empty string to this function
|
|
* does not remove the attribute. If you need to remove it, please use
|
|
* `ada_clear_search` method.
|
|
*/
|
|
void ada_set_search(ada_url result, const char* input, size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (r) {
|
|
r->set_search(std::string_view(input, length));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update the hash/fragment of the URL.
|
|
*
|
|
* If a URL has `#` as the hash value, passing empty string to this function
|
|
* does not remove the attribute. If you need to remove it, please use
|
|
* `ada_clear_hash` method.
|
|
*/
|
|
void ada_set_hash(ada_url result, const char* input, size_t length) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (r) {
|
|
r->set_hash(std::string_view(input, length));
|
|
}
|
|
}
|
|
|
|
void ada_clear_port(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (r) {
|
|
r->clear_port();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Removes the hash of the URL.
|
|
*
|
|
* Despite `ada_set_hash` method, this function allows the complete
|
|
* removal of the hash attribute, even if it has a value of `#`.
|
|
*/
|
|
void ada_clear_hash(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (r) {
|
|
r->clear_hash();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Removes the search of the URL.
|
|
*
|
|
* Despite `ada_set_search` method, this function allows the complete
|
|
* removal of the search attribute, even if it has a value of `?`.
|
|
*/
|
|
void ada_clear_search(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (r) {
|
|
r->clear_search();
|
|
}
|
|
}
|
|
|
|
bool ada_has_credentials(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has_credentials();
|
|
}
|
|
|
|
bool ada_has_empty_hostname(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has_empty_hostname();
|
|
}
|
|
|
|
bool ada_has_hostname(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has_hostname();
|
|
}
|
|
|
|
bool ada_has_non_empty_username(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has_non_empty_username();
|
|
}
|
|
|
|
bool ada_has_non_empty_password(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has_non_empty_password();
|
|
}
|
|
|
|
bool ada_has_port(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has_port();
|
|
}
|
|
|
|
bool ada_has_password(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has_password();
|
|
}
|
|
|
|
bool ada_has_hash(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has_hash();
|
|
}
|
|
|
|
bool ada_has_search(ada_url result) noexcept {
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has_search();
|
|
}
|
|
|
|
// returns a pointer to the internal url_aggregator::url_components
|
|
const ada_url_components* ada_get_components(ada_url result) noexcept {
|
|
static_assert(sizeof(ada_url_components) == sizeof(ada::url_components));
|
|
ada::result<ada::url_aggregator>& r = get_instance(result);
|
|
if (!r) {
|
|
return nullptr;
|
|
}
|
|
return reinterpret_cast<const ada_url_components*>(&r->get_components());
|
|
}
|
|
|
|
ada_owned_string ada_idna_to_unicode(const char* input, size_t length) {
|
|
std::string out = ada::idna::to_unicode(std::string_view(input, length));
|
|
ada_owned_string owned{};
|
|
owned.length = out.length();
|
|
owned.data = new char[owned.length];
|
|
memcpy((void*)owned.data, out.data(), owned.length);
|
|
return owned;
|
|
}
|
|
|
|
ada_owned_string ada_idna_to_ascii(const char* input, size_t length) {
|
|
std::string out = ada::idna::to_ascii(std::string_view(input, length));
|
|
ada_owned_string owned{};
|
|
owned.length = out.size();
|
|
owned.data = new char[owned.length];
|
|
memcpy((void*)owned.data, out.data(), owned.length);
|
|
return owned;
|
|
}
|
|
|
|
ada_url_search_params ada_parse_search_params(const char* input,
|
|
size_t length) {
|
|
return new ada::result<ada::url_search_params>(
|
|
ada::url_search_params(std::string_view(input, length)));
|
|
}
|
|
|
|
void ada_free_search_params(ada_url_search_params result) {
|
|
auto* r = (ada::result<ada::url_search_params>*)result;
|
|
delete r;
|
|
}
|
|
|
|
ada_owned_string ada_search_params_to_string(ada_url_search_params result) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (!r) return ada_owned_string{nullptr, 0};
|
|
std::string out = r->to_string();
|
|
ada_owned_string owned{};
|
|
owned.length = out.size();
|
|
owned.data = new char[owned.length];
|
|
memcpy((void*)owned.data, out.data(), owned.length);
|
|
return owned;
|
|
}
|
|
|
|
size_t ada_search_params_size(ada_url_search_params result) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (!r) {
|
|
return 0;
|
|
}
|
|
return r->size();
|
|
}
|
|
|
|
void ada_search_params_sort(ada_url_search_params result) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (r) {
|
|
r->sort();
|
|
}
|
|
}
|
|
|
|
void ada_search_params_reset(ada_url_search_params result, const char* input,
|
|
size_t length) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (r) {
|
|
r->reset(std::string_view(input, length));
|
|
}
|
|
}
|
|
|
|
void ada_search_params_append(ada_url_search_params result, const char* key,
|
|
size_t key_length, const char* value,
|
|
size_t value_length) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (r) {
|
|
r->append(std::string_view(key, key_length),
|
|
std::string_view(value, value_length));
|
|
}
|
|
}
|
|
|
|
void ada_search_params_set(ada_url_search_params result, const char* key,
|
|
size_t key_length, const char* value,
|
|
size_t value_length) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (r) {
|
|
r->set(std::string_view(key, key_length),
|
|
std::string_view(value, value_length));
|
|
}
|
|
}
|
|
|
|
void ada_search_params_remove(ada_url_search_params result, const char* key,
|
|
size_t key_length) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (r) {
|
|
r->remove(std::string_view(key, key_length));
|
|
}
|
|
}
|
|
|
|
void ada_search_params_remove_value(ada_url_search_params result,
|
|
const char* key, size_t key_length,
|
|
const char* value, size_t value_length) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (r) {
|
|
r->remove(std::string_view(key, key_length),
|
|
std::string_view(value, value_length));
|
|
}
|
|
}
|
|
|
|
bool ada_search_params_has(ada_url_search_params result, const char* key,
|
|
size_t key_length) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has(std::string_view(key, key_length));
|
|
}
|
|
|
|
bool ada_search_params_has_value(ada_url_search_params result, const char* key,
|
|
size_t key_length, const char* value,
|
|
size_t value_length) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return r->has(std::string_view(key, key_length),
|
|
std::string_view(value, value_length));
|
|
}
|
|
|
|
ada_string ada_search_params_get(ada_url_search_params result, const char* key,
|
|
size_t key_length) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
auto found = r->get(std::string_view(key, key_length));
|
|
if (!found.has_value()) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
return ada_string_create(found->data(), found->length());
|
|
}
|
|
|
|
ada_strings ada_search_params_get_all(ada_url_search_params result,
|
|
const char* key, size_t key_length) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (!r) {
|
|
return new ada::result<std::vector<std::string>>(
|
|
std::vector<std::string>());
|
|
}
|
|
return new ada::result<std::vector<std::string>>(
|
|
r->get_all(std::string_view(key, key_length)));
|
|
}
|
|
|
|
ada_url_search_params_keys_iter ada_search_params_get_keys(
|
|
ada_url_search_params result) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (!r) {
|
|
return new ada::result<ada::url_search_params_keys_iter>(
|
|
ada::url_search_params_keys_iter());
|
|
}
|
|
return new ada::result<ada::url_search_params_keys_iter>(r->get_keys());
|
|
}
|
|
|
|
ada_url_search_params_values_iter ada_search_params_get_values(
|
|
ada_url_search_params result) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (!r) {
|
|
return new ada::result<ada::url_search_params_values_iter>(
|
|
ada::url_search_params_values_iter());
|
|
}
|
|
return new ada::result<ada::url_search_params_values_iter>(r->get_values());
|
|
}
|
|
|
|
ada_url_search_params_entries_iter ada_search_params_get_entries(
|
|
ada_url_search_params result) {
|
|
ada::result<ada::url_search_params>& r =
|
|
*(ada::result<ada::url_search_params>*)result;
|
|
if (!r) {
|
|
return new ada::result<ada::url_search_params_entries_iter>(
|
|
ada::url_search_params_entries_iter());
|
|
}
|
|
return new ada::result<ada::url_search_params_entries_iter>(r->get_entries());
|
|
}
|
|
|
|
void ada_free_strings(ada_strings result) {
|
|
auto* r = (ada::result<std::vector<std::string>>*)result;
|
|
delete r;
|
|
}
|
|
|
|
size_t ada_strings_size(ada_strings result) {
|
|
auto* r = (ada::result<std::vector<std::string>>*)result;
|
|
if (!r) {
|
|
return 0;
|
|
}
|
|
return (*r)->size();
|
|
}
|
|
|
|
ada_string ada_strings_get(ada_strings result, size_t index) {
|
|
auto* r = (ada::result<std::vector<std::string>>*)result;
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
std::string_view view = (*r)->at(index);
|
|
return ada_string_create(view.data(), view.length());
|
|
}
|
|
|
|
void ada_free_search_params_keys_iter(ada_url_search_params_keys_iter result) {
|
|
auto* r = (ada::result<ada::url_search_params_keys_iter>*)result;
|
|
delete r;
|
|
}
|
|
|
|
ada_string ada_search_params_keys_iter_next(
|
|
ada_url_search_params_keys_iter result) {
|
|
auto* r = (ada::result<ada::url_search_params_keys_iter>*)result;
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
auto next = (*r)->next();
|
|
if (!next.has_value()) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
return ada_string_create(next->data(), next->length());
|
|
}
|
|
|
|
bool ada_search_params_keys_iter_has_next(
|
|
ada_url_search_params_keys_iter result) {
|
|
auto* r = (ada::result<ada::url_search_params_keys_iter>*)result;
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return (*r)->has_next();
|
|
}
|
|
|
|
void ada_free_search_params_values_iter(
|
|
ada_url_search_params_values_iter result) {
|
|
auto* r = (ada::result<ada::url_search_params_values_iter>*)result;
|
|
delete r;
|
|
}
|
|
|
|
ada_string ada_search_params_values_iter_next(
|
|
ada_url_search_params_values_iter result) {
|
|
auto* r = (ada::result<ada::url_search_params_values_iter>*)result;
|
|
if (!r) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
auto next = (*r)->next();
|
|
if (!next.has_value()) {
|
|
return ada_string_create(nullptr, 0);
|
|
}
|
|
return ada_string_create(next->data(), next->length());
|
|
}
|
|
|
|
bool ada_search_params_values_iter_has_next(
|
|
ada_url_search_params_values_iter result) {
|
|
auto* r = (ada::result<ada::url_search_params_values_iter>*)result;
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return (*r)->has_next();
|
|
}
|
|
|
|
void ada_free_search_params_entries_iter(
|
|
ada_url_search_params_entries_iter result) {
|
|
auto* r = (ada::result<ada::url_search_params_entries_iter>*)result;
|
|
delete r;
|
|
}
|
|
|
|
ada_string_pair ada_search_params_entries_iter_next(
|
|
ada_url_search_params_entries_iter result) {
|
|
auto* r = (ada::result<ada::url_search_params_entries_iter>*)result;
|
|
if (!r) return {ada_string_create(nullptr, 0), ada_string_create(nullptr, 0)};
|
|
auto next = (*r)->next();
|
|
if (!next.has_value()) {
|
|
return {ada_string_create(nullptr, 0), ada_string_create(nullptr, 0)};
|
|
}
|
|
return ada_string_pair{
|
|
ada_string_create(next->first.data(), next->first.length()),
|
|
ada_string_create(next->second.data(), next->second.length())};
|
|
}
|
|
|
|
bool ada_search_params_entries_iter_has_next(
|
|
ada_url_search_params_entries_iter result) {
|
|
auto* r = (ada::result<ada::url_search_params_entries_iter>*)result;
|
|
if (!r) {
|
|
return false;
|
|
}
|
|
return (*r)->has_next();
|
|
}
|
|
|
|
void ada_set_max_input_length(uint32_t length) noexcept {
|
|
ada::set_max_input_length(length);
|
|
}
|
|
|
|
uint32_t ada_get_max_input_length() noexcept {
|
|
return ada::get_max_input_length();
|
|
}
|
|
|
|
typedef struct {
|
|
int major;
|
|
int minor;
|
|
int revision;
|
|
} ada_version_components;
|
|
|
|
const char* ada_get_version() { return ADA_VERSION; }
|
|
|
|
ada_version_components ada_get_version_components() {
|
|
return ada_version_components{
|
|
.major = ada::ADA_VERSION_MAJOR,
|
|
.minor = ada::ADA_VERSION_MINOR,
|
|
.revision = ada::ADA_VERSION_REVISION,
|
|
};
|
|
}
|
|
|
|
} // extern "C"
|
|
// NOLINTEND(bugprone-exception-escape,
|
|
// bugprone-suspicious-stringview-data-usage)
|
|
/* end file src/ada_c.cpp */
|
|
/* end file src/ada.cpp */
|