From fd2b9a1e6d81ad4588eb088faf2475c32372399f Mon Sep 17 00:00:00 2001 From: Bo Bayles Date: Tue, 11 Feb 2025 09:20:17 -0600 Subject: [PATCH 1/9] Upgrade to ada 3.1.0 --- ada_url/ada.cpp | 2 +- ada_url/ada.h | 123 ++++++++++++++++++++++++++++++++++++++++++++---- pyproject.toml | 2 +- 3 files changed, 116 insertions(+), 11 deletions(-) diff --git a/ada_url/ada.cpp b/ada_url/ada.cpp index c9fa03b..a601028 100644 --- a/ada_url/ada.cpp +++ b/ada_url/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2025-01-30 18:48:55 -0500. Do not edit! */ +/* auto-generated on 2025-02-11 09:47:50 -0500. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ diff --git a/ada_url/ada.h b/ada_url/ada.h index c32e3cf..c997f09 100644 --- a/ada_url/ada.h +++ b/ada_url/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2025-01-30 18:48:55 -0500. Do not edit! */ +/* auto-generated on 2025-02-11 09:47:50 -0500. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -1219,6 +1219,7 @@ constexpr ada::scheme::type get_scheme_type(std::string_view scheme) noexcept; #endif // ADA_SCHEME_H /* end file include/ada/scheme.h */ +#include #include namespace ada { @@ -1352,6 +1353,7 @@ struct url_base { #endif /* end file include/ada/url_base.h */ +#include #include #include @@ -4118,6 +4120,9 @@ void swap(expected &lhs, #ifndef ADA_URL_PATTERN_REGEX_H #define ADA_URL_PATTERN_REGEX_H +#include +#include + #ifdef ADA_USE_UNSAFE_STD_REGEX_PROVIDER #include #endif // ADA_USE_UNSAFE_STD_REGEX_PROVIDER @@ -4216,7 +4221,9 @@ concept url_pattern_encoding_callback = requires(F f, std::string_view sv) { // either a string or a URLPatternInit struct. If a string is given, // it will be parsed to create a URLPatternInit. The URLPatternInit // API is defined as part of the URLPattern specification. +// All provided strings must be valid UTF-8. struct url_pattern_init { + // All strings must be valid UTF-8. // @see https://urlpattern.spec.whatwg.org/#process-a-urlpatterninit static tl::expected process( url_pattern_init init, std::string_view type, @@ -4276,15 +4283,23 @@ struct url_pattern_init { #endif // ADA_TESTING bool operator==(const url_pattern_init&) const; - + // If present, must be valid UTF-8. std::optional protocol{}; + // If present, must be valid UTF-8. std::optional username{}; + // If present, must be valid UTF-8. std::optional password{}; + // If present, must be valid UTF-8. std::optional hostname{}; + // If present, must be valid UTF-8. std::optional port{}; + // If present, must be valid UTF-8. std::optional pathname{}; + // If present, must be valid UTF-8. std::optional search{}; + // If present, must be valid UTF-8. std::optional hash{}; + // If present, must be valid UTF-8. std::optional base_url{}; }; } // namespace ada @@ -4366,6 +4381,7 @@ tl::expected, errors> parse_url_pattern_impl( #ifndef ADA_IMPLEMENTATION_H #define ADA_IMPLEMENTATION_H +#include #include #include @@ -4379,6 +4395,7 @@ tl::expected, errors> parse_url_pattern_impl( #include #include +#include #include #include @@ -5040,7 +5057,9 @@ std::string href_from_file(std::string_view path); #endif // ADA_IMPLEMENTATION_H /* end file include/ada/implementation.h */ +#include #include +#include #include #include #include @@ -5219,6 +5238,8 @@ class url_pattern_component { bool has_regexp_groups = false; }; +// A URLPattern input can be either a string or a URLPatternInit object. +// If it is a string, it must be a valid UTF-8 string. using url_pattern_input = std::variant; // A struct providing the URLPattern matching results for all @@ -5251,12 +5272,16 @@ struct url_pattern_options { // defined in https://wicg.github.io/urlpattern. // More information about the URL Pattern syntax can be found at // https://developer.mozilla.org/en-US/docs/Web/API/URL_Pattern_API +// +// We require all strings to be valid UTF-8: it is the user's responsibility +// to ensure that the provided strings are valid UTF-8. template class url_pattern { public: url_pattern() = default; /** + * If non-null, base_url must pointer at a valid UTF-8 string. * @see https://urlpattern.spec.whatwg.org/#dom-urlpattern-exec */ result> exec( @@ -5264,6 +5289,7 @@ class url_pattern { const std::string_view* base_url = nullptr); /** + * If non-null, base_url must pointer at a valid UTF-8 string. * @see https://urlpattern.spec.whatwg.org/#dom-urlpattern-test */ result test(const url_pattern_input& input, @@ -5725,6 +5751,7 @@ std::string generate_segment_wildcard_regexp( #endif /* end file include/ada/url_pattern_helpers.h */ +#include #include #include @@ -6257,6 +6284,7 @@ ada_warn_unused std::string to_string(ada::state s); #include +#include #include /** @@ -6870,6 +6898,7 @@ namespace ada { #ifndef ADA_URL_AGGREGATOR_H #define ADA_URL_AGGREGATOR_H +#include #include #include #include @@ -7255,6 +7284,7 @@ ada_really_inline size_t percent_encode_index(const std::string_view input, /* end file include/ada/unicode-inl.h */ #include +#include #include namespace ada { @@ -8406,6 +8436,8 @@ using url_search_params_entries_iter = url_search_params_iter_type::ENTRIES>; /** + * We require all strings to be valid UTF-8. It is the user's responsibility to + * ensure that the provided strings are valid UTF-8. * @see https://url.spec.whatwg.org/#interface-urlsearchparams */ struct url_search_params { @@ -8428,6 +8460,7 @@ struct url_search_params { [[nodiscard]] inline size_t size() const noexcept; /** + * Both key and value must be valid UTF-8. * @see https://url.spec.whatwg.org/#dom-urlsearchparams-append */ inline void append(std::string_view key, std::string_view value); @@ -8455,6 +8488,7 @@ struct url_search_params { inline bool has(std::string_view key, std::string_view value) noexcept; /** + * Both key and value must be valid UTF-8. * @see https://url.spec.whatwg.org/#dom-urlsearchparams-set */ inline void set(std::string_view key, std::string_view value); @@ -8518,6 +8552,7 @@ struct url_search_params { std::vector params{}; /** + * The init parameter must be valid UTF-8. * @see https://url.spec.whatwg.org/#concept-urlencoded-parser */ void initialize(std::string_view init); @@ -8724,10 +8759,80 @@ inline void url_search_params::remove(const std::string_view key, } inline void url_search_params::sort() { - std::ranges::stable_sort( - params, [](const key_value_pair &lhs, const key_value_pair &rhs) { - return lhs.first < rhs.first; - }); + // We rely on the fact that the content is valid UTF-8. + std::ranges::stable_sort(params, [](const key_value_pair &lhs, + const key_value_pair &rhs) { + size_t i = 0, j = 0; + uint32_t low_surrogate1 = 0, low_surrogate2 = 0; + while ((i < lhs.first.size() || low_surrogate1 != 0) && + (j < rhs.first.size() || low_surrogate2 != 0)) { + uint32_t codePoint1 = 0, codePoint2 = 0; + + if (low_surrogate1 != 0) { + codePoint1 = low_surrogate1; + low_surrogate1 = 0; + } else { + uint8_t c1 = uint8_t(lhs.first[i]); + if (c1 <= 0x7F) { + codePoint1 = c1; + i++; + } else if (c1 <= 0xDF) { + codePoint1 = ((c1 & 0x1F) << 6) | (uint8_t(lhs.first[i + 1]) & 0x3F); + i += 2; + } else if (c1 <= 0xEF) { + codePoint1 = ((c1 & 0x0F) << 12) | + ((uint8_t(lhs.first[i + 1]) & 0x3F) << 6) | + (uint8_t(lhs.first[i + 2]) & 0x3F); + i += 3; + } else { + codePoint1 = ((c1 & 0x07) << 18) | + ((uint8_t(lhs.first[i + 1]) & 0x3F) << 12) | + ((uint8_t(lhs.first[i + 2]) & 0x3F) << 6) | + (uint8_t(lhs.first[i + 3]) & 0x3F); + i += 4; + + codePoint1 -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (codePoint1 >> 10)); + low_surrogate1 = uint16_t(0xDC00 + (codePoint1 & 0x3FF)); + codePoint1 = high_surrogate; + } + } + + if (low_surrogate2 != 0) { + codePoint2 = low_surrogate2; + low_surrogate2 = 0; + } else { + uint8_t c2 = uint8_t(rhs.first[j]); + if (c2 <= 0x7F) { + codePoint2 = c2; + j++; + } else if (c2 <= 0xDF) { + codePoint2 = ((c2 & 0x1F) << 6) | (uint8_t(rhs.first[j + 1]) & 0x3F); + j += 2; + } else if (c2 <= 0xEF) { + codePoint2 = ((c2 & 0x0F) << 12) | + ((uint8_t(rhs.first[j + 1]) & 0x3F) << 6) | + (uint8_t(rhs.first[j + 2]) & 0x3F); + j += 3; + } else { + codePoint2 = ((c2 & 0x07) << 18) | + ((uint8_t(rhs.first[j + 1]) & 0x3F) << 12) | + ((uint8_t(rhs.first[j + 2]) & 0x3F) << 6) | + (uint8_t(rhs.first[j + 3]) & 0x3F); + j += 4; + codePoint2 -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (codePoint2 >> 10)); + low_surrogate2 = uint16_t(0xDC00 + (codePoint2 & 0x3FF)); + codePoint2 = high_surrogate; + } + } + + if (codePoint1 != codePoint2) { + return (codePoint1 < codePoint2); + } + } + return (j < rhs.first.size() || low_surrogate2 != 0); + }); } inline url_search_params_keys_iter url_search_params::get_keys() { @@ -10330,14 +10435,14 @@ constructor_string_parser::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.0.1" +#define ADA_VERSION "3.1.0" namespace ada { enum { ADA_VERSION_MAJOR = 3, - ADA_VERSION_MINOR = 0, - ADA_VERSION_REVISION = 1, + ADA_VERSION_MINOR = 1, + ADA_VERSION_REVISION = 0, }; } // namespace ada diff --git a/pyproject.toml b/pyproject.toml index 46a8c2b..b500f5a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ada-url" -version = "1.16.0" +version = "1.17.0" authors = [ {name = "Bo Bayles", email = "bo@bbayles.com"}, ] From c3b979331517916614ebc55089618c72ac43e2ad Mon Sep 17 00:00:00 2001 From: Bo Bayles Date: Mon, 24 Feb 2025 11:36:37 -0600 Subject: [PATCH 2/9] Updates for ada 3.1.1 / version 1.18.0 --- ada_url/ada.cpp | 71 ++++++------ ada_url/ada.h | 286 ++++++++++++++++++++++++++++-------------------- pyproject.toml | 2 +- 3 files changed, 201 insertions(+), 158 deletions(-) diff --git a/ada_url/ada.cpp b/ada_url/ada.cpp index a601028..fa1e650 100644 --- a/ada_url/ada.cpp +++ b/ada_url/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2025-02-11 09:47:50 -0500. Do not edit! */ +/* auto-generated on 2025-02-23 20:08:55 -0500. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ @@ -15225,7 +15225,7 @@ inline void url_aggregator::consume_prepared_path(std::string_view input) { namespace ada { tl::expected url_pattern_init::process( - url_pattern_init init, std::string_view type, + url_pattern_init init, url_pattern_init::process_type type, std::optional protocol, std::optional username, std::optional password, @@ -15287,8 +15287,8 @@ tl::expected url_pattern_init::process( // 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 != "pattern" && !init.protocol && !init.hostname && !init.port && - !init.username) { + 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); } @@ -15298,8 +15298,8 @@ tl::expected url_pattern_init::process( // "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 != "pattern" && !init.protocol && !init.hostname && !init.port && - !init.username && !init.password) { + 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); } @@ -15418,6 +15418,8 @@ tl::expected url_pattern_init::process( !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); @@ -15430,12 +15432,12 @@ tl::expected url_pattern_init::process( if (slash_index != std::string::npos) { // Let new pathname be the code point substring from 0 to slash index + // 1 within baseURLPath. - std::string new_pathname = base_url_path.substr(0, slash_index + 1); + base_url_path.resize(slash_index + 1); // Append result["pathname"] to the end of new pathname. ADA_ASSERT_TRUE(result.pathname.has_value()); - new_pathname.append(result.pathname.value()); + base_url_path.append(std::move(*result.pathname)); // Set result["pathname"] to new pathname. - result.pathname = std::move(new_pathname); + result.pathname = std::move(base_url_path); } } @@ -15473,7 +15475,7 @@ tl::expected url_pattern_init::process( } tl::expected url_pattern_init::process_protocol( - std::string_view value, std::string_view type) { + 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. @@ -15481,7 +15483,7 @@ tl::expected url_pattern_init::process_protocol( value.remove_suffix(1); } // If type is "pattern" then return strippedValue. - if (type == "pattern") { + if (type == process_type::pattern) { return std::string(value); } // Return the result of running canonicalize a protocol given strippedValue. @@ -15489,9 +15491,9 @@ tl::expected url_pattern_init::process_protocol( } tl::expected url_pattern_init::process_username( - std::string_view value, std::string_view type) { + std::string_view value, process_type type) { // If type is "pattern" then return value. - if (type == "pattern") { + if (type == process_type::pattern) { return std::string(value); } // Return the result of running canonicalize a username given value. @@ -15499,9 +15501,9 @@ tl::expected url_pattern_init::process_username( } tl::expected url_pattern_init::process_password( - std::string_view value, std::string_view type) { + std::string_view value, process_type type) { // If type is "pattern" then return value. - if (type == "pattern") { + if (type == process_type::pattern) { return std::string(value); } // Return the result of running canonicalize a password given value. @@ -15509,10 +15511,10 @@ tl::expected url_pattern_init::process_password( } tl::expected url_pattern_init::process_hostname( - std::string_view value, std::string_view type) { + std::string_view value, process_type type) { ada_log("process_hostname value=", value, " type=", type); // If type is "pattern" then return value. - if (type == "pattern") { + if (type == process_type::pattern) { return std::string(value); } // Return the result of running canonicalize a hostname given value. @@ -15520,9 +15522,9 @@ tl::expected url_pattern_init::process_hostname( } tl::expected url_pattern_init::process_port( - std::string_view port, std::string_view protocol, std::string_view type) { + std::string_view port, std::string_view protocol, process_type type) { // If type is "pattern" then return portValue. - if (type == "pattern") { + if (type == process_type::pattern) { return std::string(port); } // Return the result of running canonicalize a port given portValue and @@ -15531,9 +15533,9 @@ tl::expected url_pattern_init::process_port( } tl::expected url_pattern_init::process_pathname( - std::string_view value, std::string_view protocol, std::string_view type) { + std::string_view value, std::string_view protocol, process_type type) { // If type is "pattern" then return pathnameValue. - if (type == "pattern") { + if (type == process_type::pattern) { return std::string(value); } @@ -15549,7 +15551,7 @@ tl::expected url_pattern_init::process_pathname( } tl::expected url_pattern_init::process_search( - std::string_view value, std::string_view type) { + 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("?")) { @@ -15557,7 +15559,7 @@ tl::expected url_pattern_init::process_search( } ADA_ASSERT_TRUE(!value.starts_with("?")); // If type is "pattern" then return strippedValue. - if (type == "pattern") { + if (type == process_type::pattern) { return std::string(value); } // Return the result of running canonicalize a search given strippedValue. @@ -15565,7 +15567,7 @@ tl::expected url_pattern_init::process_search( } tl::expected url_pattern_init::process_hash( - std::string_view value, std::string_view type) { + 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("#")) { @@ -15573,7 +15575,7 @@ tl::expected url_pattern_init::process_hash( } ADA_ASSERT_TRUE(!value.starts_with("#")); // If type is "pattern" then return strippedValue. - if (type == "pattern") { + if (type == process_type::pattern) { return std::string(value); } // Return the result of running canonicalize a hash given strippedValue. @@ -15599,7 +15601,6 @@ generate_regular_expression_and_name_list( // Let name list be a new list std::vector name_list{}; - const std::string full_wildcard_regexp_value = ".*"; // For each part of part list: for (const url_pattern_part& part : part_list) { @@ -15645,7 +15646,7 @@ generate_regular_expression_and_name_list( // Otherwise if part's type is "full-wildcard" else if (part.type == url_pattern_part_type::FULL_WILDCARD) { // then set regexp value to full wildcard regexp value. - regexp_value = full_wildcard_regexp_value; + regexp_value = ".*"; } // If part's prefix is the empty string and part's suffix is the empty @@ -15724,7 +15725,7 @@ generate_regular_expression_and_name_list( result += "$"; // Return (result, name list) - return {result, name_list}; + return {std::move(result), std::move(name_list)}; } bool is_ipv6_address(std::string_view input) noexcept { @@ -16387,17 +16388,17 @@ std::string escape_regexp_string(std::string_view input) { } std::string process_base_url_string(std::string_view input, - std::string_view type) { + url_pattern_init::process_type type) { // If type is not "pattern" return input. - if (type != "pattern") { + 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, - std::string_view type) noexcept { +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; @@ -16405,15 +16406,13 @@ constexpr bool is_absolute_pathname(std::string_view input, // 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") 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.starts_with("\\/")) return true; // If input[0] is U+007B ({) and input[1] is U+002F (/), then return true. - if (input.starts_with("{/")) return true; // Return false. - return false; + return input[1] == '/' && (input[0] == '\\' || input[0] == '{'); } std::string generate_pattern_string( diff --git a/ada_url/ada.h b/ada_url/ada.h index c997f09..9d7da36 100644 --- a/ada_url/ada.h +++ b/ada_url/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2025-02-11 09:47:50 -0500. Do not edit! */ +/* auto-generated on 2025-02-23 20:08:55 -0500. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -4158,7 +4158,7 @@ concept regex_concept = requires(T t, std::string_view pattern, }; #ifdef ADA_USE_UNSAFE_STD_REGEX_PROVIDER -class std_regex_provider { +class std_regex_provider final { public: std_regex_provider() = default; using regex_type = std::regex; @@ -4223,10 +4223,15 @@ concept url_pattern_encoding_callback = requires(F f, std::string_view sv) { // API is defined as part of the URLPattern specification. // All provided strings must be valid UTF-8. struct url_pattern_init { + enum class process_type : uint8_t { + url, + pattern, + }; + // All strings must be valid UTF-8. // @see https://urlpattern.spec.whatwg.org/#process-a-urlpatterninit static tl::expected process( - url_pattern_init init, std::string_view type, + url_pattern_init init, process_type type, std::optional protocol = std::nullopt, std::optional username = std::nullopt, std::optional password = std::nullopt, @@ -4238,35 +4243,35 @@ struct url_pattern_init { // @see https://urlpattern.spec.whatwg.org/#process-protocol-for-init static tl::expected process_protocol( - std::string_view value, std::string_view type); + std::string_view value, process_type type); // @see https://urlpattern.spec.whatwg.org/#process-username-for-init static tl::expected process_username( - std::string_view value, std::string_view type); + std::string_view value, process_type type); // @see https://urlpattern.spec.whatwg.org/#process-password-for-init static tl::expected process_password( - std::string_view value, std::string_view type); + std::string_view value, process_type type); // @see https://urlpattern.spec.whatwg.org/#process-hostname-for-init static tl::expected process_hostname( - std::string_view value, std::string_view type); + std::string_view value, process_type type); // @see https://urlpattern.spec.whatwg.org/#process-port-for-init static tl::expected process_port( - std::string_view port, std::string_view protocol, std::string_view type); + std::string_view port, std::string_view protocol, process_type type); // @see https://urlpattern.spec.whatwg.org/#process-pathname-for-init static tl::expected process_pathname( - std::string_view value, std::string_view protocol, std::string_view type); + std::string_view value, std::string_view protocol, process_type type); // @see https://urlpattern.spec.whatwg.org/#process-search-for-init static tl::expected process_search( - std::string_view value, std::string_view type); + std::string_view value, process_type type); // @see https://urlpattern.spec.whatwg.org/#process-hash-for-init static tl::expected process_hash(std::string_view value, - std::string_view type); + process_type type); #if ADA_TESTING friend void PrintTo(const url_pattern_init& init, std::ostream* os) { @@ -5217,7 +5222,7 @@ class url_pattern_component { // @see https://urlpattern.spec.whatwg.org/#create-a-component-match-result url_pattern_component_result create_component_match_result( - std::string_view input, + std::string&& input, std::vector>&& exec_result); #if ADA_TESTING @@ -5438,7 +5443,9 @@ enum class token_type : uint8_t { END, // 9 }; +#ifdef ADA_TESTING std::string to_string(token_type type); +#endif // ADA_TESTING // @see https://urlpattern.spec.whatwg.org/#tokenize-policy enum class token_policy { @@ -5512,10 +5519,10 @@ class Tokenizer { : input(new_input), policy(new_policy) {} // @see https://urlpattern.spec.whatwg.org/#get-the-next-code-point - void get_next_code_point(); + constexpr void get_next_code_point(); // @see https://urlpattern.spec.whatwg.org/#seek-and-get-the-next-code-point - void seek_and_get_next_code_point(size_t index); + constexpr void seek_and_get_next_code_point(size_t index); // @see https://urlpattern.spec.whatwg.org/#add-a-token @@ -5558,16 +5565,6 @@ struct constructor_string_parser { explicit constructor_string_parser(std::string_view new_input, std::vector&& new_token_list) : input(new_input), token_list(std::move(new_token_list)) {} - - // @see https://urlpattern.spec.whatwg.org/#rewind - void rewind(); - - // @see https://urlpattern.spec.whatwg.org/#is-a-hash-prefix - bool is_hash_prefix(); - - // @see https://urlpattern.spec.whatwg.org/#is-a-search-prefix - bool is_search_prefix(); - // @see https://urlpattern.spec.whatwg.org/#parse-a-constructor-string static tl::expected parse(std::string_view input); @@ -5586,49 +5583,59 @@ struct constructor_string_parser { DONE, }; + // @see + // https://urlpattern.spec.whatwg.org/#compute-protocol-matches-a-special-scheme-flag + std::optional compute_protocol_matches_special_scheme_flag(); + + private: + // @see https://urlpattern.spec.whatwg.org/#rewind + constexpr void rewind(); + + // @see https://urlpattern.spec.whatwg.org/#is-a-hash-prefix + constexpr bool is_hash_prefix(); + + // @see https://urlpattern.spec.whatwg.org/#is-a-search-prefix + constexpr bool is_search_prefix(); + // @see https://urlpattern.spec.whatwg.org/#change-state void change_state(State state, size_t skip); // @see https://urlpattern.spec.whatwg.org/#is-a-group-open - bool is_group_open() const; + constexpr bool is_group_open() const; // @see https://urlpattern.spec.whatwg.org/#is-a-group-close - bool is_group_close() const; + constexpr bool is_group_close() const; // @see https://urlpattern.spec.whatwg.org/#is-a-protocol-suffix - bool is_protocol_suffix(); - - // @see - // https://urlpattern.spec.whatwg.org/#compute-protocol-matches-a-special-scheme-flag - std::optional compute_protocol_matches_special_scheme_flag(); + constexpr bool is_protocol_suffix() const; // @see https://urlpattern.spec.whatwg.org/#next-is-authority-slashes - bool next_is_authority_slashes(); + constexpr bool next_is_authority_slashes() const; // @see https://urlpattern.spec.whatwg.org/#is-an-identity-terminator - bool is_an_identity_terminator(); + constexpr bool is_an_identity_terminator() const; // @see https://urlpattern.spec.whatwg.org/#is-a-pathname-start - bool is_pathname_start(); + constexpr bool is_pathname_start() const; // @see https://urlpattern.spec.whatwg.org/#is-a-password-prefix - bool is_password_prefix(); + constexpr bool is_password_prefix() const; // @see https://urlpattern.spec.whatwg.org/#is-an-ipv6-open - bool is_an_ipv6_open(); + constexpr bool is_an_ipv6_open() const; // @see https://urlpattern.spec.whatwg.org/#is-an-ipv6-close - bool is_an_ipv6_close(); + constexpr bool is_an_ipv6_close() const; // @see https://urlpattern.spec.whatwg.org/#is-a-port-prefix - bool is_port_prefix(); + constexpr bool is_port_prefix() const; - private: // @see https://urlpattern.spec.whatwg.org/#is-a-non-special-pattern-char - bool is_non_special_pattern_char(size_t index, std::string_view value); + constexpr bool is_non_special_pattern_char(size_t index, + uint32_t value) const; // @see https://urlpattern.spec.whatwg.org/#get-a-safe-token - const token* get_safe_token(size_t index); + constexpr const token* get_safe_token(size_t index) const; // @see https://urlpattern.spec.whatwg.org/#make-a-component-string std::string make_component_string(); @@ -5700,7 +5707,7 @@ tl::expected, errors> tokenize(std::string_view input, // @see https://urlpattern.spec.whatwg.org/#process-a-base-url-string std::string process_base_url_string(std::string_view input, - std::string_view type); + url_pattern_init::process_type type); // @see https://urlpattern.spec.whatwg.org/#escape-a-pattern-string std::string escape_pattern_string(std::string_view input); @@ -5709,8 +5716,8 @@ std::string escape_pattern_string(std::string_view input); std::string escape_regexp_string(std::string_view input); // @see https://urlpattern.spec.whatwg.org/#is-an-absolute-pathname -constexpr bool is_absolute_pathname(std::string_view input, - std::string_view type) noexcept; +constexpr bool is_absolute_pathname( + std::string_view input, url_pattern_init::process_type type) noexcept; // @see https://urlpattern.spec.whatwg.org/#parse-a-pattern-string template @@ -5800,8 +5807,8 @@ tl::expected, errors> parse_url_pattern_impl( // Let processedInit be the result of process a URLPatternInit given init, // "pattern", null, null, null, null, null, null, null, and null. - // TODO: Make "pattern" an enum to avoid creating a string everytime. - auto processed_init = url_pattern_init::process(init, "pattern"); + auto processed_init = + url_pattern_init::process(init, url_pattern_init::process_type::pattern); if (!processed_init) { ada_log("url_pattern_init::process failed for init and 'pattern'"); return tl::unexpected(processed_init.error()); @@ -8896,7 +8903,9 @@ url_search_params_entries_iter::next() { #define ADA_URL_PATTERN_INL_H +#include #include +#include namespace ada { @@ -8915,13 +8924,13 @@ inline bool url_pattern_component_result::operator==( template url_pattern_component_result url_pattern_component::create_component_match_result( - std::string_view input, + std::string&& input, std::vector>&& exec_result) { // Let result be a new URLPatternComponentResult. // Set result["input"] to input. // Let groups be a record. auto result = - url_pattern_component_result{.input = std::string(input), .groups = {}}; + url_pattern_component_result{.input = std::move(input), .groups = {}}; // Optimization: Let's reserve the size. result.groups.reserve(exec_result.size()); @@ -9131,8 +9140,8 @@ result> url_pattern::match( // "url", protocol, username, password, hostname, port, pathname, search, // and hash. auto apply_result = url_pattern_init::process( - std::get(input), "url", protocol, username, password, - hostname, port, pathname, search, hash); + std::get(input), url_pattern_init::process_type::url, + protocol, username, password, hostname, port, pathname, search, hash); // If this throws an exception, catch it, and return null. if (!apply_result.has_value()) { @@ -9142,40 +9151,40 @@ result> url_pattern::match( // Set protocol to applyResult["protocol"]. ADA_ASSERT_TRUE(apply_result->protocol.has_value()); - protocol = apply_result->protocol.value(); + protocol = std::move(apply_result->protocol.value()); // Set username to applyResult["username"]. ADA_ASSERT_TRUE(apply_result->username.has_value()); - username = apply_result->username.value(); + username = std::move(apply_result->username.value()); // Set password to applyResult["password"]. ADA_ASSERT_TRUE(apply_result->password.has_value()); - password = apply_result->password.value(); + password = std::move(apply_result->password.value()); // Set hostname to applyResult["hostname"]. ADA_ASSERT_TRUE(apply_result->hostname.has_value()); - hostname = apply_result->hostname.value(); + hostname = std::move(apply_result->hostname.value()); // Set port to applyResult["port"]. ADA_ASSERT_TRUE(apply_result->port.has_value()); - port = apply_result->port.value(); + port = std::move(apply_result->port.value()); // Set pathname to applyResult["pathname"]. ADA_ASSERT_TRUE(apply_result->pathname.has_value()); - pathname = apply_result->pathname.value(); + pathname = std::move(apply_result->pathname.value()); // Set search to applyResult["search"]. ADA_ASSERT_TRUE(apply_result->search.has_value()); if (apply_result->search->starts_with("?")) { search = apply_result->search->substr(1); } else { - search = apply_result->search.value(); + search = std::move(apply_result->search.value()); } // Set hash to applyResult["hash"]. ADA_ASSERT_TRUE(apply_result->hash.has_value()); ADA_ASSERT_TRUE(!apply_result->hash->starts_with("#")); - hash = apply_result->hash.value(); + hash = std::move(apply_result->hash.value()); } else { ADA_ASSERT_TRUE(std::holds_alternative(input)); @@ -9199,7 +9208,7 @@ result> url_pattern::match( } url_aggregator* base_url_value = - base_url.has_value() ? &base_url.value() : nullptr; + base_url.has_value() ? &*base_url : nullptr; // Set url to the result of parsing input given baseURL. auto url = ada::parse(std::get(input), @@ -9217,36 +9226,34 @@ result> url_pattern::match( // https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2038 protocol = url->get_protocol().substr(0, url->get_protocol().size() - 1); // Set username to url’s username. - username = url->get_username(); + username = std::move(url->get_username()); // Set password to url’s password. - password = url->get_password(); + password = std::move(url->get_password()); // Set hostname to url’s host, serialized, or the empty string if the value // is null. - hostname = url->get_hostname(); + hostname = std::move(url->get_hostname()); // Set port to url’s port, serialized, or the empty string if the value is // null. - port = url->get_port(); + port = std::move(url->get_port()); // Set pathname to the result of URL path serializing url. - pathname = url->get_pathname(); + pathname = std::move(url->get_pathname()); // Set search to url’s query or the empty string if the value is null. // IMPORTANT: Not documented on the URLPattern spec, but search prefix '?' // is removed. Similar work was done on workerd: // https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2232 if (url->has_search()) { - ADA_ASSERT_TRUE(url->get_search().starts_with("?")); - search = url->get_search().substr(1); - } else { - search = ""; + auto view = url->get_search(); + search = + view.starts_with("?") ? url->get_search().substr(1) : std::move(view); } // Set hash to url’s fragment or the empty string if the value is null. // IMPORTANT: Not documented on the URLPattern spec, but hash prefix '#' is // removed. Similar work was done on workerd: // https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2242 if (url->has_hash()) { - ADA_ASSERT_TRUE(url->get_hash().starts_with("#")); - hash = url->get_hash().substr(1); - } else { - hash = ""; + auto view = url->get_hash(); + hash = + view.starts_with("#") ? url->get_hash().substr(1) : std::move(view); } } @@ -9255,47 +9262,70 @@ result> url_pattern::match( auto protocol_exec_result = regex_provider::regex_search(protocol, protocol_component.regexp); + if (!protocol_exec_result) { + return std::nullopt; + } + // Let usernameExecResult be RegExpBuiltinExec(urlPattern’s username // component's regular expression, username). auto username_exec_result = regex_provider::regex_search(username, username_component.regexp); + if (!username_exec_result) { + return std::nullopt; + } + // Let passwordExecResult be RegExpBuiltinExec(urlPattern’s password // component's regular expression, password). auto password_exec_result = regex_provider::regex_search(password, password_component.regexp); + if (!password_exec_result) { + return std::nullopt; + } + // Let hostnameExecResult be RegExpBuiltinExec(urlPattern’s hostname // component's regular expression, hostname). auto hostname_exec_result = regex_provider::regex_search(hostname, hostname_component.regexp); + if (!hostname_exec_result) { + return std::nullopt; + } + // Let portExecResult be RegExpBuiltinExec(urlPattern’s port component's // regular expression, port). auto port_exec_result = regex_provider::regex_search(port, port_component.regexp); + if (!port_exec_result) { + return std::nullopt; + } + // Let pathnameExecResult be RegExpBuiltinExec(urlPattern’s pathname // component's regular expression, pathname). auto pathname_exec_result = regex_provider::regex_search(pathname, pathname_component.regexp); + if (!pathname_exec_result) { + return std::nullopt; + } + // Let searchExecResult be RegExpBuiltinExec(urlPattern’s search component's // regular expression, search). auto search_exec_result = regex_provider::regex_search(search, search_component.regexp); + if (!search_exec_result) { + return std::nullopt; + } + // Let hashExecResult be RegExpBuiltinExec(urlPattern’s hash component's // regular expression, hash). auto hash_exec_result = regex_provider::regex_search(hash, hash_component.regexp); - // If protocolExecResult, usernameExecResult, passwordExecResult, - // hostnameExecResult, portExecResult, pathnameExecResult, searchExecResult, - // or hashExecResult are null then return null. - if (!protocol_exec_result || !username_exec_result || !password_exec_result || - !hostname_exec_result || !port_exec_result || !pathname_exec_result || - !search_exec_result || !hash_exec_result) { + if (!hash_exec_result) { return std::nullopt; } @@ -9306,42 +9336,42 @@ result> url_pattern::match( // Set result["protocol"] to the result of creating a component match result // given urlPattern’s protocol component, protocol, and protocolExecResult. result.protocol = protocol_component.create_component_match_result( - protocol, std::move(*protocol_exec_result)); + std::move(protocol), std::move(*protocol_exec_result)); // Set result["username"] to the result of creating a component match result // given urlPattern’s username component, username, and usernameExecResult. result.username = username_component.create_component_match_result( - username, std::move(*username_exec_result)); + std::move(username), std::move(*username_exec_result)); // Set result["password"] to the result of creating a component match result // given urlPattern’s password component, password, and passwordExecResult. result.password = password_component.create_component_match_result( - password, std::move(*password_exec_result)); + std::move(password), std::move(*password_exec_result)); // Set result["hostname"] to the result of creating a component match result // given urlPattern’s hostname component, hostname, and hostnameExecResult. result.hostname = hostname_component.create_component_match_result( - hostname, std::move(*hostname_exec_result)); + std::move(hostname), std::move(*hostname_exec_result)); // Set result["port"] to the result of creating a component match result given // urlPattern’s port component, port, and portExecResult. result.port = port_component.create_component_match_result( - port, std::move(*port_exec_result)); + std::move(port), std::move(*port_exec_result)); // Set result["pathname"] to the result of creating a component match result // given urlPattern’s pathname component, pathname, and pathnameExecResult. result.pathname = pathname_component.create_component_match_result( - pathname, std::move(*pathname_exec_result)); + std::move(pathname), std::move(*pathname_exec_result)); // Set result["search"] to the result of creating a component match result // given urlPattern’s search component, search, and searchExecResult. result.search = search_component.create_component_match_result( - search, std::move(*search_exec_result)); + std::move(search), std::move(*search_exec_result)); // Set result["hash"] to the result of creating a component match result given // urlPattern’s hash component, hash, and hashExecResult. result.hash = hash_component.create_component_match_result( - hash, std::move(*hash_exec_result)); + std::move(hash), std::move(*hash_exec_result)); return result; } @@ -9363,6 +9393,7 @@ result> url_pattern::match( namespace ada::url_pattern_helpers { +#ifdef ADA_TESTING inline std::string to_string(token_type type) { switch (type) { case token_type::INVALID_CHAR: @@ -9389,9 +9420,10 @@ inline std::string to_string(token_type type) { ada::unreachable(); } } +#endif // ADA_TESTING template -void constructor_string_parser::rewind() { +constexpr void constructor_string_parser::rewind() { // Set parser’s token index to parser’s component start. token_index = component_start; // Set parser’s token increment to 0. @@ -9399,17 +9431,17 @@ void constructor_string_parser::rewind() { } template -bool constructor_string_parser::is_hash_prefix() { +constexpr bool constructor_string_parser::is_hash_prefix() { // Return the result of running is a non-special pattern char given parser, // parser’s token index and "#". - return is_non_special_pattern_char(token_index, "#"); + return is_non_special_pattern_char(token_index, '#'); } template -bool constructor_string_parser::is_search_prefix() { +constexpr bool constructor_string_parser::is_search_prefix() { // If result of running is a non-special pattern char given parser, parser’s // token index and "?" is true, then return true. - if (is_non_special_pattern_char(token_index, "?")) { + if (is_non_special_pattern_char(token_index, '?')) { return true; } @@ -9439,14 +9471,17 @@ bool constructor_string_parser::is_search_prefix() { } template -bool constructor_string_parser::is_non_special_pattern_char( - size_t index, std::string_view value) { +constexpr bool +constructor_string_parser::is_non_special_pattern_char( + size_t index, uint32_t value) const { // Let token be the result of running get a safe token given parser and index. auto token = get_safe_token(index); ADA_ASSERT_TRUE(token); // If token’s value is not value, then return false. - if (token->value != value) { + // TODO: Remove this once we make sure get_safe_token returns a non-empty + // string. + if (!token->value.empty() && token->value[0] != value) { return false; } @@ -9461,8 +9496,8 @@ bool constructor_string_parser::is_non_special_pattern_char( } template -const token* constructor_string_parser::get_safe_token( - size_t index) { +constexpr const token* +constructor_string_parser::get_safe_token(size_t index) const { // If index is less than parser’s token list's size, then return parser’s // token list[index]. if (index < token_list.size()) [[likely]] { @@ -9481,39 +9516,43 @@ const token* constructor_string_parser::get_safe_token( } template -bool constructor_string_parser::is_group_open() const { +constexpr bool constructor_string_parser::is_group_open() + const { // If parser’s token list[parser’s token index]'s type is "open", then return // true. return token_list[token_index].type == token_type::OPEN; } template -bool constructor_string_parser::is_group_close() const { +constexpr bool constructor_string_parser::is_group_close() + const { // If parser’s token list[parser’s token index]'s type is "close", then return // true. return token_list[token_index].type == token_type::CLOSE; } template -bool constructor_string_parser::next_is_authority_slashes() { +constexpr bool +constructor_string_parser::next_is_authority_slashes() const { // If the result of running is a non-special pattern char given parser, // parser’s token index + 1, and "/" is false, then return false. - if (!is_non_special_pattern_char(token_index + 1, "/")) { + if (!is_non_special_pattern_char(token_index + 1, '/')) { return false; } // If the result of running is a non-special pattern char given parser, // parser’s token index + 2, and "/" is false, then return false. - if (!is_non_special_pattern_char(token_index + 2, "/")) { + if (!is_non_special_pattern_char(token_index + 2, '/')) { return false; } return true; } template -bool constructor_string_parser::is_protocol_suffix() { +constexpr bool constructor_string_parser::is_protocol_suffix() + const { // Return the result of running is a non-special pattern char given parser, // parser’s token index, and ":". - return is_non_special_pattern_char(token_index, ":"); + return is_non_special_pattern_char(token_index, ':'); } template @@ -9637,48 +9676,54 @@ std::string constructor_string_parser::make_component_string() { } template -bool constructor_string_parser::is_an_identity_terminator() { +constexpr bool +constructor_string_parser::is_an_identity_terminator() const { // Return the result of running is a non-special pattern char given parser, // parser’s token index, and "@". - return is_non_special_pattern_char(token_index, "@"); + return is_non_special_pattern_char(token_index, '@'); } template -bool constructor_string_parser::is_pathname_start() { +constexpr bool constructor_string_parser::is_pathname_start() + const { // Return the result of running is a non-special pattern char given parser, // parser’s token index, and "/". - return is_non_special_pattern_char(token_index, "/"); + return is_non_special_pattern_char(token_index, '/'); } template -bool constructor_string_parser::is_password_prefix() { +constexpr bool constructor_string_parser::is_password_prefix() + const { // Return the result of running is a non-special pattern char given parser, // parser’s token index, and ":". - return is_non_special_pattern_char(token_index, ":"); + return is_non_special_pattern_char(token_index, ':'); } template -bool constructor_string_parser::is_an_ipv6_open() { +constexpr bool constructor_string_parser::is_an_ipv6_open() + const { // Return the result of running is a non-special pattern char given parser, // parser’s token index, and "[". - return is_non_special_pattern_char(token_index, "["); + return is_non_special_pattern_char(token_index, '['); } template -bool constructor_string_parser::is_an_ipv6_close() { +constexpr bool constructor_string_parser::is_an_ipv6_close() + const { // Return the result of running is a non-special pattern char given parser, // parser’s token index, and "]". - return is_non_special_pattern_char(token_index, "]"); + return is_non_special_pattern_char(token_index, ']'); } template -bool constructor_string_parser::is_port_prefix() { +constexpr bool constructor_string_parser::is_port_prefix() + const { // Return the result of running is a non-special pattern char given parser, // parser’s token index, and ":". - return is_non_special_pattern_char(token_index, ":"); + return is_non_special_pattern_char(token_index, ':'); } -inline void Tokenizer::get_next_code_point() { +constexpr void Tokenizer::get_next_code_point() { ada_log("Tokenizer::get_next_code_point called with index=", next_index); ADA_ASSERT_TRUE(next_index < input.size()); // this assumes that we have a valid, non-truncated UTF-8 stream. @@ -9725,7 +9770,7 @@ inline void Tokenizer::get_next_code_point() { next_index += number_bytes; } -inline void Tokenizer::seek_and_get_next_code_point(size_t new_index) { +constexpr void Tokenizer::seek_and_get_next_code_point(size_t new_index) { ada_log("Tokenizer::seek_and_get_next_code_point called with new_index=", new_index); // Set tokenizer’s next index to index. @@ -9974,10 +10019,9 @@ std::optional url_pattern_parser::add_part( // If name token is not null, then set name to name token’s value. if (name_token) { name = name_token->value; - } else if (regexp_or_wildcard_token) { + } else if (regexp_or_wildcard_token != nullptr) { // Otherwise if regexp or wildcard token is not null: // Set name to parser’s next numeric name, serialized. - // TODO: Make sure this is correct. name = std::to_string(next_numeric_name); // Increment parser’s next numeric name by 1. next_numeric_name++; @@ -10435,14 +10479,14 @@ constructor_string_parser::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.1.0" +#define ADA_VERSION "3.1.1" namespace ada { enum { ADA_VERSION_MAJOR = 3, ADA_VERSION_MINOR = 1, - ADA_VERSION_REVISION = 0, + ADA_VERSION_REVISION = 1, }; } // namespace ada diff --git a/pyproject.toml b/pyproject.toml index b500f5a..ea2bccf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ada-url" -version = "1.17.0" +version = "1.18.0" authors = [ {name = "Bo Bayles", email = "bo@bbayles.com"}, ] From 08fbcf7f4d22fed1e3fe13656a0ae53077aa7ed4 Mon Sep 17 00:00:00 2001 From: Bo Bayles Date: Wed, 26 Feb 2025 10:12:52 -0600 Subject: [PATCH 3/9] Updates for ada 3.1.2 / version 1.19.0 (#103) --- ada_url/ada.cpp | 2 +- ada_url/ada.h | 25 ++++++++++++------------- pyproject.toml | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/ada_url/ada.cpp b/ada_url/ada.cpp index fa1e650..d0f57b7 100644 --- a/ada_url/ada.cpp +++ b/ada_url/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2025-02-23 20:08:55 -0500. Do not edit! */ +/* auto-generated on 2025-02-25 13:08:18 -0500. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ diff --git a/ada_url/ada.h b/ada_url/ada.h index 9d7da36..eadd7d4 100644 --- a/ada_url/ada.h +++ b/ada_url/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2025-02-23 20:08:55 -0500. Do not edit! */ +/* auto-generated on 2025-02-25 13:08:18 -0500. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -290,7 +290,8 @@ bool valid_name_code_point(char32_t input, bool first); ADA_DISABLE_GCC_WARNING("-Wreturn-type") \ ADA_DISABLE_GCC_WARNING("-Wshadow") \ ADA_DISABLE_GCC_WARNING("-Wunused-parameter") \ - ADA_DISABLE_GCC_WARNING("-Wunused-variable") + ADA_DISABLE_GCC_WARNING("-Wunused-variable") \ + ADA_DISABLE_GCC_WARNING("-Wsign-compare") #define ADA_PRAGMA(P) _Pragma(#P) #define ADA_DISABLE_GCC_WARNING(WARNING) \ ADA_PRAGMA(GCC diagnostic ignored WARNING) @@ -9226,25 +9227,24 @@ result> url_pattern::match( // https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2038 protocol = url->get_protocol().substr(0, url->get_protocol().size() - 1); // Set username to url’s username. - username = std::move(url->get_username()); + username = url->get_username(); // Set password to url’s password. - password = std::move(url->get_password()); + password = url->get_password(); // Set hostname to url’s host, serialized, or the empty string if the value // is null. - hostname = std::move(url->get_hostname()); + hostname = url->get_hostname(); // Set port to url’s port, serialized, or the empty string if the value is // null. - port = std::move(url->get_port()); + port = url->get_port(); // Set pathname to the result of URL path serializing url. - pathname = std::move(url->get_pathname()); + pathname = url->get_pathname(); // Set search to url’s query or the empty string if the value is null. // IMPORTANT: Not documented on the URLPattern spec, but search prefix '?' // is removed. Similar work was done on workerd: // https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2232 if (url->has_search()) { auto view = url->get_search(); - search = - view.starts_with("?") ? url->get_search().substr(1) : std::move(view); + search = view.starts_with("?") ? url->get_search().substr(1) : view; } // Set hash to url’s fragment or the empty string if the value is null. // IMPORTANT: Not documented on the URLPattern spec, but hash prefix '#' is @@ -9252,8 +9252,7 @@ result> url_pattern::match( // https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2242 if (url->has_hash()) { auto view = url->get_hash(); - hash = - view.starts_with("#") ? url->get_hash().substr(1) : std::move(view); + hash = view.starts_with("#") ? url->get_hash().substr(1) : view; } } @@ -10479,14 +10478,14 @@ constructor_string_parser::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.1.1" +#define ADA_VERSION "3.1.2" namespace ada { enum { ADA_VERSION_MAJOR = 3, ADA_VERSION_MINOR = 1, - ADA_VERSION_REVISION = 1, + ADA_VERSION_REVISION = 2, }; } // namespace ada diff --git a/pyproject.toml b/pyproject.toml index ea2bccf..6c0f5a8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ada-url" -version = "1.18.0" +version = "1.19.0" authors = [ {name = "Bo Bayles", email = "bo@bbayles.com"}, ] From 621ede69bea5af4d258f2a74116591ced0536e81 Mon Sep 17 00:00:00 2001 From: Bo Bayles Date: Fri, 28 Feb 2025 09:42:01 -0600 Subject: [PATCH 4/9] Updates for ada 3.1.3 / version 1.20.0 (#104) --- ada_url/ada.cpp | 2 +- ada_url/ada.h | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ada_url/ada.cpp b/ada_url/ada.cpp index d0f57b7..1d5df37 100644 --- a/ada_url/ada.cpp +++ b/ada_url/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2025-02-25 13:08:18 -0500. Do not edit! */ +/* auto-generated on 2025-02-26 20:29:12 -0500. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ diff --git a/ada_url/ada.h b/ada_url/ada.h index eadd7d4..1252d18 100644 --- a/ada_url/ada.h +++ b/ada_url/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2025-02-25 13:08:18 -0500. Do not edit! */ +/* auto-generated on 2025-02-26 20:29:12 -0500. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -9480,7 +9480,8 @@ constructor_string_parser::is_non_special_pattern_char( // If token’s value is not value, then return false. // TODO: Remove this once we make sure get_safe_token returns a non-empty // string. - if (!token->value.empty() && token->value[0] != value) { + if (!token->value.empty() && + static_cast(token->value[0]) != value) { return false; } @@ -10478,14 +10479,14 @@ constructor_string_parser::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.1.2" +#define ADA_VERSION "3.1.3" namespace ada { enum { ADA_VERSION_MAJOR = 3, ADA_VERSION_MINOR = 1, - ADA_VERSION_REVISION = 2, + ADA_VERSION_REVISION = 3, }; } // namespace ada From 83d6b4520fecf5daea629640b4a8defe256f2903 Mon Sep 17 00:00:00 2001 From: Bo Bayles Date: Tue, 11 Mar 2025 09:07:28 -0500 Subject: [PATCH 5/9] Version 1.21.0 (#105) * Upgrade ada to 3.2.0 * Upgrade to ada 3.2.1 * WPT tests, 2025-03-10 --- ada_url/ada.cpp | 4987 +++++++++++++++++----------------- ada_url/ada.h | 387 +-- tests/files/urltestdata.json | 23 +- 3 files changed, 2731 insertions(+), 2666 deletions(-) diff --git a/ada_url/ada.cpp b/ada_url/ada.cpp index 1d5df37..bc87c1e 100644 --- a/ada_url/ada.cpp +++ b/ada_url/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2025-02-26 20:29:12 -0500. Do not edit! */ +/* auto-generated on 2025-03-10 13:14:56 -0400. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ @@ -134,7 +134,7 @@ ada_really_inline constexpr bool verify_dns_length( ADA_PUSH_DISABLE_ALL_WARNINGS /* begin file src/ada_idna.cpp */ -/* auto-generated on 2024-12-18 09:44:34 -0500. Do not edit! */ +/* auto-generated on 2025-03-08 13:17:11 -0500. Do not edit! */ /* begin file src/idna.cpp */ /* begin file src/unicode_transcoding.cpp */ @@ -147,7 +147,7 @@ namespace ada::idna { size_t utf8_to_utf32(const char* buf, size_t len, char32_t* utf32_output) { const uint8_t* data = reinterpret_cast(buf); size_t pos = 0; - char32_t* start{utf32_output}; + 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 @@ -266,7 +266,7 @@ 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) { const uint32_t* data = reinterpret_cast(buf); size_t pos = 0; - char* start{utf8_output}; + 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 @@ -326,7 +326,7 @@ size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) { #include /* begin file src/mapping_tables.cpp */ -// IDNA 15.1.0 +// IDNA 16.0.0 // clang-format off #ifndef ADA_IDNA_TABLES_H @@ -335,7 +335,7 @@ size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) { namespace ada::idna { -const uint32_t mappings[5165] = +const uint32_t mappings[5236] = { 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 32, 32, 776, 32, 772, 50, 51, 32, 769, @@ -364,360 +364,366 @@ const uint32_t mappings[5165] = 1125, 1127, 1129, 1131, 1133, 1135, 1137, 1139, 1141, 1143, 1145, 1147, 1149, 1151, 1153, 1163, 1165, 1167, 1169, 1171, 1173, 1175, 1177, 1179, 1181, 1183, 1185, 1187, 1189, 1191, 1193, 1195, 1197, 1199, 1201, 1203, 1205, 1207, 1209, 1211, 1213, 1215, - 1218, 1220, 1222, 1224, 1226, 1228, 1230, 1233, 1235, 1237, 1239, 1241, 1243, 1245, - 1247, 1249, 1251, 1253, 1255, 1257, 1259, 1261, 1263, 1265, 1267, 1269, 1271, 1273, - 1275, 1277, 1279, 1281, 1283, 1285, 1287, 1289, 1291, 1293, 1295, 1297, 1299, 1301, - 1303, 1305, 1307, 1309, 1311, 1313, 1315, 1317, 1319, 1321, 1323, 1325, 1327, 1377, - 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, 1391, - 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, - 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1381, 1410, 1575, 1652, 1608, - 1652, 1735, 1652, 1610, 1652, 2325, 2364, 2326, 2364, 2327, 2364, 2332, 2364, 2337, - 2364, 2338, 2364, 2347, 2364, 2351, 2364, 2465, 2492, 2466, 2492, 2479, 2492, 2610, - 2620, 2616, 2620, 2582, 2620, 2583, 2620, 2588, 2620, 2603, 2620, 2849, 2876, 2850, - 2876, 3661, 3634, 3789, 3762, 3755, 3737, 3755, 3745, 3851, 3906, 4023, 3916, 4023, - 3921, 4023, 3926, 4023, 3931, 4023, 3904, 4021, 3953, 3954, 3953, 3956, 4018, 3968, - 4018, 3953, 3968, 4019, 3968, 4019, 3953, 3968, 3986, 4023, 3996, 4023, 4001, 4023, - 4006, 4023, 4011, 4023, 3984, 4021, 11559, 11565, 4316, 5104, 5105, 5106, 5107, - 5108, 5109, 42571, 4304, 4305, 4306, 4307, 4308, 4309, 4310, 4311, 4312, 4313, 4314, - 4315, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, - 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, - 4344, 4345, 4346, 4349, 4350, 4351, 592, 593, 7426, 604, 7446, 7447, 7453, 7461, - 594, 597, 607, 609, 613, 618, 7547, 669, 621, 7557, 671, 625, 624, 627, 628, 632, - 642, 427, 7452, 656, 657, 7681, 7683, 7685, 7687, 7689, 7691, 7693, 7695, 7697, - 7699, 7701, 7703, 7705, 7707, 7709, 7711, 7713, 7715, 7717, 7719, 7721, 7723, 7725, - 7727, 7729, 7731, 7733, 7735, 7737, 7739, 7741, 7743, 7745, 7747, 7749, 7751, 7753, - 7755, 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, 7777, 7779, 7781, - 7783, 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, 7801, 7803, 7805, 7807, 7809, - 7811, 7813, 7815, 7817, 7819, 7821, 7823, 7825, 7827, 7829, 97, 702, 223, 7841, - 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, 7861, 7863, 7865, 7867, 7869, - 7871, 7873, 7875, 7877, 7879, 7881, 7883, 7885, 7887, 7889, 7891, 7893, 7895, 7897, - 7899, 7901, 7903, 7905, 7907, 7909, 7911, 7913, 7915, 7917, 7919, 7921, 7923, 7925, - 7927, 7929, 7931, 7933, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7952, - 7953, 7954, 7955, 7956, 7957, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7984, - 7985, 7986, 7987, 7988, 7989, 7990, 7991, 8000, 8001, 8002, 8003, 8004, 8005, 8017, - 8019, 8021, 8023, 8032, 8033, 8034, 8035, 8036, 8037, 8038, 8039, 7936, 953, 7937, - 953, 7938, 953, 7939, 953, 7940, 953, 7941, 953, 7942, 953, 7943, 953, 7968, 953, - 7969, 953, 7970, 953, 7971, 953, 7972, 953, 7973, 953, 7974, 953, 7975, 953, 8032, - 953, 8033, 953, 8034, 953, 8035, 953, 8036, 953, 8037, 953, 8038, 953, 8039, 953, - 8048, 953, 945, 953, 940, 953, 8118, 953, 8112, 8113, 32, 787, 32, 834, 32, 776, - 834, 8052, 953, 951, 953, 942, 953, 8134, 953, 8050, 32, 787, 768, 32, 787, 769, - 32, 787, 834, 912, 8144, 8145, 8054, 32, 788, 768, 32, 788, 769, 32, 788, 834, 944, - 8160, 8161, 8058, 8165, 32, 776, 768, 96, 8060, 953, 969, 953, 974, 953, 8182, 953, - 8056, 8208, 32, 819, 8242, 8242, 8242, 8242, 8242, 8245, 8245, 8245, 8245, 8245, - 33, 33, 32, 773, 63, 63, 63, 33, 33, 63, 48, 53, 54, 55, 56, 57, 43, 8722, 61, 40, - 41, 97, 47, 99, 97, 47, 115, 176, 99, 99, 47, 111, 99, 47, 117, 176, 102, 115, 109, - 116, 101, 108, 116, 109, 1488, 1489, 1490, 1491, 102, 97, 120, 8721, 49, 8260, 55, - 49, 8260, 57, 49, 8260, 49, 48, 49, 8260, 51, 50, 8260, 51, 49, 8260, 53, 50, 8260, - 53, 51, 8260, 53, 52, 8260, 53, 49, 8260, 54, 53, 8260, 54, 49, 8260, 56, 51, 8260, - 56, 53, 8260, 56, 55, 8260, 56, 105, 105, 105, 105, 105, 105, 118, 118, 105, 118, - 105, 105, 118, 105, 105, 105, 105, 120, 120, 105, 120, 105, 105, 48, 8260, 51, 8747, - 8747, 8747, 8747, 8747, 8750, 8750, 8750, 8750, 8750, 12296, 12297, 49, 50, 49, - 51, 49, 52, 49, 53, 49, 54, 49, 55, 49, 56, 49, 57, 50, 48, 40, 49, 41, 40, 50, - 41, 40, 51, 41, 40, 52, 41, 40, 53, 41, 40, 54, 41, 40, 55, 41, 40, 56, 41, 40, - 57, 41, 40, 49, 48, 41, 40, 49, 49, 41, 40, 49, 50, 41, 40, 49, 51, 41, 40, 49, - 52, 41, 40, 49, 53, 41, 40, 49, 54, 41, 40, 49, 55, 41, 40, 49, 56, 41, 40, 49, - 57, 41, 40, 50, 48, 41, 40, 97, 41, 40, 98, 41, 40, 99, 41, 40, 100, 41, 40, 101, - 41, 40, 102, 41, 40, 103, 41, 40, 104, 41, 40, 105, 41, 40, 106, 41, 40, 107, 41, - 40, 108, 41, 40, 109, 41, 40, 110, 41, 40, 111, 41, 40, 112, 41, 40, 113, 41, 40, - 114, 41, 40, 115, 41, 40, 116, 41, 40, 117, 41, 40, 118, 41, 40, 119, 41, 40, 120, - 41, 40, 121, 41, 40, 122, 41, 58, 58, 61, 61, 61, 10973, 824, 11312, 11313, 11314, - 11315, 11316, 11317, 11318, 11319, 11320, 11321, 11322, 11323, 11324, 11325, 11326, - 11327, 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338, - 11339, 11340, 11341, 11342, 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, - 11351, 11352, 11353, 11354, 11355, 11356, 11357, 11358, 11359, 11361, 619, 7549, - 637, 11368, 11370, 11372, 11379, 11382, 575, 576, 11393, 11395, 11397, 11399, 11401, - 11403, 11405, 11407, 11409, 11411, 11413, 11415, 11417, 11419, 11421, 11423, 11425, - 11427, 11429, 11431, 11433, 11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449, - 11451, 11453, 11455, 11457, 11459, 11461, 11463, 11465, 11467, 11469, 11471, 11473, - 11475, 11477, 11479, 11481, 11483, 11485, 11487, 11489, 11491, 11500, 11502, 11507, - 11617, 27597, 40863, 19968, 20008, 20022, 20031, 20057, 20101, 20108, 20128, 20154, - 20799, 20837, 20843, 20866, 20886, 20907, 20960, 20981, 20992, 21147, 21241, 21269, - 21274, 21304, 21313, 21340, 21353, 21378, 21430, 21448, 21475, 22231, 22303, 22763, - 22786, 22794, 22805, 22823, 22899, 23376, 23424, 23544, 23567, 23586, 23608, 23662, - 23665, 24027, 24037, 24049, 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339, - 24400, 24417, 24435, 24515, 25096, 25142, 25163, 25903, 25908, 25991, 26007, 26020, - 26041, 26080, 26085, 26352, 26376, 26408, 27424, 27490, 27513, 27571, 27595, 27604, - 27611, 27663, 27668, 27700, 28779, 29226, 29238, 29243, 29247, 29255, 29273, 29275, - 29356, 29572, 29577, 29916, 29926, 29976, 29983, 29992, 30000, 30091, 30098, 30326, - 30333, 30382, 30399, 30446, 30683, 30690, 30707, 31034, 31160, 31166, 31348, 31435, - 31481, 31859, 31992, 32566, 32593, 32650, 32701, 32769, 32780, 32786, 32819, 32895, - 32905, 33251, 33258, 33267, 33276, 33292, 33307, 33311, 33390, 33394, 33400, 34381, - 34411, 34880, 34892, 34915, 35198, 35211, 35282, 35328, 35895, 35910, 35925, 35960, - 35997, 36196, 36208, 36275, 36523, 36554, 36763, 36784, 36789, 37009, 37193, 37318, - 37324, 37329, 38263, 38272, 38428, 38582, 38585, 38632, 38737, 38750, 38754, 38761, - 38859, 38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 39340, 39592, 39640, - 39647, 39717, 39727, 39730, 39740, 39770, 40165, 40565, 40575, 40613, 40635, 40643, - 40653, 40657, 40697, 40701, 40718, 40723, 40736, 40763, 40778, 40786, 40845, 40860, - 40864, 46, 12306, 21316, 21317, 32, 12441, 32, 12442, 12424, 12426, 12467, 12488, - 4352, 4353, 4522, 4354, 4524, 4525, 4355, 4356, 4357, 4528, 4529, 4530, 4531, 4532, - 4533, 4378, 4358, 4359, 4360, 4385, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, - 4369, 4370, 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, - 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4372, 4373, 4551, 4552, 4556, - 4558, 4563, 4567, 4569, 4380, 4573, 4575, 4381, 4382, 4384, 4386, 4387, 4391, 4393, - 4395, 4396, 4397, 4398, 4399, 4402, 4406, 4416, 4423, 4428, 4593, 4594, 4439, 4440, - 4441, 4484, 4485, 4488, 4497, 4498, 4500, 4510, 4513, 19977, 22235, 19978, 20013, - 19979, 30002, 19993, 19969, 22825, 22320, 40, 4352, 41, 40, 4354, 41, 40, 4355, - 41, 40, 4357, 41, 40, 4358, 41, 40, 4359, 41, 40, 4361, 41, 40, 4363, 41, 40, 4364, - 41, 40, 4366, 41, 40, 4367, 41, 40, 4368, 41, 40, 4369, 41, 40, 4370, 41, 40, 44032, - 41, 40, 45208, 41, 40, 45796, 41, 40, 46972, 41, 40, 47560, 41, 40, 48148, 41, 40, - 49324, 41, 40, 50500, 41, 40, 51088, 41, 40, 52264, 41, 40, 52852, 41, 40, 53440, - 41, 40, 54028, 41, 40, 54616, 41, 40, 51452, 41, 40, 50724, 51204, 41, 40, 50724, - 54980, 41, 40, 19968, 41, 40, 20108, 41, 40, 19977, 41, 40, 22235, 41, 40, 20116, - 41, 40, 20845, 41, 40, 19971, 41, 40, 20843, 41, 40, 20061, 41, 40, 21313, 41, 40, - 26376, 41, 40, 28779, 41, 40, 27700, 41, 40, 26408, 41, 40, 37329, 41, 40, 22303, - 41, 40, 26085, 41, 40, 26666, 41, 40, 26377, 41, 40, 31038, 41, 40, 21517, 41, 40, - 29305, 41, 40, 36001, 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, 41, 40, 21628, - 41, 40, 23398, 41, 40, 30435, 41, 40, 20225, 41, 40, 36039, 41, 40, 21332, 41, 40, - 31085, 41, 40, 20241, 41, 40, 33258, 41, 40, 33267, 41, 21839, 24188, 31631, 112, - 116, 101, 50, 50, 50, 52, 50, 53, 50, 54, 50, 55, 50, 56, 50, 57, 51, 48, 51, 51, - 51, 52, 51, 53, 52280, 44256, 51452, 51032, 50864, 31192, 30007, 36969, 20778, 21360, - 27880, 38917, 20889, 27491, 24038, 21491, 21307, 23447, 22812, 51, 54, 51, 55, 51, - 56, 51, 57, 52, 48, 52, 52, 52, 53, 52, 54, 52, 55, 52, 56, 52, 57, 53, 48, 49, - 26376, 50, 26376, 51, 26376, 52, 26376, 53, 26376, 54, 26376, 55, 26376, 56, 26376, - 57, 26376, 49, 48, 26376, 49, 49, 26376, 49, 50, 26376, 104, 103, 101, 114, 103, - 101, 118, 108, 116, 100, 12450, 12452, 12454, 12456, 12458, 12459, 12461, 12463, - 12465, 12469, 12471, 12473, 12475, 12477, 12479, 12481, 12484, 12486, 12490, 12491, - 12492, 12493, 12494, 12495, 12498, 12501, 12504, 12507, 12510, 12511, 12512, 12513, - 12514, 12516, 12518, 12520, 12521, 12522, 12523, 12524, 12525, 12527, 12528, 12529, - 12530, 20196, 21644, 12450, 12497, 12540, 12488, 12450, 12523, 12501, 12449, 12450, - 12531, 12506, 12450, 12450, 12540, 12523, 12452, 12491, 12531, 12464, 12452, 12531, - 12481, 12454, 12457, 12531, 12456, 12473, 12463, 12540, 12489, 12456, 12540, 12459, - 12540, 12458, 12531, 12473, 12458, 12540, 12512, 12459, 12452, 12522, 12459, 12521, - 12483, 12488, 12459, 12525, 12522, 12540, 12460, 12525, 12531, 12460, 12531, 12510, - 12462, 12460, 12462, 12491, 12540, 12461, 12517, 12522, 12540, 12462, 12523, 12480, - 12540, 12461, 12525, 12461, 12525, 12464, 12521, 12512, 12461, 12525, 12513, 12540, - 12488, 12523, 12461, 12525, 12527, 12483, 12488, 12464, 12521, 12512, 12488, 12531, - 12463, 12523, 12476, 12452, 12525, 12463, 12525, 12540, 12493, 12465, 12540, 12473, - 12467, 12523, 12490, 12467, 12540, 12509, 12469, 12452, 12463, 12523, 12469, 12531, - 12481, 12540, 12512, 12471, 12522, 12531, 12464, 12475, 12531, 12481, 12475, 12531, - 12488, 12480, 12540, 12473, 12487, 12471, 12489, 12523, 12490, 12494, 12494, 12483, - 12488, 12495, 12452, 12484, 12497, 12540, 12475, 12531, 12488, 12497, 12540, 12484, - 12496, 12540, 12524, 12523, 12500, 12450, 12473, 12488, 12523, 12500, 12463, 12523, - 12500, 12467, 12499, 12523, 12501, 12449, 12521, 12483, 12489, 12501, 12451, 12540, - 12488, 12502, 12483, 12471, 12455, 12523, 12501, 12521, 12531, 12504, 12463, 12479, - 12540, 12523, 12506, 12477, 12506, 12491, 12498, 12504, 12523, 12484, 12506, 12531, - 12473, 12506, 12540, 12472, 12505, 12540, 12479, 12509, 12452, 12531, 12488, 12508, - 12523, 12488, 12507, 12531, 12509, 12531, 12489, 12507, 12540, 12523, 12507, 12540, - 12531, 12510, 12452, 12463, 12525, 12510, 12452, 12523, 12510, 12483, 12495, 12510, - 12523, 12463, 12510, 12531, 12471, 12519, 12531, 12511, 12463, 12525, 12531, 12511, - 12522, 12511, 12522, 12496, 12540, 12523, 12513, 12460, 12513, 12460, 12488, 12531, - 12516, 12540, 12489, 12516, 12540, 12523, 12518, 12450, 12531, 12522, 12483, 12488, - 12523, 12522, 12521, 12523, 12500, 12540, 12523, 12540, 12502, 12523, 12524, 12512, - 12524, 12531, 12488, 12466, 12531, 48, 28857, 49, 28857, 50, 28857, 51, 28857, 52, - 28857, 53, 28857, 54, 28857, 55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, 49, - 49, 28857, 49, 50, 28857, 49, 51, 28857, 49, 52, 28857, 49, 53, 28857, 49, 54, 28857, - 49, 55, 28857, 49, 56, 28857, 49, 57, 28857, 50, 48, 28857, 50, 49, 28857, 50, 50, - 28857, 50, 51, 28857, 50, 52, 28857, 104, 112, 97, 100, 97, 97, 117, 98, 97, 114, - 111, 118, 112, 99, 100, 109, 100, 109, 50, 100, 109, 51, 105, 117, 24179, 25104, - 26157, 21644, 22823, 27491, 26126, 27835, 26666, 24335, 20250, 31038, 110, 97, 956, - 97, 109, 97, 107, 97, 107, 98, 109, 98, 103, 98, 99, 97, 108, 107, 99, 97, 108, - 112, 102, 110, 102, 956, 102, 956, 103, 109, 103, 107, 103, 104, 122, 107, 104, - 122, 109, 104, 122, 116, 104, 122, 956, 108, 109, 108, 100, 108, 102, 109, 110, - 109, 956, 109, 109, 109, 99, 109, 107, 109, 109, 109, 50, 99, 109, 50, 107, 109, - 50, 109, 109, 51, 99, 109, 51, 107, 109, 51, 109, 8725, 115, 109, 8725, 115, 50, - 107, 112, 97, 109, 112, 97, 103, 112, 97, 114, 97, 100, 114, 97, 100, 8725, 115, - 114, 97, 100, 8725, 115, 50, 112, 115, 110, 115, 956, 115, 109, 115, 112, 118, 110, - 118, 956, 118, 109, 118, 107, 118, 112, 119, 110, 119, 956, 119, 109, 119, 107, - 119, 107, 969, 109, 969, 98, 113, 99, 8725, 107, 103, 100, 98, 103, 121, 104, 97, - 105, 110, 107, 107, 107, 116, 108, 110, 108, 111, 103, 108, 120, 109, 105, 108, - 109, 111, 108, 112, 104, 112, 112, 109, 112, 114, 115, 118, 119, 98, 118, 8725, - 109, 97, 8725, 109, 49, 26085, 50, 26085, 51, 26085, 52, 26085, 53, 26085, 54, 26085, - 55, 26085, 56, 26085, 57, 26085, 49, 48, 26085, 49, 49, 26085, 49, 50, 26085, 49, - 51, 26085, 49, 52, 26085, 49, 53, 26085, 49, 54, 26085, 49, 55, 26085, 49, 56, 26085, - 49, 57, 26085, 50, 48, 26085, 50, 49, 26085, 50, 50, 26085, 50, 51, 26085, 50, 52, - 26085, 50, 53, 26085, 50, 54, 26085, 50, 55, 26085, 50, 56, 26085, 50, 57, 26085, - 51, 48, 26085, 51, 49, 26085, 103, 97, 108, 42561, 42563, 42565, 42567, 42569, 42573, - 42575, 42577, 42579, 42581, 42583, 42585, 42587, 42589, 42591, 42593, 42595, 42597, - 42599, 42601, 42603, 42605, 42625, 42627, 42629, 42631, 42633, 42635, 42637, 42639, - 42641, 42643, 42645, 42647, 42649, 42651, 42787, 42789, 42791, 42793, 42795, 42797, - 42799, 42803, 42805, 42807, 42809, 42811, 42813, 42815, 42817, 42819, 42821, 42823, - 42825, 42827, 42829, 42831, 42833, 42835, 42837, 42839, 42841, 42843, 42845, 42847, - 42849, 42851, 42853, 42855, 42857, 42859, 42861, 42863, 42874, 42876, 7545, 42879, - 42881, 42883, 42885, 42887, 42892, 42897, 42899, 42903, 42905, 42907, 42909, 42911, - 42913, 42915, 42917, 42919, 42921, 620, 670, 647, 43859, 42933, 42935, 42937, 42939, - 42941, 42943, 42945, 42947, 42900, 7566, 42952, 42954, 42961, 42967, 42969, 42998, - 43831, 43858, 653, 5024, 5025, 5026, 5027, 5028, 5029, 5030, 5031, 5032, 5033, 5034, - 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, 5044, 5045, 5046, 5047, 5048, - 5049, 5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, 5076, - 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, 5089, 5090, - 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, 5101, 5102, 5103, 35912, - 26356, 36040, 28369, 20018, 21477, 22865, 21895, 22856, 25078, 30313, 32645, 34367, - 34746, 35064, 37007, 27138, 27931, 28889, 29662, 33853, 37226, 39409, 20098, 21365, - 27396, 29211, 34349, 40478, 23888, 28651, 34253, 35172, 25289, 33240, 34847, 24266, - 26391, 28010, 29436, 37070, 20358, 20919, 21214, 25796, 27347, 29200, 30439, 34310, - 34396, 36335, 38706, 39791, 40442, 30860, 31103, 32160, 33737, 37636, 35542, 22751, - 24324, 31840, 32894, 29282, 30922, 36034, 38647, 22744, 23650, 27155, 28122, 28431, - 32047, 32311, 38475, 21202, 32907, 20956, 20940, 31260, 32190, 33777, 38517, 35712, - 25295, 35582, 20025, 23527, 24594, 29575, 30064, 21271, 30971, 20415, 24489, 19981, - 27852, 25976, 32034, 21443, 22622, 30465, 33865, 35498, 27578, 27784, 25342, 33509, - 25504, 30053, 20142, 20841, 20937, 26753, 31975, 33391, 35538, 37327, 21237, 21570, - 24300, 26053, 28670, 31018, 38317, 39530, 40599, 40654, 26310, 27511, 36706, 24180, - 24976, 25088, 25754, 28451, 29001, 29833, 31178, 32244, 32879, 36646, 34030, 36899, - 37706, 21015, 21155, 21693, 28872, 35010, 24265, 24565, 25467, 27566, 31806, 29557, - 22265, 23994, 24604, 29618, 29801, 32666, 32838, 37428, 38646, 38728, 38936, 20363, - 31150, 37300, 38584, 24801, 20102, 20698, 23534, 23615, 26009, 29134, 30274, 34044, - 36988, 26248, 38446, 21129, 26491, 26611, 27969, 28316, 29705, 30041, 30827, 32016, - 39006, 25134, 38520, 20523, 23833, 28138, 36650, 24459, 24900, 26647, 38534, 21033, - 21519, 23653, 26131, 26446, 26792, 27877, 29702, 30178, 32633, 35023, 35041, 38626, - 21311, 28346, 21533, 29136, 29848, 34298, 38563, 40023, 40607, 26519, 28107, 33256, - 31520, 31890, 29376, 28825, 35672, 20160, 33590, 21050, 20999, 24230, 25299, 31958, - 23429, 27934, 26292, 36667, 38477, 24275, 20800, 21952, 22618, 26228, 20958, 29482, - 30410, 31036, 31070, 31077, 31119, 38742, 31934, 34322, 35576, 36920, 37117, 39151, - 39164, 39208, 40372, 37086, 38583, 20398, 20711, 20813, 21193, 21220, 21329, 21917, - 22022, 22120, 22592, 22696, 23652, 24724, 24936, 24974, 25074, 25935, 26082, 26257, - 26757, 28023, 28186, 28450, 29038, 29227, 29730, 30865, 31049, 31048, 31056, 31062, - 31117, 31118, 31296, 31361, 31680, 32265, 32321, 32626, 32773, 33261, 33401, 33879, - 35088, 35222, 35585, 35641, 36051, 36104, 36790, 38627, 38911, 38971, 24693, 148206, - 33304, 20006, 20917, 20840, 20352, 20805, 20864, 21191, 21242, 21845, 21913, 21986, - 22707, 22852, 22868, 23138, 23336, 24274, 24281, 24425, 24493, 24792, 24910, 24840, - 24928, 25140, 25540, 25628, 25682, 25942, 26395, 26454, 28379, 28363, 28702, 30631, - 29237, 29359, 29809, 29958, 30011, 30237, 30239, 30427, 30452, 30538, 30528, 30924, - 31409, 31867, 32091, 32574, 33618, 33775, 34681, 35137, 35206, 35519, 35531, 35565, - 35722, 36664, 36978, 37273, 37494, 38524, 38875, 38923, 39698, 141386, 141380, 144341, - 15261, 16408, 16441, 152137, 154832, 163539, 40771, 40846, 102, 102, 102, 105, 102, - 108, 102, 102, 108, 1396, 1398, 1396, 1381, 1396, 1387, 1406, 1398, 1396, 1389, - 1497, 1460, 1522, 1463, 1506, 1492, 1499, 1500, 1501, 1512, 1514, 1513, 1473, 1513, - 1474, 1513, 1468, 1473, 1513, 1468, 1474, 1488, 1463, 1488, 1464, 1488, 1468, 1489, - 1468, 1490, 1468, 1491, 1468, 1492, 1468, 1493, 1468, 1494, 1468, 1496, 1468, 1497, - 1468, 1498, 1468, 1499, 1468, 1500, 1468, 1502, 1468, 1504, 1468, 1505, 1468, 1507, - 1468, 1508, 1468, 1510, 1468, 1511, 1468, 1512, 1468, 1514, 1468, 1493, 1465, 1489, - 1471, 1499, 1471, 1508, 1471, 1488, 1500, 1649, 1659, 1662, 1664, 1658, 1663, 1657, - 1700, 1702, 1668, 1667, 1670, 1671, 1677, 1676, 1678, 1672, 1688, 1681, 1705, 1711, - 1715, 1713, 1722, 1723, 1728, 1729, 1726, 1746, 1747, 1709, 1734, 1736, 1739, 1733, - 1737, 1744, 1609, 1574, 1575, 1574, 1749, 1574, 1608, 1574, 1735, 1574, 1734, 1574, - 1736, 1574, 1744, 1574, 1609, 1740, 1574, 1580, 1574, 1581, 1574, 1605, 1574, 1610, - 1576, 1580, 1576, 1581, 1576, 1582, 1576, 1605, 1576, 1609, 1576, 1610, 1578, 1580, - 1578, 1581, 1578, 1582, 1578, 1605, 1578, 1609, 1578, 1610, 1579, 1580, 1579, 1605, - 1579, 1609, 1579, 1610, 1580, 1581, 1580, 1605, 1581, 1605, 1582, 1580, 1582, 1581, - 1582, 1605, 1587, 1580, 1587, 1581, 1587, 1582, 1587, 1605, 1589, 1581, 1589, 1605, - 1590, 1580, 1590, 1581, 1590, 1582, 1590, 1605, 1591, 1581, 1591, 1605, 1592, 1605, - 1593, 1580, 1593, 1605, 1594, 1580, 1594, 1605, 1601, 1580, 1601, 1581, 1601, 1582, - 1601, 1605, 1601, 1609, 1601, 1610, 1602, 1581, 1602, 1605, 1602, 1609, 1602, 1610, - 1603, 1575, 1603, 1580, 1603, 1581, 1603, 1582, 1603, 1604, 1603, 1605, 1603, 1609, - 1603, 1610, 1604, 1580, 1604, 1581, 1604, 1582, 1604, 1605, 1604, 1609, 1604, 1610, - 1605, 1580, 1605, 1605, 1605, 1609, 1605, 1610, 1606, 1580, 1606, 1581, 1606, 1582, - 1606, 1605, 1606, 1609, 1606, 1610, 1607, 1580, 1607, 1605, 1607, 1609, 1607, 1610, - 1610, 1581, 1610, 1582, 1610, 1609, 1584, 1648, 1585, 1648, 1609, 1648, 32, 1612, - 1617, 32, 1613, 1617, 32, 1614, 1617, 32, 1615, 1617, 32, 1616, 1617, 32, 1617, - 1648, 1574, 1585, 1574, 1586, 1574, 1606, 1576, 1585, 1576, 1586, 1576, 1606, 1578, - 1585, 1578, 1586, 1578, 1606, 1579, 1585, 1579, 1586, 1579, 1606, 1605, 1575, 1606, - 1585, 1606, 1586, 1606, 1606, 1610, 1585, 1610, 1586, 1574, 1582, 1574, 1607, 1576, - 1607, 1578, 1607, 1589, 1582, 1604, 1607, 1606, 1607, 1607, 1648, 1579, 1607, 1587, - 1607, 1588, 1605, 1588, 1607, 1600, 1614, 1617, 1600, 1615, 1617, 1600, 1616, 1617, - 1591, 1609, 1591, 1610, 1593, 1609, 1593, 1610, 1594, 1609, 1594, 1610, 1587, 1609, - 1587, 1610, 1588, 1609, 1588, 1610, 1581, 1609, 1580, 1609, 1580, 1610, 1582, 1609, - 1589, 1609, 1589, 1610, 1590, 1609, 1590, 1610, 1588, 1580, 1588, 1581, 1588, 1582, - 1588, 1585, 1587, 1585, 1589, 1585, 1590, 1585, 1575, 1611, 1578, 1580, 1605, 1578, - 1581, 1580, 1578, 1581, 1605, 1578, 1582, 1605, 1578, 1605, 1580, 1578, 1605, 1581, - 1578, 1605, 1582, 1581, 1605, 1610, 1581, 1605, 1609, 1587, 1581, 1580, 1587, 1580, - 1581, 1587, 1580, 1609, 1587, 1605, 1581, 1587, 1605, 1580, 1587, 1605, 1605, 1589, - 1581, 1581, 1589, 1605, 1605, 1588, 1581, 1605, 1588, 1580, 1610, 1588, 1605, 1582, - 1588, 1605, 1605, 1590, 1581, 1609, 1590, 1582, 1605, 1591, 1605, 1581, 1591, 1605, - 1605, 1591, 1605, 1610, 1593, 1580, 1605, 1593, 1605, 1605, 1593, 1605, 1609, 1594, - 1605, 1605, 1594, 1605, 1610, 1594, 1605, 1609, 1601, 1582, 1605, 1602, 1605, 1581, - 1602, 1605, 1605, 1604, 1581, 1605, 1604, 1581, 1610, 1604, 1581, 1609, 1604, 1580, - 1580, 1604, 1582, 1605, 1604, 1605, 1581, 1605, 1581, 1580, 1605, 1581, 1610, 1605, - 1580, 1581, 1605, 1582, 1605, 1605, 1580, 1582, 1607, 1605, 1580, 1607, 1605, 1605, - 1606, 1581, 1605, 1606, 1581, 1609, 1606, 1580, 1605, 1606, 1580, 1609, 1606, 1605, - 1610, 1606, 1605, 1609, 1610, 1605, 1605, 1576, 1582, 1610, 1578, 1580, 1610, 1578, - 1580, 1609, 1578, 1582, 1610, 1578, 1582, 1609, 1578, 1605, 1610, 1578, 1605, 1609, - 1580, 1605, 1610, 1580, 1581, 1609, 1580, 1605, 1609, 1587, 1582, 1609, 1589, 1581, - 1610, 1588, 1581, 1610, 1590, 1581, 1610, 1604, 1580, 1610, 1604, 1605, 1610, 1610, - 1580, 1610, 1610, 1605, 1610, 1605, 1605, 1610, 1602, 1605, 1610, 1606, 1581, 1610, - 1593, 1605, 1610, 1603, 1605, 1610, 1606, 1580, 1581, 1605, 1582, 1610, 1604, 1580, - 1605, 1603, 1605, 1605, 1580, 1581, 1610, 1581, 1580, 1610, 1605, 1580, 1610, 1601, - 1605, 1610, 1576, 1581, 1610, 1587, 1582, 1610, 1606, 1580, 1610, 1589, 1604, 1746, - 1602, 1604, 1746, 1575, 1604, 1604, 1607, 1575, 1603, 1576, 1585, 1605, 1581, 1605, - 1583, 1589, 1604, 1593, 1605, 1585, 1587, 1608, 1604, 1593, 1604, 1610, 1607, 1608, - 1587, 1604, 1605, 1589, 1604, 1609, 1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, - 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, 1580, 1604, 32, 1580, 1604, - 1575, 1604, 1607, 1585, 1740, 1575, 1604, 44, 12289, 12310, 12311, 8212, 8211, 95, - 123, 125, 12308, 12309, 12304, 12305, 12298, 12299, 12300, 12301, 12302, 12303, - 91, 93, 35, 38, 42, 45, 60, 62, 92, 36, 37, 64, 32, 1611, 1600, 1611, 1600, 1617, - 32, 1618, 1600, 1618, 1569, 1570, 1571, 1572, 1573, 1577, 1604, 1570, 1604, 1571, - 1604, 1573, 34, 39, 94, 124, 126, 10629, 10630, 12539, 12453, 12515, 162, 163, 172, - 166, 165, 8361, 9474, 8592, 8593, 8594, 8595, 9632, 9675, 66600, 66601, 66602, 66603, - 66604, 66605, 66606, 66607, 66608, 66609, 66610, 66611, 66612, 66613, 66614, 66615, - 66616, 66617, 66618, 66619, 66620, 66621, 66622, 66623, 66624, 66625, 66626, 66627, - 66628, 66629, 66630, 66631, 66632, 66633, 66634, 66635, 66636, 66637, 66638, 66639, - 66776, 66777, 66778, 66779, 66780, 66781, 66782, 66783, 66784, 66785, 66786, 66787, - 66788, 66789, 66790, 66791, 66792, 66793, 66794, 66795, 66796, 66797, 66798, 66799, - 66800, 66801, 66802, 66803, 66804, 66805, 66806, 66807, 66808, 66809, 66810, 66811, - 66967, 66968, 66969, 66970, 66971, 66972, 66973, 66974, 66975, 66976, 66977, 66979, - 66980, 66981, 66982, 66983, 66984, 66985, 66986, 66987, 66988, 66989, 66990, 66991, - 66992, 66993, 66995, 66996, 66997, 66998, 66999, 67000, 67001, 67003, 67004, 720, - 721, 665, 675, 43878, 677, 676, 7569, 600, 606, 681, 612, 610, 667, 668, 615, 644, - 682, 683, 122628, 42894, 622, 122629, 654, 122630, 630, 631, 634, 122632, 638, 680, - 678, 43879, 679, 11377, 655, 673, 674, 664, 448, 449, 450, 122634, 122654, 68800, - 68801, 68802, 68803, 68804, 68805, 68806, 68807, 68808, 68809, 68810, 68811, 68812, - 68813, 68814, 68815, 68816, 68817, 68818, 68819, 68820, 68821, 68822, 68823, 68824, - 68825, 68826, 68827, 68828, 68829, 68830, 68831, 68832, 68833, 68834, 68835, 68836, - 68837, 68838, 68839, 68840, 68841, 68842, 68843, 68844, 68845, 68846, 68847, 68848, - 68849, 68850, 71872, 71873, 71874, 71875, 71876, 71877, 71878, 71879, 71880, 71881, - 71882, 71883, 71884, 71885, 71886, 71887, 71888, 71889, 71890, 71891, 71892, 71893, - 71894, 71895, 71896, 71897, 71898, 71899, 71900, 71901, 71902, 71903, 93792, 93793, - 93794, 93795, 93796, 93797, 93798, 93799, 93800, 93801, 93802, 93803, 93804, 93805, - 93806, 93807, 93808, 93809, 93810, 93811, 93812, 93813, 93814, 93815, 93816, 93817, - 93818, 93819, 93820, 93821, 93822, 93823, 119127, 119141, 119128, 119141, 119128, - 119141, 119150, 119128, 119141, 119151, 119128, 119141, 119152, 119128, 119141, - 119153, 119128, 119141, 119154, 119225, 119141, 119226, 119141, 119225, 119141, - 119150, 119226, 119141, 119150, 119225, 119141, 119151, 119226, 119141, 119151, - 305, 567, 8711, 8706, 1231, 125218, 125219, 125220, 125221, 125222, 125223, 125224, - 125225, 125226, 125227, 125228, 125229, 125230, 125231, 125232, 125233, 125234, - 125235, 125236, 125237, 125238, 125239, 125240, 125241, 125242, 125243, 125244, - 125245, 125246, 125247, 125248, 125249, 125250, 125251, 1646, 1697, 1647, 48, 44, - 49, 44, 50, 44, 51, 44, 52, 44, 53, 44, 54, 44, 55, 44, 56, 44, 57, 44, 12308, 115, - 12309, 119, 122, 104, 118, 115, 100, 115, 115, 112, 112, 118, 119, 99, 109, 114, - 100, 106, 12411, 12363, 12467, 12467, 23383, 21452, 22810, 35299, 20132, 26144, - 28961, 21069, 24460, 20877, 26032, 21021, 32066, 36009, 22768, 21561, 28436, 25237, - 25429, 36938, 25351, 25171, 31105, 31354, 21512, 28288, 30003, 21106, 21942, 37197, - 12308, 26412, 12309, 12308, 19977, 12309, 12308, 20108, 12309, 12308, 23433, 12309, - 12308, 28857, 12309, 12308, 25171, 12309, 12308, 30423, 12309, 12308, 21213, 12309, - 12308, 25943, 12309, 24471, 21487, 20029, 20024, 20033, 131362, 20320, 20411, 20482, - 20602, 20633, 20687, 13470, 132666, 20820, 20836, 20855, 132380, 13497, 20839, 132427, - 20887, 20900, 20172, 20908, 168415, 20995, 13535, 21051, 21062, 21111, 13589, 21253, - 21254, 21321, 21338, 21363, 21373, 21375, 133676, 28784, 21450, 21471, 133987, 21483, - 21489, 21510, 21662, 21560, 21576, 21608, 21666, 21750, 21776, 21843, 21859, 21892, - 21931, 21939, 21954, 22294, 22295, 22097, 22132, 22766, 22478, 22516, 22541, 22411, - 22578, 22577, 22700, 136420, 22770, 22775, 22790, 22818, 22882, 136872, 136938, - 23020, 23067, 23079, 23000, 23142, 14062, 23304, 23358, 137672, 23491, 23512, 23539, - 138008, 23551, 23558, 14209, 23648, 23744, 23693, 138724, 23875, 138726, 23918, - 23915, 23932, 24033, 24034, 14383, 24061, 24104, 24125, 24169, 14434, 139651, 14460, - 24240, 24243, 24246, 172946, 140081, 33281, 24354, 14535, 144056, 156122, 24418, - 24427, 14563, 24474, 24525, 24535, 24569, 24705, 14650, 14620, 141012, 24775, 24904, - 24908, 24954, 25010, 24996, 25007, 25054, 25115, 25181, 25265, 25300, 25424, 142092, - 25405, 25340, 25448, 25475, 25572, 142321, 25634, 25541, 25513, 14894, 25705, 25726, - 25757, 25719, 14956, 25964, 143370, 26083, 26360, 26185, 15129, 15112, 15076, 20882, - 20885, 26368, 26268, 32941, 17369, 26401, 26462, 26451, 144323, 15177, 26618, 26501, - 26706, 144493, 26766, 26655, 26900, 26946, 27043, 27114, 27304, 145059, 27355, 15384, - 27425, 145575, 27476, 15438, 27506, 27551, 27579, 146061, 138507, 146170, 27726, - 146620, 27839, 27853, 27751, 27926, 27966, 28009, 28024, 28037, 146718, 27956, 28207, - 28270, 15667, 28359, 147153, 28153, 28526, 147294, 147342, 28614, 28729, 28699, - 15766, 28746, 28797, 28791, 28845, 132389, 28997, 148067, 29084, 29224, 29264, 149000, - 29312, 29333, 149301, 149524, 29562, 29579, 16044, 29605, 16056, 29767, 29788, 29829, - 29898, 16155, 29988, 150582, 30014, 150674, 139679, 30224, 151457, 151480, 151620, - 16380, 16392, 151795, 151794, 151833, 151859, 30494, 30495, 30603, 16454, 16534, - 152605, 30798, 16611, 153126, 153242, 153285, 31211, 16687, 31306, 31311, 153980, - 154279, 16898, 154539, 31686, 31689, 16935, 154752, 31954, 17056, 31976, 31971, - 32000, 155526, 32099, 17153, 32199, 32258, 32325, 17204, 156200, 156231, 17241, - 156377, 32634, 156478, 32661, 32762, 156890, 156963, 32864, 157096, 32880, 144223, - 17365, 32946, 33027, 17419, 33086, 23221, 157607, 157621, 144275, 144284, 33284, - 36766, 17515, 33425, 33419, 33437, 21171, 33457, 33459, 33469, 33510, 158524, 33565, - 33635, 33709, 33571, 33725, 33767, 33619, 33738, 33740, 33756, 158774, 159083, 158933, - 17707, 34033, 34035, 34070, 160714, 34148, 159532, 17757, 17761, 159665, 159954, - 17771, 34384, 34407, 34409, 34473, 34440, 34574, 34530, 34600, 34667, 34694, 34785, - 34817, 17913, 34912, 161383, 35031, 35038, 17973, 35066, 13499, 161966, 162150, - 18110, 18119, 35488, 162984, 36011, 36033, 36123, 36215, 163631, 133124, 36299, - 36284, 36336, 133342, 36564, 165330, 165357, 37012, 37105, 37137, 165678, 37147, - 37432, 37591, 37592, 37500, 37881, 37909, 166906, 38283, 18837, 38327, 167287, 18918, - 38595, 23986, 38691, 168261, 168474, 19054, 19062, 38880, 168970, 19122, 169110, - 38953, 169398, 39138, 19251, 39209, 39335, 39362, 39422, 19406, 170800, 40000, 40189, - 19662, 19693, 40295, 172238, 19704, 172293, 172558, 172689, 19798, 40702, 40709, - 40719, 40726, 173568, + 1231, 1218, 1220, 1222, 1224, 1226, 1228, 1230, 1233, 1235, 1237, 1239, 1241, 1243, + 1245, 1247, 1249, 1251, 1253, 1255, 1257, 1259, 1261, 1263, 1265, 1267, 1269, 1271, + 1273, 1275, 1277, 1279, 1281, 1283, 1285, 1287, 1289, 1291, 1293, 1295, 1297, 1299, + 1301, 1303, 1305, 1307, 1309, 1311, 1313, 1315, 1317, 1319, 1321, 1323, 1325, 1327, + 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, + 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, + 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1381, 1410, 1575, 1652, + 1608, 1652, 1735, 1652, 1610, 1652, 2325, 2364, 2326, 2364, 2327, 2364, 2332, 2364, + 2337, 2364, 2338, 2364, 2347, 2364, 2351, 2364, 2465, 2492, 2466, 2492, 2479, 2492, + 2610, 2620, 2616, 2620, 2582, 2620, 2583, 2620, 2588, 2620, 2603, 2620, 2849, 2876, + 2850, 2876, 3661, 3634, 3789, 3762, 3755, 3737, 3755, 3745, 3851, 3906, 4023, 3916, + 4023, 3921, 4023, 3926, 4023, 3931, 4023, 3904, 4021, 3953, 3954, 3953, 3956, 4018, + 3968, 4018, 3953, 3968, 4019, 3968, 4019, 3953, 3968, 3986, 4023, 3996, 4023, 4001, + 4023, 4006, 4023, 4011, 4023, 3984, 4021, 11520, 11521, 11522, 11523, 11524, 11525, + 11526, 11527, 11528, 11529, 11530, 11531, 11532, 11533, 11534, 11535, 11536, 11537, + 11538, 11539, 11540, 11541, 11542, 11543, 11544, 11545, 11546, 11547, 11548, 11549, + 11550, 11551, 11552, 11553, 11554, 11555, 11556, 11557, 11559, 11565, 4316, 5104, + 5105, 5106, 5107, 5108, 5109, 42571, 7306, 4304, 4305, 4306, 4307, 4308, 4309, 4310, + 4311, 4312, 4313, 4314, 4315, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, + 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, + 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4349, 4350, 4351, 592, 593, 7426, 604, + 7446, 7447, 7453, 7461, 594, 597, 607, 609, 613, 618, 7547, 669, 621, 7557, 671, + 625, 624, 627, 628, 632, 642, 427, 7452, 656, 657, 7681, 7683, 7685, 7687, 7689, + 7691, 7693, 7695, 7697, 7699, 7701, 7703, 7705, 7707, 7709, 7711, 7713, 7715, 7717, + 7719, 7721, 7723, 7725, 7727, 7729, 7731, 7733, 7735, 7737, 7739, 7741, 7743, 7745, + 7747, 7749, 7751, 7753, 7755, 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, + 7775, 7777, 7779, 7781, 7783, 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, 7801, + 7803, 7805, 7807, 7809, 7811, 7813, 7815, 7817, 7819, 7821, 7823, 7825, 7827, 7829, + 97, 702, 223, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, 7861, + 7863, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879, 7881, 7883, 7885, 7887, 7889, + 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 7909, 7911, 7913, 7915, 7917, + 7919, 7921, 7923, 7925, 7927, 7929, 7931, 7933, 7935, 7936, 7937, 7938, 7939, 7940, + 7941, 7942, 7943, 7952, 7953, 7954, 7955, 7956, 7957, 7968, 7969, 7970, 7971, 7972, + 7973, 7974, 7975, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 8000, 8001, 8002, + 8003, 8004, 8005, 8017, 8019, 8021, 8023, 8032, 8033, 8034, 8035, 8036, 8037, 8038, + 8039, 7936, 953, 7937, 953, 7938, 953, 7939, 953, 7940, 953, 7941, 953, 7942, 953, + 7943, 953, 7968, 953, 7969, 953, 7970, 953, 7971, 953, 7972, 953, 7973, 953, 7974, + 953, 7975, 953, 8032, 953, 8033, 953, 8034, 953, 8035, 953, 8036, 953, 8037, 953, + 8038, 953, 8039, 953, 8048, 953, 945, 953, 940, 953, 8118, 953, 8112, 8113, 32, + 787, 32, 834, 32, 776, 834, 8052, 953, 951, 953, 942, 953, 8134, 953, 8050, 32, + 787, 768, 32, 787, 769, 32, 787, 834, 912, 8144, 8145, 8054, 32, 788, 768, 32, 788, + 769, 32, 788, 834, 944, 8160, 8161, 8058, 8165, 32, 776, 768, 96, 8060, 953, 969, + 953, 974, 953, 8182, 953, 8056, 8208, 32, 819, 8242, 8242, 8242, 8242, 8242, 8245, + 8245, 8245, 8245, 8245, 33, 33, 32, 773, 63, 63, 63, 33, 33, 63, 48, 53, 54, 55, + 56, 57, 43, 8722, 61, 40, 41, 97, 47, 99, 97, 47, 115, 176, 99, 99, 47, 111, 99, + 47, 117, 176, 102, 115, 109, 116, 101, 108, 116, 109, 8526, 1488, 1489, 1490, 1491, + 102, 97, 120, 8721, 49, 8260, 55, 49, 8260, 57, 49, 8260, 49, 48, 49, 8260, 51, + 50, 8260, 51, 49, 8260, 53, 50, 8260, 53, 51, 8260, 53, 52, 8260, 53, 49, 8260, + 54, 53, 8260, 54, 49, 8260, 56, 51, 8260, 56, 53, 8260, 56, 55, 8260, 56, 105, 105, + 105, 105, 105, 105, 118, 118, 105, 118, 105, 105, 118, 105, 105, 105, 105, 120, + 120, 105, 120, 105, 105, 8580, 48, 8260, 51, 8747, 8747, 8747, 8747, 8747, 8750, + 8750, 8750, 8750, 8750, 12296, 12297, 49, 50, 49, 51, 49, 52, 49, 53, 49, 54, 49, + 55, 49, 56, 49, 57, 50, 48, 40, 49, 41, 40, 50, 41, 40, 51, 41, 40, 52, 41, 40, + 53, 41, 40, 54, 41, 40, 55, 41, 40, 56, 41, 40, 57, 41, 40, 49, 48, 41, 40, 49, + 49, 41, 40, 49, 50, 41, 40, 49, 51, 41, 40, 49, 52, 41, 40, 49, 53, 41, 40, 49, + 54, 41, 40, 49, 55, 41, 40, 49, 56, 41, 40, 49, 57, 41, 40, 50, 48, 41, 40, 97, + 41, 40, 98, 41, 40, 99, 41, 40, 100, 41, 40, 101, 41, 40, 102, 41, 40, 103, 41, + 40, 104, 41, 40, 105, 41, 40, 106, 41, 40, 107, 41, 40, 108, 41, 40, 109, 41, 40, + 110, 41, 40, 111, 41, 40, 112, 41, 40, 113, 41, 40, 114, 41, 40, 115, 41, 40, 116, + 41, 40, 117, 41, 40, 118, 41, 40, 119, 41, 40, 120, 41, 40, 121, 41, 40, 122, 41, + 58, 58, 61, 61, 61, 10973, 824, 11312, 11313, 11314, 11315, 11316, 11317, 11318, + 11319, 11320, 11321, 11322, 11323, 11324, 11325, 11326, 11327, 11328, 11329, 11330, + 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338, 11339, 11340, 11341, 11342, + 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351, 11352, 11353, 11354, + 11355, 11356, 11357, 11358, 11359, 11361, 619, 7549, 637, 11368, 11370, 11372, 11379, + 11382, 575, 576, 11393, 11395, 11397, 11399, 11401, 11403, 11405, 11407, 11409, + 11411, 11413, 11415, 11417, 11419, 11421, 11423, 11425, 11427, 11429, 11431, 11433, + 11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449, 11451, 11453, 11455, 11457, + 11459, 11461, 11463, 11465, 11467, 11469, 11471, 11473, 11475, 11477, 11479, 11481, + 11483, 11485, 11487, 11489, 11491, 11500, 11502, 11507, 11617, 27597, 40863, 19968, + 20008, 20022, 20031, 20057, 20101, 20108, 20128, 20154, 20799, 20837, 20843, 20866, + 20886, 20907, 20960, 20981, 20992, 21147, 21241, 21269, 21274, 21304, 21313, 21340, + 21353, 21378, 21430, 21448, 21475, 22231, 22303, 22763, 22786, 22794, 22805, 22823, + 22899, 23376, 23424, 23544, 23567, 23586, 23608, 23662, 23665, 24027, 24037, 24049, + 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339, 24400, 24417, 24435, 24515, + 25096, 25142, 25163, 25903, 25908, 25991, 26007, 26020, 26041, 26080, 26085, 26352, + 26376, 26408, 27424, 27490, 27513, 27571, 27595, 27604, 27611, 27663, 27668, 27700, + 28779, 29226, 29238, 29243, 29247, 29255, 29273, 29275, 29356, 29572, 29577, 29916, + 29926, 29976, 29983, 29992, 30000, 30091, 30098, 30326, 30333, 30382, 30399, 30446, + 30683, 30690, 30707, 31034, 31160, 31166, 31348, 31435, 31481, 31859, 31992, 32566, + 32593, 32650, 32701, 32769, 32780, 32786, 32819, 32895, 32905, 33251, 33258, 33267, + 33276, 33292, 33307, 33311, 33390, 33394, 33400, 34381, 34411, 34880, 34892, 34915, + 35198, 35211, 35282, 35328, 35895, 35910, 35925, 35960, 35997, 36196, 36208, 36275, + 36523, 36554, 36763, 36784, 36789, 37009, 37193, 37318, 37324, 37329, 38263, 38272, + 38428, 38582, 38585, 38632, 38737, 38750, 38754, 38761, 38859, 38893, 38899, 38913, + 39080, 39131, 39135, 39318, 39321, 39340, 39592, 39640, 39647, 39717, 39727, 39730, + 39740, 39770, 40165, 40565, 40575, 40613, 40635, 40643, 40653, 40657, 40697, 40701, + 40718, 40723, 40736, 40763, 40778, 40786, 40845, 40860, 40864, 46, 12306, 21316, + 21317, 32, 12441, 32, 12442, 12424, 12426, 12467, 12488, 4352, 4353, 4522, 4354, + 4524, 4525, 4355, 4356, 4357, 4528, 4529, 4530, 4531, 4532, 4533, 4378, 4358, 4359, + 4360, 4385, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4449, 4450, + 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, + 4465, 4466, 4467, 4468, 4469, 4372, 4373, 4551, 4552, 4556, 4558, 4563, 4567, 4569, + 4380, 4573, 4575, 4381, 4382, 4384, 4386, 4387, 4391, 4393, 4395, 4396, 4397, 4398, + 4399, 4402, 4406, 4416, 4423, 4428, 4593, 4594, 4439, 4440, 4441, 4484, 4485, 4488, + 4497, 4498, 4500, 4510, 4513, 19977, 22235, 19978, 20013, 19979, 30002, 19993, 19969, + 22825, 22320, 40, 4352, 41, 40, 4354, 41, 40, 4355, 41, 40, 4357, 41, 40, 4358, + 41, 40, 4359, 41, 40, 4361, 41, 40, 4363, 41, 40, 4364, 41, 40, 4366, 41, 40, 4367, + 41, 40, 4368, 41, 40, 4369, 41, 40, 4370, 41, 40, 44032, 41, 40, 45208, 41, 40, + 45796, 41, 40, 46972, 41, 40, 47560, 41, 40, 48148, 41, 40, 49324, 41, 40, 50500, + 41, 40, 51088, 41, 40, 52264, 41, 40, 52852, 41, 40, 53440, 41, 40, 54028, 41, 40, + 54616, 41, 40, 51452, 41, 40, 50724, 51204, 41, 40, 50724, 54980, 41, 40, 19968, + 41, 40, 20108, 41, 40, 19977, 41, 40, 22235, 41, 40, 20116, 41, 40, 20845, 41, 40, + 19971, 41, 40, 20843, 41, 40, 20061, 41, 40, 21313, 41, 40, 26376, 41, 40, 28779, + 41, 40, 27700, 41, 40, 26408, 41, 40, 37329, 41, 40, 22303, 41, 40, 26085, 41, 40, + 26666, 41, 40, 26377, 41, 40, 31038, 41, 40, 21517, 41, 40, 29305, 41, 40, 36001, + 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, 41, 40, 21628, 41, 40, 23398, 41, 40, + 30435, 41, 40, 20225, 41, 40, 36039, 41, 40, 21332, 41, 40, 31085, 41, 40, 20241, + 41, 40, 33258, 41, 40, 33267, 41, 21839, 24188, 31631, 112, 116, 101, 50, 50, 50, + 52, 50, 53, 50, 54, 50, 55, 50, 56, 50, 57, 51, 48, 51, 51, 51, 52, 51, 53, 52280, + 44256, 51452, 51032, 50864, 31192, 30007, 36969, 20778, 21360, 27880, 38917, 20889, + 27491, 24038, 21491, 21307, 23447, 22812, 51, 54, 51, 55, 51, 56, 51, 57, 52, 48, + 52, 52, 52, 53, 52, 54, 52, 55, 52, 56, 52, 57, 53, 48, 49, 26376, 50, 26376, 51, + 26376, 52, 26376, 53, 26376, 54, 26376, 55, 26376, 56, 26376, 57, 26376, 49, 48, + 26376, 49, 49, 26376, 49, 50, 26376, 104, 103, 101, 114, 103, 101, 118, 108, 116, + 100, 12450, 12452, 12454, 12456, 12458, 12459, 12461, 12463, 12465, 12469, 12471, + 12473, 12475, 12477, 12479, 12481, 12484, 12486, 12490, 12491, 12492, 12493, 12494, + 12495, 12498, 12501, 12504, 12507, 12510, 12511, 12512, 12513, 12514, 12516, 12518, + 12520, 12521, 12522, 12523, 12524, 12525, 12527, 12528, 12529, 12530, 20196, 21644, + 12450, 12497, 12540, 12488, 12450, 12523, 12501, 12449, 12450, 12531, 12506, 12450, + 12450, 12540, 12523, 12452, 12491, 12531, 12464, 12452, 12531, 12481, 12454, 12457, + 12531, 12456, 12473, 12463, 12540, 12489, 12456, 12540, 12459, 12540, 12458, 12531, + 12473, 12458, 12540, 12512, 12459, 12452, 12522, 12459, 12521, 12483, 12488, 12459, + 12525, 12522, 12540, 12460, 12525, 12531, 12460, 12531, 12510, 12462, 12460, 12462, + 12491, 12540, 12461, 12517, 12522, 12540, 12462, 12523, 12480, 12540, 12461, 12525, + 12461, 12525, 12464, 12521, 12512, 12461, 12525, 12513, 12540, 12488, 12523, 12461, + 12525, 12527, 12483, 12488, 12464, 12521, 12512, 12488, 12531, 12463, 12523, 12476, + 12452, 12525, 12463, 12525, 12540, 12493, 12465, 12540, 12473, 12467, 12523, 12490, + 12467, 12540, 12509, 12469, 12452, 12463, 12523, 12469, 12531, 12481, 12540, 12512, + 12471, 12522, 12531, 12464, 12475, 12531, 12481, 12475, 12531, 12488, 12480, 12540, + 12473, 12487, 12471, 12489, 12523, 12490, 12494, 12494, 12483, 12488, 12495, 12452, + 12484, 12497, 12540, 12475, 12531, 12488, 12497, 12540, 12484, 12496, 12540, 12524, + 12523, 12500, 12450, 12473, 12488, 12523, 12500, 12463, 12523, 12500, 12467, 12499, + 12523, 12501, 12449, 12521, 12483, 12489, 12501, 12451, 12540, 12488, 12502, 12483, + 12471, 12455, 12523, 12501, 12521, 12531, 12504, 12463, 12479, 12540, 12523, 12506, + 12477, 12506, 12491, 12498, 12504, 12523, 12484, 12506, 12531, 12473, 12506, 12540, + 12472, 12505, 12540, 12479, 12509, 12452, 12531, 12488, 12508, 12523, 12488, 12507, + 12531, 12509, 12531, 12489, 12507, 12540, 12523, 12507, 12540, 12531, 12510, 12452, + 12463, 12525, 12510, 12452, 12523, 12510, 12483, 12495, 12510, 12523, 12463, 12510, + 12531, 12471, 12519, 12531, 12511, 12463, 12525, 12531, 12511, 12522, 12511, 12522, + 12496, 12540, 12523, 12513, 12460, 12513, 12460, 12488, 12531, 12516, 12540, 12489, + 12516, 12540, 12523, 12518, 12450, 12531, 12522, 12483, 12488, 12523, 12522, 12521, + 12523, 12500, 12540, 12523, 12540, 12502, 12523, 12524, 12512, 12524, 12531, 12488, + 12466, 12531, 48, 28857, 49, 28857, 50, 28857, 51, 28857, 52, 28857, 53, 28857, + 54, 28857, 55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, 49, 49, 28857, 49, 50, + 28857, 49, 51, 28857, 49, 52, 28857, 49, 53, 28857, 49, 54, 28857, 49, 55, 28857, + 49, 56, 28857, 49, 57, 28857, 50, 48, 28857, 50, 49, 28857, 50, 50, 28857, 50, 51, + 28857, 50, 52, 28857, 104, 112, 97, 100, 97, 97, 117, 98, 97, 114, 111, 118, 112, + 99, 100, 109, 100, 109, 50, 100, 109, 51, 105, 117, 24179, 25104, 26157, 21644, + 22823, 27491, 26126, 27835, 26666, 24335, 20250, 31038, 110, 97, 956, 97, 109, 97, + 107, 97, 107, 98, 109, 98, 103, 98, 99, 97, 108, 107, 99, 97, 108, 112, 102, 110, + 102, 956, 102, 956, 103, 109, 103, 107, 103, 104, 122, 107, 104, 122, 109, 104, + 122, 116, 104, 122, 956, 108, 109, 108, 100, 108, 102, 109, 110, 109, 956, 109, + 109, 109, 99, 109, 107, 109, 109, 109, 50, 99, 109, 50, 107, 109, 50, 109, 109, + 51, 99, 109, 51, 107, 109, 51, 109, 8725, 115, 109, 8725, 115, 50, 107, 112, 97, + 109, 112, 97, 103, 112, 97, 114, 97, 100, 114, 97, 100, 8725, 115, 114, 97, 100, + 8725, 115, 50, 112, 115, 110, 115, 956, 115, 109, 115, 112, 118, 110, 118, 956, + 118, 109, 118, 107, 118, 112, 119, 110, 119, 956, 119, 109, 119, 107, 119, 107, + 969, 109, 969, 98, 113, 99, 8725, 107, 103, 100, 98, 103, 121, 104, 97, 105, 110, + 107, 107, 107, 116, 108, 110, 108, 111, 103, 108, 120, 109, 105, 108, 109, 111, + 108, 112, 104, 112, 112, 109, 112, 114, 115, 118, 119, 98, 118, 8725, 109, 97, 8725, + 109, 49, 26085, 50, 26085, 51, 26085, 52, 26085, 53, 26085, 54, 26085, 55, 26085, + 56, 26085, 57, 26085, 49, 48, 26085, 49, 49, 26085, 49, 50, 26085, 49, 51, 26085, + 49, 52, 26085, 49, 53, 26085, 49, 54, 26085, 49, 55, 26085, 49, 56, 26085, 49, 57, + 26085, 50, 48, 26085, 50, 49, 26085, 50, 50, 26085, 50, 51, 26085, 50, 52, 26085, + 50, 53, 26085, 50, 54, 26085, 50, 55, 26085, 50, 56, 26085, 50, 57, 26085, 51, 48, + 26085, 51, 49, 26085, 103, 97, 108, 42561, 42563, 42565, 42567, 42569, 42573, 42575, + 42577, 42579, 42581, 42583, 42585, 42587, 42589, 42591, 42593, 42595, 42597, 42599, + 42601, 42603, 42605, 42625, 42627, 42629, 42631, 42633, 42635, 42637, 42639, 42641, + 42643, 42645, 42647, 42649, 42651, 42787, 42789, 42791, 42793, 42795, 42797, 42799, + 42803, 42805, 42807, 42809, 42811, 42813, 42815, 42817, 42819, 42821, 42823, 42825, + 42827, 42829, 42831, 42833, 42835, 42837, 42839, 42841, 42843, 42845, 42847, 42849, + 42851, 42853, 42855, 42857, 42859, 42861, 42863, 42874, 42876, 7545, 42879, 42881, + 42883, 42885, 42887, 42892, 42897, 42899, 42903, 42905, 42907, 42909, 42911, 42913, + 42915, 42917, 42919, 42921, 620, 670, 647, 43859, 42933, 42935, 42937, 42939, 42941, + 42943, 42945, 42947, 42900, 7566, 42952, 42954, 612, 42957, 42961, 42967, 42969, + 42971, 411, 42998, 43831, 43858, 653, 5024, 5025, 5026, 5027, 5028, 5029, 5030, + 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, 5042, 5043, 5044, + 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5073, 5074, 5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, + 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, 5098, 5099, 5100, + 5101, 5102, 5103, 35912, 26356, 36040, 28369, 20018, 21477, 22865, 21895, 22856, + 25078, 30313, 32645, 34367, 34746, 35064, 37007, 27138, 27931, 28889, 29662, 33853, + 37226, 39409, 20098, 21365, 27396, 29211, 34349, 40478, 23888, 28651, 34253, 35172, + 25289, 33240, 34847, 24266, 26391, 28010, 29436, 37070, 20358, 20919, 21214, 25796, + 27347, 29200, 30439, 34310, 34396, 36335, 38706, 39791, 40442, 30860, 31103, 32160, + 33737, 37636, 35542, 22751, 24324, 31840, 32894, 29282, 30922, 36034, 38647, 22744, + 23650, 27155, 28122, 28431, 32047, 32311, 38475, 21202, 32907, 20956, 20940, 31260, + 32190, 33777, 38517, 35712, 25295, 35582, 20025, 23527, 24594, 29575, 30064, 21271, + 30971, 20415, 24489, 19981, 27852, 25976, 32034, 21443, 22622, 30465, 33865, 35498, + 27578, 27784, 25342, 33509, 25504, 30053, 20142, 20841, 20937, 26753, 31975, 33391, + 35538, 37327, 21237, 21570, 24300, 26053, 28670, 31018, 38317, 39530, 40599, 40654, + 26310, 27511, 36706, 24180, 24976, 25088, 25754, 28451, 29001, 29833, 31178, 32244, + 32879, 36646, 34030, 36899, 37706, 21015, 21155, 21693, 28872, 35010, 24265, 24565, + 25467, 27566, 31806, 29557, 22265, 23994, 24604, 29618, 29801, 32666, 32838, 37428, + 38646, 38728, 38936, 20363, 31150, 37300, 38584, 24801, 20102, 20698, 23534, 23615, + 26009, 29134, 30274, 34044, 36988, 26248, 38446, 21129, 26491, 26611, 27969, 28316, + 29705, 30041, 30827, 32016, 39006, 25134, 38520, 20523, 23833, 28138, 36650, 24459, + 24900, 26647, 38534, 21033, 21519, 23653, 26131, 26446, 26792, 27877, 29702, 30178, + 32633, 35023, 35041, 38626, 21311, 28346, 21533, 29136, 29848, 34298, 38563, 40023, + 40607, 26519, 28107, 33256, 31520, 31890, 29376, 28825, 35672, 20160, 33590, 21050, + 20999, 24230, 25299, 31958, 23429, 27934, 26292, 36667, 38477, 24275, 20800, 21952, + 22618, 26228, 20958, 29482, 30410, 31036, 31070, 31077, 31119, 38742, 31934, 34322, + 35576, 36920, 37117, 39151, 39164, 39208, 40372, 37086, 38583, 20398, 20711, 20813, + 21193, 21220, 21329, 21917, 22022, 22120, 22592, 22696, 23652, 24724, 24936, 24974, + 25074, 25935, 26082, 26257, 26757, 28023, 28186, 28450, 29038, 29227, 29730, 30865, + 31049, 31048, 31056, 31062, 31117, 31118, 31296, 31361, 31680, 32265, 32321, 32626, + 32773, 33261, 33401, 33879, 35088, 35222, 35585, 35641, 36051, 36104, 36790, 38627, + 38911, 38971, 24693, 148206, 33304, 20006, 20917, 20840, 20352, 20805, 20864, 21191, + 21242, 21845, 21913, 21986, 22707, 22852, 22868, 23138, 23336, 24274, 24281, 24425, + 24493, 24792, 24910, 24840, 24928, 25140, 25540, 25628, 25682, 25942, 26395, 26454, + 28379, 28363, 28702, 30631, 29237, 29359, 29809, 29958, 30011, 30237, 30239, 30427, + 30452, 30538, 30528, 30924, 31409, 31867, 32091, 32574, 33618, 33775, 34681, 35137, + 35206, 35519, 35531, 35565, 35722, 36664, 36978, 37273, 37494, 38524, 38875, 38923, + 39698, 141386, 141380, 144341, 15261, 16408, 16441, 152137, 154832, 163539, 40771, + 40846, 102, 102, 102, 105, 102, 108, 102, 102, 108, 1396, 1398, 1396, 1381, 1396, + 1387, 1406, 1398, 1396, 1389, 1497, 1460, 1522, 1463, 1506, 1492, 1499, 1500, 1501, + 1512, 1514, 1513, 1473, 1513, 1474, 1513, 1468, 1473, 1513, 1468, 1474, 1488, 1463, + 1488, 1464, 1488, 1468, 1489, 1468, 1490, 1468, 1491, 1468, 1492, 1468, 1493, 1468, + 1494, 1468, 1496, 1468, 1497, 1468, 1498, 1468, 1499, 1468, 1500, 1468, 1502, 1468, + 1504, 1468, 1505, 1468, 1507, 1468, 1508, 1468, 1510, 1468, 1511, 1468, 1512, 1468, + 1514, 1468, 1493, 1465, 1489, 1471, 1499, 1471, 1508, 1471, 1488, 1500, 1649, 1659, + 1662, 1664, 1658, 1663, 1657, 1700, 1702, 1668, 1667, 1670, 1671, 1677, 1676, 1678, + 1672, 1688, 1681, 1705, 1711, 1715, 1713, 1722, 1723, 1728, 1729, 1726, 1746, 1747, + 1709, 1734, 1736, 1739, 1733, 1737, 1744, 1609, 1574, 1575, 1574, 1749, 1574, 1608, + 1574, 1735, 1574, 1734, 1574, 1736, 1574, 1744, 1574, 1609, 1740, 1574, 1580, 1574, + 1581, 1574, 1605, 1574, 1610, 1576, 1580, 1576, 1581, 1576, 1582, 1576, 1605, 1576, + 1609, 1576, 1610, 1578, 1580, 1578, 1581, 1578, 1582, 1578, 1605, 1578, 1609, 1578, + 1610, 1579, 1580, 1579, 1605, 1579, 1609, 1579, 1610, 1580, 1581, 1580, 1605, 1581, + 1605, 1582, 1580, 1582, 1581, 1582, 1605, 1587, 1580, 1587, 1581, 1587, 1582, 1587, + 1605, 1589, 1581, 1589, 1605, 1590, 1580, 1590, 1581, 1590, 1582, 1590, 1605, 1591, + 1581, 1591, 1605, 1592, 1605, 1593, 1580, 1593, 1605, 1594, 1580, 1594, 1605, 1601, + 1580, 1601, 1581, 1601, 1582, 1601, 1605, 1601, 1609, 1601, 1610, 1602, 1581, 1602, + 1605, 1602, 1609, 1602, 1610, 1603, 1575, 1603, 1580, 1603, 1581, 1603, 1582, 1603, + 1604, 1603, 1605, 1603, 1609, 1603, 1610, 1604, 1580, 1604, 1581, 1604, 1582, 1604, + 1605, 1604, 1609, 1604, 1610, 1605, 1580, 1605, 1605, 1605, 1609, 1605, 1610, 1606, + 1580, 1606, 1581, 1606, 1582, 1606, 1605, 1606, 1609, 1606, 1610, 1607, 1580, 1607, + 1605, 1607, 1609, 1607, 1610, 1610, 1581, 1610, 1582, 1610, 1609, 1584, 1648, 1585, + 1648, 1609, 1648, 32, 1612, 1617, 32, 1613, 1617, 32, 1614, 1617, 32, 1615, 1617, + 32, 1616, 1617, 32, 1617, 1648, 1574, 1585, 1574, 1586, 1574, 1606, 1576, 1585, + 1576, 1586, 1576, 1606, 1578, 1585, 1578, 1586, 1578, 1606, 1579, 1585, 1579, 1586, + 1579, 1606, 1605, 1575, 1606, 1585, 1606, 1586, 1606, 1606, 1610, 1585, 1610, 1586, + 1574, 1582, 1574, 1607, 1576, 1607, 1578, 1607, 1589, 1582, 1604, 1607, 1606, 1607, + 1607, 1648, 1579, 1607, 1587, 1607, 1588, 1605, 1588, 1607, 1600, 1614, 1617, 1600, + 1615, 1617, 1600, 1616, 1617, 1591, 1609, 1591, 1610, 1593, 1609, 1593, 1610, 1594, + 1609, 1594, 1610, 1587, 1609, 1587, 1610, 1588, 1609, 1588, 1610, 1581, 1609, 1580, + 1609, 1580, 1610, 1582, 1609, 1589, 1609, 1589, 1610, 1590, 1609, 1590, 1610, 1588, + 1580, 1588, 1581, 1588, 1582, 1588, 1585, 1587, 1585, 1589, 1585, 1590, 1585, 1575, + 1611, 1578, 1580, 1605, 1578, 1581, 1580, 1578, 1581, 1605, 1578, 1582, 1605, 1578, + 1605, 1580, 1578, 1605, 1581, 1578, 1605, 1582, 1581, 1605, 1610, 1581, 1605, 1609, + 1587, 1581, 1580, 1587, 1580, 1581, 1587, 1580, 1609, 1587, 1605, 1581, 1587, 1605, + 1580, 1587, 1605, 1605, 1589, 1581, 1581, 1589, 1605, 1605, 1588, 1581, 1605, 1588, + 1580, 1610, 1588, 1605, 1582, 1588, 1605, 1605, 1590, 1581, 1609, 1590, 1582, 1605, + 1591, 1605, 1581, 1591, 1605, 1605, 1591, 1605, 1610, 1593, 1580, 1605, 1593, 1605, + 1605, 1593, 1605, 1609, 1594, 1605, 1605, 1594, 1605, 1610, 1594, 1605, 1609, 1601, + 1582, 1605, 1602, 1605, 1581, 1602, 1605, 1605, 1604, 1581, 1605, 1604, 1581, 1610, + 1604, 1581, 1609, 1604, 1580, 1580, 1604, 1582, 1605, 1604, 1605, 1581, 1605, 1581, + 1580, 1605, 1581, 1610, 1605, 1580, 1581, 1605, 1582, 1605, 1605, 1580, 1582, 1607, + 1605, 1580, 1607, 1605, 1605, 1606, 1581, 1605, 1606, 1581, 1609, 1606, 1580, 1605, + 1606, 1580, 1609, 1606, 1605, 1610, 1606, 1605, 1609, 1610, 1605, 1605, 1576, 1582, + 1610, 1578, 1580, 1610, 1578, 1580, 1609, 1578, 1582, 1610, 1578, 1582, 1609, 1578, + 1605, 1610, 1578, 1605, 1609, 1580, 1605, 1610, 1580, 1581, 1609, 1580, 1605, 1609, + 1587, 1582, 1609, 1589, 1581, 1610, 1588, 1581, 1610, 1590, 1581, 1610, 1604, 1580, + 1610, 1604, 1605, 1610, 1610, 1580, 1610, 1610, 1605, 1610, 1605, 1605, 1610, 1602, + 1605, 1610, 1606, 1581, 1610, 1593, 1605, 1610, 1603, 1605, 1610, 1606, 1580, 1581, + 1605, 1582, 1610, 1604, 1580, 1605, 1603, 1605, 1605, 1580, 1581, 1610, 1581, 1580, + 1610, 1605, 1580, 1610, 1601, 1605, 1610, 1576, 1581, 1610, 1587, 1582, 1610, 1606, + 1580, 1610, 1589, 1604, 1746, 1602, 1604, 1746, 1575, 1604, 1604, 1607, 1575, 1603, + 1576, 1585, 1605, 1581, 1605, 1583, 1589, 1604, 1593, 1605, 1585, 1587, 1608, 1604, + 1593, 1604, 1610, 1607, 1608, 1587, 1604, 1605, 1589, 1604, 1609, 1589, 1604, 1609, + 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, + 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1585, 1740, 1575, 1604, 44, 12289, + 12310, 12311, 8212, 8211, 95, 123, 125, 12308, 12309, 12304, 12305, 12298, 12299, + 12300, 12301, 12302, 12303, 91, 93, 35, 38, 42, 45, 60, 62, 92, 36, 37, 64, 32, + 1611, 1600, 1611, 1600, 1617, 32, 1618, 1600, 1618, 1569, 1570, 1571, 1572, 1573, + 1577, 1604, 1570, 1604, 1571, 1604, 1573, 34, 39, 94, 124, 126, 10629, 10630, 12539, + 12453, 12515, 162, 163, 172, 166, 165, 8361, 9474, 8592, 8593, 8594, 8595, 9632, + 9675, 66600, 66601, 66602, 66603, 66604, 66605, 66606, 66607, 66608, 66609, 66610, + 66611, 66612, 66613, 66614, 66615, 66616, 66617, 66618, 66619, 66620, 66621, 66622, + 66623, 66624, 66625, 66626, 66627, 66628, 66629, 66630, 66631, 66632, 66633, 66634, + 66635, 66636, 66637, 66638, 66639, 66776, 66777, 66778, 66779, 66780, 66781, 66782, + 66783, 66784, 66785, 66786, 66787, 66788, 66789, 66790, 66791, 66792, 66793, 66794, + 66795, 66796, 66797, 66798, 66799, 66800, 66801, 66802, 66803, 66804, 66805, 66806, + 66807, 66808, 66809, 66810, 66811, 66967, 66968, 66969, 66970, 66971, 66972, 66973, + 66974, 66975, 66976, 66977, 66979, 66980, 66981, 66982, 66983, 66984, 66985, 66986, + 66987, 66988, 66989, 66990, 66991, 66992, 66993, 66995, 66996, 66997, 66998, 66999, + 67000, 67001, 67003, 67004, 720, 721, 665, 675, 43878, 677, 676, 7569, 600, 606, + 681, 610, 667, 668, 615, 644, 682, 683, 122628, 42894, 622, 122629, 654, 122630, + 630, 631, 634, 122632, 638, 680, 678, 43879, 679, 11377, 655, 673, 674, 664, 448, + 449, 450, 122634, 122654, 68800, 68801, 68802, 68803, 68804, 68805, 68806, 68807, + 68808, 68809, 68810, 68811, 68812, 68813, 68814, 68815, 68816, 68817, 68818, 68819, + 68820, 68821, 68822, 68823, 68824, 68825, 68826, 68827, 68828, 68829, 68830, 68831, + 68832, 68833, 68834, 68835, 68836, 68837, 68838, 68839, 68840, 68841, 68842, 68843, + 68844, 68845, 68846, 68847, 68848, 68849, 68850, 68976, 68977, 68978, 68979, 68980, + 68981, 68982, 68983, 68984, 68985, 68986, 68987, 68988, 68989, 68990, 68991, 68992, + 68993, 68994, 68995, 68996, 68997, 71872, 71873, 71874, 71875, 71876, 71877, 71878, + 71879, 71880, 71881, 71882, 71883, 71884, 71885, 71886, 71887, 71888, 71889, 71890, + 71891, 71892, 71893, 71894, 71895, 71896, 71897, 71898, 71899, 71900, 71901, 71902, + 71903, 93792, 93793, 93794, 93795, 93796, 93797, 93798, 93799, 93800, 93801, 93802, + 93803, 93804, 93805, 93806, 93807, 93808, 93809, 93810, 93811, 93812, 93813, 93814, + 93815, 93816, 93817, 93818, 93819, 93820, 93821, 93822, 93823, 119127, 119141, 119128, + 119141, 119128, 119141, 119150, 119128, 119141, 119151, 119128, 119141, 119152, + 119128, 119141, 119153, 119128, 119141, 119154, 119225, 119141, 119226, 119141, + 119225, 119141, 119150, 119226, 119141, 119150, 119225, 119141, 119151, 119226, + 119141, 119151, 305, 567, 8711, 8706, 125218, 125219, 125220, 125221, 125222, 125223, + 125224, 125225, 125226, 125227, 125228, 125229, 125230, 125231, 125232, 125233, + 125234, 125235, 125236, 125237, 125238, 125239, 125240, 125241, 125242, 125243, + 125244, 125245, 125246, 125247, 125248, 125249, 125250, 125251, 1646, 1697, 1647, + 48, 44, 49, 44, 50, 44, 51, 44, 52, 44, 53, 44, 54, 44, 55, 44, 56, 44, 57, 44, + 12308, 115, 12309, 119, 122, 104, 118, 115, 100, 115, 115, 112, 112, 118, 119, 99, + 109, 114, 100, 106, 12411, 12363, 12467, 12467, 23383, 21452, 22810, 35299, 20132, + 26144, 28961, 21069, 24460, 20877, 26032, 21021, 32066, 36009, 22768, 21561, 28436, + 25237, 25429, 36938, 25351, 25171, 31105, 31354, 21512, 28288, 30003, 21106, 21942, + 37197, 12308, 26412, 12309, 12308, 19977, 12309, 12308, 20108, 12309, 12308, 23433, + 12309, 12308, 28857, 12309, 12308, 25171, 12309, 12308, 30423, 12309, 12308, 21213, + 12309, 12308, 25943, 12309, 24471, 21487, 20029, 20024, 20033, 131362, 20320, 20411, + 20482, 20602, 20633, 20687, 13470, 132666, 20820, 20836, 20855, 132380, 13497, 20839, + 132427, 20887, 20900, 20172, 20908, 168415, 20995, 13535, 21051, 21062, 21111, 13589, + 21253, 21254, 21321, 21338, 21363, 21373, 21375, 133676, 28784, 21450, 21471, 133987, + 21483, 21489, 21510, 21662, 21560, 21576, 21608, 21666, 21750, 21776, 21843, 21859, + 21892, 21931, 21939, 21954, 22294, 22295, 22097, 22132, 22766, 22478, 22516, 22541, + 22411, 22578, 22577, 22700, 136420, 22770, 22775, 22790, 22818, 22882, 136872, 136938, + 23020, 23067, 23079, 23000, 23142, 14062, 14076, 23304, 23358, 137672, 23491, 23512, + 23539, 138008, 23551, 23558, 24403, 14209, 23648, 23744, 23693, 138724, 23875, 138726, + 23918, 23915, 23932, 24033, 24034, 14383, 24061, 24104, 24125, 24169, 14434, 139651, + 14460, 24240, 24243, 24246, 172946, 140081, 33281, 24354, 14535, 144056, 156122, + 24418, 24427, 14563, 24474, 24525, 24535, 24569, 24705, 14650, 14620, 141012, 24775, + 24904, 24908, 24954, 25010, 24996, 25007, 25054, 25115, 25181, 25265, 25300, 25424, + 142092, 25405, 25340, 25448, 25475, 25572, 142321, 25634, 25541, 25513, 14894, 25705, + 25726, 25757, 25719, 14956, 25964, 143370, 26083, 26360, 26185, 15129, 15112, 15076, + 20882, 20885, 26368, 26268, 32941, 17369, 26401, 26462, 26451, 144323, 15177, 26618, + 26501, 26706, 144493, 26766, 26655, 26900, 26946, 27043, 27114, 27304, 145059, 27355, + 15384, 27425, 145575, 27476, 15438, 27506, 27551, 27579, 146061, 138507, 146170, + 27726, 146620, 27839, 27853, 27751, 27926, 27966, 28009, 28024, 28037, 146718, 27956, + 28207, 28270, 15667, 28359, 147153, 28153, 28526, 147294, 147342, 28614, 28729, + 28699, 15766, 28746, 28797, 28791, 28845, 132389, 28997, 148067, 29084, 148395, + 29224, 29264, 149000, 29312, 29333, 149301, 149524, 29562, 29579, 16044, 29605, + 16056, 29767, 29788, 29829, 29898, 16155, 29988, 150582, 30014, 150674, 139679, + 30224, 151457, 151480, 151620, 16380, 16392, 151795, 151794, 151833, 151859, 30494, + 30495, 30603, 16454, 16534, 152605, 30798, 16611, 153126, 153242, 153285, 31211, + 16687, 31306, 31311, 153980, 154279, 31470, 16898, 154539, 31686, 31689, 16935, + 154752, 31954, 17056, 31976, 31971, 32000, 155526, 32099, 17153, 32199, 32258, 32325, + 17204, 156200, 156231, 17241, 156377, 32634, 156478, 32661, 32762, 156890, 156963, + 32864, 157096, 32880, 144223, 17365, 32946, 33027, 17419, 33086, 23221, 157607, + 157621, 144275, 144284, 33284, 36766, 17515, 33425, 33419, 33437, 21171, 33457, + 33459, 33469, 33510, 158524, 33565, 33635, 33709, 33571, 33725, 33767, 33619, 33738, + 33740, 33756, 158774, 159083, 158933, 17707, 34033, 34035, 34070, 160714, 34148, + 159532, 17757, 17761, 159665, 159954, 17771, 34384, 34407, 34409, 34473, 34440, + 34574, 34530, 34600, 34667, 34694, 17879, 34785, 34817, 17913, 34912, 161383, 35031, + 35038, 17973, 35066, 13499, 161966, 162150, 18110, 18119, 35488, 162984, 36011, + 36033, 36123, 36215, 163631, 133124, 36299, 36284, 36336, 133342, 36564, 165330, + 165357, 37012, 37105, 37137, 165678, 37147, 37432, 37591, 37592, 37500, 37881, 37909, + 166906, 38283, 18837, 38327, 167287, 18918, 38595, 23986, 38691, 168261, 168474, + 19054, 19062, 38880, 168970, 19122, 169110, 38953, 169398, 39138, 19251, 39209, + 39335, 39362, 39422, 19406, 170800, 40000, 40189, 19662, 19693, 40295, 172238, 19704, + 172293, 172558, 172689, 19798, 40702, 40709, 40719, 40726, 173568, }; -const uint32_t table[8002][2] = +const uint32_t table[8150][2] = { {0, 1}, {65, 16777219}, {66, 16777475}, {67, 16777731}, {68, 16777987}, {69, 16778243}, {70, 16778499}, {71, 16778755}, @@ -884,73 +890,73 @@ const uint32_t table[8002][2] = {1204, 16884483}, {1205, 1}, {1206, 16884739}, {1207, 1}, {1208, 16884995}, {1209, 1}, {1210, 16885251}, {1211, 1}, {1212, 16885507}, {1213, 1}, {1214, 16885763}, {1215, 1}, - {1216, 2}, {1217, 16886019}, {1218, 1}, {1219, 16886275}, - {1220, 1}, {1221, 16886531}, {1222, 1}, {1223, 16886787}, - {1224, 1}, {1225, 16887043}, {1226, 1}, {1227, 16887299}, - {1228, 1}, {1229, 16887555}, {1230, 1}, {1232, 16887811}, - {1233, 1}, {1234, 16888067}, {1235, 1}, {1236, 16888323}, - {1237, 1}, {1238, 16888579}, {1239, 1}, {1240, 16888835}, - {1241, 1}, {1242, 16889091}, {1243, 1}, {1244, 16889347}, - {1245, 1}, {1246, 16889603}, {1247, 1}, {1248, 16889859}, - {1249, 1}, {1250, 16890115}, {1251, 1}, {1252, 16890371}, - {1253, 1}, {1254, 16890627}, {1255, 1}, {1256, 16890883}, - {1257, 1}, {1258, 16891139}, {1259, 1}, {1260, 16891395}, - {1261, 1}, {1262, 16891651}, {1263, 1}, {1264, 16891907}, - {1265, 1}, {1266, 16892163}, {1267, 1}, {1268, 16892419}, - {1269, 1}, {1270, 16892675}, {1271, 1}, {1272, 16892931}, - {1273, 1}, {1274, 16893187}, {1275, 1}, {1276, 16893443}, - {1277, 1}, {1278, 16893699}, {1279, 1}, {1280, 16893955}, - {1281, 1}, {1282, 16894211}, {1283, 1}, {1284, 16894467}, - {1285, 1}, {1286, 16894723}, {1287, 1}, {1288, 16894979}, - {1289, 1}, {1290, 16895235}, {1291, 1}, {1292, 16895491}, - {1293, 1}, {1294, 16895747}, {1295, 1}, {1296, 16896003}, - {1297, 1}, {1298, 16896259}, {1299, 1}, {1300, 16896515}, - {1301, 1}, {1302, 16896771}, {1303, 1}, {1304, 16897027}, - {1305, 1}, {1306, 16897283}, {1307, 1}, {1308, 16897539}, - {1309, 1}, {1310, 16897795}, {1311, 1}, {1312, 16898051}, - {1313, 1}, {1314, 16898307}, {1315, 1}, {1316, 16898563}, - {1317, 1}, {1318, 16898819}, {1319, 1}, {1320, 16899075}, - {1321, 1}, {1322, 16899331}, {1323, 1}, {1324, 16899587}, - {1325, 1}, {1326, 16899843}, {1327, 1}, {1328, 2}, - {1329, 16900099}, {1330, 16900355}, {1331, 16900611}, {1332, 16900867}, - {1333, 16901123}, {1334, 16901379}, {1335, 16901635}, {1336, 16901891}, - {1337, 16902147}, {1338, 16902403}, {1339, 16902659}, {1340, 16902915}, - {1341, 16903171}, {1342, 16903427}, {1343, 16903683}, {1344, 16903939}, - {1345, 16904195}, {1346, 16904451}, {1347, 16904707}, {1348, 16904963}, - {1349, 16905219}, {1350, 16905475}, {1351, 16905731}, {1352, 16905987}, - {1353, 16906243}, {1354, 16906499}, {1355, 16906755}, {1356, 16907011}, - {1357, 16907267}, {1358, 16907523}, {1359, 16907779}, {1360, 16908035}, - {1361, 16908291}, {1362, 16908547}, {1363, 16908803}, {1364, 16909059}, - {1365, 16909315}, {1366, 16909571}, {1367, 2}, {1369, 1}, - {1415, 33687043}, {1416, 1}, {1419, 2}, {1421, 1}, + {1216, 16886019}, {1217, 16886275}, {1218, 1}, {1219, 16886531}, + {1220, 1}, {1221, 16886787}, {1222, 1}, {1223, 16887043}, + {1224, 1}, {1225, 16887299}, {1226, 1}, {1227, 16887555}, + {1228, 1}, {1229, 16887811}, {1230, 1}, {1232, 16888067}, + {1233, 1}, {1234, 16888323}, {1235, 1}, {1236, 16888579}, + {1237, 1}, {1238, 16888835}, {1239, 1}, {1240, 16889091}, + {1241, 1}, {1242, 16889347}, {1243, 1}, {1244, 16889603}, + {1245, 1}, {1246, 16889859}, {1247, 1}, {1248, 16890115}, + {1249, 1}, {1250, 16890371}, {1251, 1}, {1252, 16890627}, + {1253, 1}, {1254, 16890883}, {1255, 1}, {1256, 16891139}, + {1257, 1}, {1258, 16891395}, {1259, 1}, {1260, 16891651}, + {1261, 1}, {1262, 16891907}, {1263, 1}, {1264, 16892163}, + {1265, 1}, {1266, 16892419}, {1267, 1}, {1268, 16892675}, + {1269, 1}, {1270, 16892931}, {1271, 1}, {1272, 16893187}, + {1273, 1}, {1274, 16893443}, {1275, 1}, {1276, 16893699}, + {1277, 1}, {1278, 16893955}, {1279, 1}, {1280, 16894211}, + {1281, 1}, {1282, 16894467}, {1283, 1}, {1284, 16894723}, + {1285, 1}, {1286, 16894979}, {1287, 1}, {1288, 16895235}, + {1289, 1}, {1290, 16895491}, {1291, 1}, {1292, 16895747}, + {1293, 1}, {1294, 16896003}, {1295, 1}, {1296, 16896259}, + {1297, 1}, {1298, 16896515}, {1299, 1}, {1300, 16896771}, + {1301, 1}, {1302, 16897027}, {1303, 1}, {1304, 16897283}, + {1305, 1}, {1306, 16897539}, {1307, 1}, {1308, 16897795}, + {1309, 1}, {1310, 16898051}, {1311, 1}, {1312, 16898307}, + {1313, 1}, {1314, 16898563}, {1315, 1}, {1316, 16898819}, + {1317, 1}, {1318, 16899075}, {1319, 1}, {1320, 16899331}, + {1321, 1}, {1322, 16899587}, {1323, 1}, {1324, 16899843}, + {1325, 1}, {1326, 16900099}, {1327, 1}, {1328, 2}, + {1329, 16900355}, {1330, 16900611}, {1331, 16900867}, {1332, 16901123}, + {1333, 16901379}, {1334, 16901635}, {1335, 16901891}, {1336, 16902147}, + {1337, 16902403}, {1338, 16902659}, {1339, 16902915}, {1340, 16903171}, + {1341, 16903427}, {1342, 16903683}, {1343, 16903939}, {1344, 16904195}, + {1345, 16904451}, {1346, 16904707}, {1347, 16904963}, {1348, 16905219}, + {1349, 16905475}, {1350, 16905731}, {1351, 16905987}, {1352, 16906243}, + {1353, 16906499}, {1354, 16906755}, {1355, 16907011}, {1356, 16907267}, + {1357, 16907523}, {1358, 16907779}, {1359, 16908035}, {1360, 16908291}, + {1361, 16908547}, {1362, 16908803}, {1363, 16909059}, {1364, 16909315}, + {1365, 16909571}, {1366, 16909827}, {1367, 2}, {1369, 1}, + {1415, 33687299}, {1416, 1}, {1419, 2}, {1421, 1}, {1424, 2}, {1425, 1}, {1480, 2}, {1488, 1}, {1515, 2}, {1519, 1}, {1525, 2}, {1542, 1}, - {1564, 2}, {1565, 1}, {1653, 33687555}, {1654, 33688067}, - {1655, 33688579}, {1656, 33689091}, {1657, 1}, {1757, 2}, + {1564, 2}, {1565, 1}, {1653, 33687811}, {1654, 33688323}, + {1655, 33688835}, {1656, 33689347}, {1657, 1}, {1757, 2}, {1758, 1}, {1806, 2}, {1808, 1}, {1867, 2}, {1869, 1}, {1970, 2}, {1984, 1}, {2043, 2}, {2045, 1}, {2094, 2}, {2096, 1}, {2111, 2}, {2112, 1}, {2140, 2}, {2142, 1}, {2143, 2}, {2144, 1}, {2155, 2}, {2160, 1}, {2191, 2}, - {2200, 1}, {2274, 2}, {2275, 1}, {2392, 33689603}, - {2393, 33690115}, {2394, 33690627}, {2395, 33691139}, {2396, 33691651}, - {2397, 33692163}, {2398, 33692675}, {2399, 33693187}, {2400, 1}, + {2199, 1}, {2274, 2}, {2275, 1}, {2392, 33689859}, + {2393, 33690371}, {2394, 33690883}, {2395, 33691395}, {2396, 33691907}, + {2397, 33692419}, {2398, 33692931}, {2399, 33693443}, {2400, 1}, {2436, 2}, {2437, 1}, {2445, 2}, {2447, 1}, {2449, 2}, {2451, 1}, {2473, 2}, {2474, 1}, {2481, 2}, {2482, 1}, {2483, 2}, {2486, 1}, {2490, 2}, {2492, 1}, {2501, 2}, {2503, 1}, {2505, 2}, {2507, 1}, {2511, 2}, {2519, 1}, - {2520, 2}, {2524, 33693699}, {2525, 33694211}, {2526, 2}, - {2527, 33694723}, {2528, 1}, {2532, 2}, {2534, 1}, + {2520, 2}, {2524, 33693955}, {2525, 33694467}, {2526, 2}, + {2527, 33694979}, {2528, 1}, {2532, 2}, {2534, 1}, {2559, 2}, {2561, 1}, {2564, 2}, {2565, 1}, {2571, 2}, {2575, 1}, {2577, 2}, {2579, 1}, {2601, 2}, {2602, 1}, {2609, 2}, {2610, 1}, - {2611, 33695235}, {2612, 2}, {2613, 1}, {2614, 33695747}, + {2611, 33695491}, {2612, 2}, {2613, 1}, {2614, 33696003}, {2615, 2}, {2616, 1}, {2618, 2}, {2620, 1}, {2621, 2}, {2622, 1}, {2627, 2}, {2631, 1}, {2633, 2}, {2635, 1}, {2638, 2}, {2641, 1}, - {2642, 2}, {2649, 33696259}, {2650, 33696771}, {2651, 33697283}, - {2652, 1}, {2653, 2}, {2654, 33697795}, {2655, 2}, + {2642, 2}, {2649, 33696515}, {2650, 33697027}, {2651, 33697539}, + {2652, 1}, {2653, 2}, {2654, 33698051}, {2655, 2}, {2662, 1}, {2679, 2}, {2689, 1}, {2692, 2}, {2693, 1}, {2702, 2}, {2703, 1}, {2706, 2}, {2707, 1}, {2729, 2}, {2730, 1}, {2737, 2}, @@ -964,7 +970,7 @@ const uint32_t table[8002][2] = {2866, 1}, {2868, 2}, {2869, 1}, {2874, 2}, {2876, 1}, {2885, 2}, {2887, 1}, {2889, 2}, {2891, 1}, {2894, 2}, {2901, 1}, {2904, 2}, - {2908, 33698307}, {2909, 33698819}, {2910, 2}, {2911, 1}, + {2908, 33698563}, {2909, 33699075}, {2910, 2}, {2911, 1}, {2916, 2}, {2918, 1}, {2936, 2}, {2946, 1}, {2948, 2}, {2949, 1}, {2955, 2}, {2958, 1}, {2961, 2}, {2962, 1}, {2966, 2}, {2969, 1}, @@ -996,1728 +1002,1765 @@ const uint32_t table[8002][2] = {3531, 2}, {3535, 1}, {3541, 2}, {3542, 1}, {3543, 2}, {3544, 1}, {3552, 2}, {3558, 1}, {3568, 2}, {3570, 1}, {3573, 2}, {3585, 1}, - {3635, 33699331}, {3636, 1}, {3643, 2}, {3647, 1}, + {3635, 33699587}, {3636, 1}, {3643, 2}, {3647, 1}, {3676, 2}, {3713, 1}, {3715, 2}, {3716, 1}, {3717, 2}, {3718, 1}, {3723, 2}, {3724, 1}, {3748, 2}, {3749, 1}, {3750, 2}, {3751, 1}, - {3763, 33699843}, {3764, 1}, {3774, 2}, {3776, 1}, + {3763, 33700099}, {3764, 1}, {3774, 2}, {3776, 1}, {3781, 2}, {3782, 1}, {3783, 2}, {3784, 1}, - {3791, 2}, {3792, 1}, {3802, 2}, {3804, 33700355}, - {3805, 33700867}, {3806, 1}, {3808, 2}, {3840, 1}, - {3852, 16924163}, {3853, 1}, {3907, 33701635}, {3908, 1}, - {3912, 2}, {3913, 1}, {3917, 33702147}, {3918, 1}, - {3922, 33702659}, {3923, 1}, {3927, 33703171}, {3928, 1}, - {3932, 33703683}, {3933, 1}, {3945, 33704195}, {3946, 1}, - {3949, 2}, {3953, 1}, {3955, 33704707}, {3956, 1}, - {3957, 33705219}, {3958, 33705731}, {3959, 50483459}, {3960, 33707011}, - {3961, 50484739}, {3962, 1}, {3969, 33706499}, {3970, 1}, - {3987, 33708291}, {3988, 1}, {3992, 2}, {3993, 1}, - {3997, 33708803}, {3998, 1}, {4002, 33709315}, {4003, 1}, - {4007, 33709827}, {4008, 1}, {4012, 33710339}, {4013, 1}, - {4025, 33710851}, {4026, 1}, {4029, 2}, {4030, 1}, + {3791, 2}, {3792, 1}, {3802, 2}, {3804, 33700611}, + {3805, 33701123}, {3806, 1}, {3808, 2}, {3840, 1}, + {3852, 16924419}, {3853, 1}, {3907, 33701891}, {3908, 1}, + {3912, 2}, {3913, 1}, {3917, 33702403}, {3918, 1}, + {3922, 33702915}, {3923, 1}, {3927, 33703427}, {3928, 1}, + {3932, 33703939}, {3933, 1}, {3945, 33704451}, {3946, 1}, + {3949, 2}, {3953, 1}, {3955, 33704963}, {3956, 1}, + {3957, 33705475}, {3958, 33705987}, {3959, 50483715}, {3960, 33707267}, + {3961, 50484995}, {3962, 1}, {3969, 33706755}, {3970, 1}, + {3987, 33708547}, {3988, 1}, {3992, 2}, {3993, 1}, + {3997, 33709059}, {3998, 1}, {4002, 33709571}, {4003, 1}, + {4007, 33710083}, {4008, 1}, {4012, 33710595}, {4013, 1}, + {4025, 33711107}, {4026, 1}, {4029, 2}, {4030, 1}, {4045, 2}, {4046, 1}, {4059, 2}, {4096, 1}, - {4256, 2}, {4295, 16934147}, {4296, 2}, {4301, 16934403}, - {4302, 2}, {4304, 1}, {4348, 16934659}, {4349, 1}, - {4447, 2}, {4449, 1}, {4681, 2}, {4682, 1}, - {4686, 2}, {4688, 1}, {4695, 2}, {4696, 1}, - {4697, 2}, {4698, 1}, {4702, 2}, {4704, 1}, - {4745, 2}, {4746, 1}, {4750, 2}, {4752, 1}, - {4785, 2}, {4786, 1}, {4790, 2}, {4792, 1}, - {4799, 2}, {4800, 1}, {4801, 2}, {4802, 1}, - {4806, 2}, {4808, 1}, {4823, 2}, {4824, 1}, - {4881, 2}, {4882, 1}, {4886, 2}, {4888, 1}, - {4955, 2}, {4957, 1}, {4989, 2}, {4992, 1}, - {5018, 2}, {5024, 1}, {5110, 2}, {5112, 16934915}, - {5113, 16935171}, {5114, 16935427}, {5115, 16935683}, {5116, 16935939}, - {5117, 16936195}, {5118, 2}, {5120, 1}, {5760, 2}, - {5761, 1}, {5789, 2}, {5792, 1}, {5881, 2}, - {5888, 1}, {5910, 2}, {5919, 1}, {5943, 2}, - {5952, 1}, {5972, 2}, {5984, 1}, {5997, 2}, - {5998, 1}, {6001, 2}, {6002, 1}, {6004, 2}, - {6016, 1}, {6068, 2}, {6070, 1}, {6110, 2}, - {6112, 1}, {6122, 2}, {6128, 1}, {6138, 2}, - {6144, 1}, {6150, 2}, {6151, 1}, {6155, 0}, - {6158, 2}, {6159, 0}, {6160, 1}, {6170, 2}, - {6176, 1}, {6265, 2}, {6272, 1}, {6315, 2}, - {6320, 1}, {6390, 2}, {6400, 1}, {6431, 2}, - {6432, 1}, {6444, 2}, {6448, 1}, {6460, 2}, - {6464, 1}, {6465, 2}, {6468, 1}, {6510, 2}, - {6512, 1}, {6517, 2}, {6528, 1}, {6572, 2}, - {6576, 1}, {6602, 2}, {6608, 1}, {6619, 2}, - {6622, 1}, {6684, 2}, {6686, 1}, {6751, 2}, - {6752, 1}, {6781, 2}, {6783, 1}, {6794, 2}, - {6800, 1}, {6810, 2}, {6816, 1}, {6830, 2}, - {6832, 1}, {6863, 2}, {6912, 1}, {6989, 2}, - {6992, 1}, {7039, 2}, {7040, 1}, {7156, 2}, + {4256, 16934403}, {4257, 16934659}, {4258, 16934915}, {4259, 16935171}, + {4260, 16935427}, {4261, 16935683}, {4262, 16935939}, {4263, 16936195}, + {4264, 16936451}, {4265, 16936707}, {4266, 16936963}, {4267, 16937219}, + {4268, 16937475}, {4269, 16937731}, {4270, 16937987}, {4271, 16938243}, + {4272, 16938499}, {4273, 16938755}, {4274, 16939011}, {4275, 16939267}, + {4276, 16939523}, {4277, 16939779}, {4278, 16940035}, {4279, 16940291}, + {4280, 16940547}, {4281, 16940803}, {4282, 16941059}, {4283, 16941315}, + {4284, 16941571}, {4285, 16941827}, {4286, 16942083}, {4287, 16942339}, + {4288, 16942595}, {4289, 16942851}, {4290, 16943107}, {4291, 16943363}, + {4292, 16943619}, {4293, 16943875}, {4294, 2}, {4295, 16944131}, + {4296, 2}, {4301, 16944387}, {4302, 2}, {4304, 1}, + {4348, 16944643}, {4349, 1}, {4447, 0}, {4449, 1}, + {4681, 2}, {4682, 1}, {4686, 2}, {4688, 1}, + {4695, 2}, {4696, 1}, {4697, 2}, {4698, 1}, + {4702, 2}, {4704, 1}, {4745, 2}, {4746, 1}, + {4750, 2}, {4752, 1}, {4785, 2}, {4786, 1}, + {4790, 2}, {4792, 1}, {4799, 2}, {4800, 1}, + {4801, 2}, {4802, 1}, {4806, 2}, {4808, 1}, + {4823, 2}, {4824, 1}, {4881, 2}, {4882, 1}, + {4886, 2}, {4888, 1}, {4955, 2}, {4957, 1}, + {4989, 2}, {4992, 1}, {5018, 2}, {5024, 1}, + {5110, 2}, {5112, 16944899}, {5113, 16945155}, {5114, 16945411}, + {5115, 16945667}, {5116, 16945923}, {5117, 16946179}, {5118, 2}, + {5120, 1}, {5760, 2}, {5761, 1}, {5789, 2}, + {5792, 1}, {5881, 2}, {5888, 1}, {5910, 2}, + {5919, 1}, {5943, 2}, {5952, 1}, {5972, 2}, + {5984, 1}, {5997, 2}, {5998, 1}, {6001, 2}, + {6002, 1}, {6004, 2}, {6016, 1}, {6068, 0}, + {6070, 1}, {6110, 2}, {6112, 1}, {6122, 2}, + {6128, 1}, {6138, 2}, {6144, 1}, {6155, 0}, + {6160, 1}, {6170, 2}, {6176, 1}, {6265, 2}, + {6272, 1}, {6315, 2}, {6320, 1}, {6390, 2}, + {6400, 1}, {6431, 2}, {6432, 1}, {6444, 2}, + {6448, 1}, {6460, 2}, {6464, 1}, {6465, 2}, + {6468, 1}, {6510, 2}, {6512, 1}, {6517, 2}, + {6528, 1}, {6572, 2}, {6576, 1}, {6602, 2}, + {6608, 1}, {6619, 2}, {6622, 1}, {6684, 2}, + {6686, 1}, {6751, 2}, {6752, 1}, {6781, 2}, + {6783, 1}, {6794, 2}, {6800, 1}, {6810, 2}, + {6816, 1}, {6830, 2}, {6832, 1}, {6863, 2}, + {6912, 1}, {6989, 2}, {6990, 1}, {7156, 2}, {7164, 1}, {7224, 2}, {7227, 1}, {7242, 2}, {7245, 1}, {7296, 16867075}, {7297, 16867587}, {7298, 16870147}, {7299, 16870915}, {7300, 16871171}, {7302, 16873219}, {7303, 16875011}, - {7304, 16936451}, {7305, 2}, {7312, 16936707}, {7313, 16936963}, - {7314, 16937219}, {7315, 16937475}, {7316, 16937731}, {7317, 16937987}, - {7318, 16938243}, {7319, 16938499}, {7320, 16938755}, {7321, 16939011}, - {7322, 16939267}, {7323, 16939523}, {7324, 16934659}, {7325, 16939779}, - {7326, 16940035}, {7327, 16940291}, {7328, 16940547}, {7329, 16940803}, - {7330, 16941059}, {7331, 16941315}, {7332, 16941571}, {7333, 16941827}, - {7334, 16942083}, {7335, 16942339}, {7336, 16942595}, {7337, 16942851}, - {7338, 16943107}, {7339, 16943363}, {7340, 16943619}, {7341, 16943875}, - {7342, 16944131}, {7343, 16944387}, {7344, 16944643}, {7345, 16944899}, - {7346, 16945155}, {7347, 16945411}, {7348, 16945667}, {7349, 16945923}, - {7350, 16946179}, {7351, 16946435}, {7352, 16946691}, {7353, 16946947}, - {7354, 16947203}, {7355, 2}, {7357, 16947459}, {7358, 16947715}, - {7359, 16947971}, {7360, 1}, {7368, 2}, {7376, 1}, - {7419, 2}, {7424, 1}, {7468, 16777219}, {7469, 16791043}, - {7470, 16777475}, {7471, 1}, {7472, 16777987}, {7473, 16778243}, - {7474, 16816131}, {7475, 16778755}, {7476, 16779011}, {7477, 16779267}, - {7478, 16779523}, {7479, 16779779}, {7480, 16780035}, {7481, 16780291}, - {7482, 16780547}, {7483, 1}, {7484, 16780803}, {7485, 16835843}, - {7486, 16781059}, {7487, 16781571}, {7488, 16782083}, {7489, 16782339}, - {7490, 16782851}, {7491, 16777219}, {7492, 16948227}, {7493, 16948483}, - {7494, 16948739}, {7495, 16777475}, {7496, 16777987}, {7497, 16778243}, - {7498, 16816387}, {7499, 16816643}, {7500, 16948995}, {7501, 16778755}, - {7502, 1}, {7503, 16779779}, {7504, 16780291}, {7505, 16807171}, - {7506, 16780803}, {7507, 16814851}, {7508, 16949251}, {7509, 16949507}, - {7510, 16781059}, {7511, 16782083}, {7512, 16782339}, {7513, 16949763}, - {7514, 16818435}, {7515, 16782595}, {7516, 16950019}, {7517, 16851971}, - {7518, 16852227}, {7519, 16852483}, {7520, 16856323}, {7521, 16856579}, - {7522, 16779267}, {7523, 16781571}, {7524, 16782339}, {7525, 16782595}, - {7526, 16851971}, {7527, 16852227}, {7528, 16855299}, {7529, 16856323}, - {7530, 16856579}, {7531, 1}, {7544, 16869891}, {7545, 1}, - {7579, 16950275}, {7580, 16777731}, {7581, 16950531}, {7582, 16793603}, - {7583, 16948995}, {7584, 16778499}, {7585, 16950787}, {7586, 16951043}, - {7587, 16951299}, {7588, 16817923}, {7589, 16817667}, {7590, 16951555}, - {7591, 16951811}, {7592, 16952067}, {7593, 16952323}, {7594, 16952579}, - {7595, 16952835}, {7596, 16953091}, {7597, 16953347}, {7598, 16818691}, - {7599, 16953603}, {7600, 16953859}, {7601, 16818947}, {7602, 16954115}, - {7603, 16954371}, {7604, 16820483}, {7605, 16954627}, {7606, 16839683}, - {7607, 16821507}, {7608, 16954883}, {7609, 16821763}, {7610, 16839939}, - {7611, 16783619}, {7612, 16955139}, {7613, 16955395}, {7614, 16822531}, - {7615, 16853507}, {7616, 1}, {7680, 16955651}, {7681, 1}, - {7682, 16955907}, {7683, 1}, {7684, 16956163}, {7685, 1}, - {7686, 16956419}, {7687, 1}, {7688, 16956675}, {7689, 1}, - {7690, 16956931}, {7691, 1}, {7692, 16957187}, {7693, 1}, - {7694, 16957443}, {7695, 1}, {7696, 16957699}, {7697, 1}, - {7698, 16957955}, {7699, 1}, {7700, 16958211}, {7701, 1}, - {7702, 16958467}, {7703, 1}, {7704, 16958723}, {7705, 1}, - {7706, 16958979}, {7707, 1}, {7708, 16959235}, {7709, 1}, - {7710, 16959491}, {7711, 1}, {7712, 16959747}, {7713, 1}, - {7714, 16960003}, {7715, 1}, {7716, 16960259}, {7717, 1}, - {7718, 16960515}, {7719, 1}, {7720, 16960771}, {7721, 1}, - {7722, 16961027}, {7723, 1}, {7724, 16961283}, {7725, 1}, - {7726, 16961539}, {7727, 1}, {7728, 16961795}, {7729, 1}, - {7730, 16962051}, {7731, 1}, {7732, 16962307}, {7733, 1}, - {7734, 16962563}, {7735, 1}, {7736, 16962819}, {7737, 1}, - {7738, 16963075}, {7739, 1}, {7740, 16963331}, {7741, 1}, - {7742, 16963587}, {7743, 1}, {7744, 16963843}, {7745, 1}, - {7746, 16964099}, {7747, 1}, {7748, 16964355}, {7749, 1}, - {7750, 16964611}, {7751, 1}, {7752, 16964867}, {7753, 1}, - {7754, 16965123}, {7755, 1}, {7756, 16965379}, {7757, 1}, - {7758, 16965635}, {7759, 1}, {7760, 16965891}, {7761, 1}, - {7762, 16966147}, {7763, 1}, {7764, 16966403}, {7765, 1}, - {7766, 16966659}, {7767, 1}, {7768, 16966915}, {7769, 1}, - {7770, 16967171}, {7771, 1}, {7772, 16967427}, {7773, 1}, - {7774, 16967683}, {7775, 1}, {7776, 16967939}, {7777, 1}, - {7778, 16968195}, {7779, 1}, {7780, 16968451}, {7781, 1}, - {7782, 16968707}, {7783, 1}, {7784, 16968963}, {7785, 1}, - {7786, 16969219}, {7787, 1}, {7788, 16969475}, {7789, 1}, - {7790, 16969731}, {7791, 1}, {7792, 16969987}, {7793, 1}, - {7794, 16970243}, {7795, 1}, {7796, 16970499}, {7797, 1}, - {7798, 16970755}, {7799, 1}, {7800, 16971011}, {7801, 1}, - {7802, 16971267}, {7803, 1}, {7804, 16971523}, {7805, 1}, - {7806, 16971779}, {7807, 1}, {7808, 16972035}, {7809, 1}, - {7810, 16972291}, {7811, 1}, {7812, 16972547}, {7813, 1}, - {7814, 16972803}, {7815, 1}, {7816, 16973059}, {7817, 1}, - {7818, 16973315}, {7819, 1}, {7820, 16973571}, {7821, 1}, - {7822, 16973827}, {7823, 1}, {7824, 16974083}, {7825, 1}, - {7826, 16974339}, {7827, 1}, {7828, 16974595}, {7829, 1}, - {7834, 33752067}, {7835, 16967939}, {7836, 1}, {7838, 16975363}, - {7839, 1}, {7840, 16975619}, {7841, 1}, {7842, 16975875}, - {7843, 1}, {7844, 16976131}, {7845, 1}, {7846, 16976387}, - {7847, 1}, {7848, 16976643}, {7849, 1}, {7850, 16976899}, - {7851, 1}, {7852, 16977155}, {7853, 1}, {7854, 16977411}, - {7855, 1}, {7856, 16977667}, {7857, 1}, {7858, 16977923}, - {7859, 1}, {7860, 16978179}, {7861, 1}, {7862, 16978435}, - {7863, 1}, {7864, 16978691}, {7865, 1}, {7866, 16978947}, - {7867, 1}, {7868, 16979203}, {7869, 1}, {7870, 16979459}, - {7871, 1}, {7872, 16979715}, {7873, 1}, {7874, 16979971}, - {7875, 1}, {7876, 16980227}, {7877, 1}, {7878, 16980483}, - {7879, 1}, {7880, 16980739}, {7881, 1}, {7882, 16980995}, - {7883, 1}, {7884, 16981251}, {7885, 1}, {7886, 16981507}, - {7887, 1}, {7888, 16981763}, {7889, 1}, {7890, 16982019}, - {7891, 1}, {7892, 16982275}, {7893, 1}, {7894, 16982531}, - {7895, 1}, {7896, 16982787}, {7897, 1}, {7898, 16983043}, - {7899, 1}, {7900, 16983299}, {7901, 1}, {7902, 16983555}, - {7903, 1}, {7904, 16983811}, {7905, 1}, {7906, 16984067}, - {7907, 1}, {7908, 16984323}, {7909, 1}, {7910, 16984579}, - {7911, 1}, {7912, 16984835}, {7913, 1}, {7914, 16985091}, - {7915, 1}, {7916, 16985347}, {7917, 1}, {7918, 16985603}, - {7919, 1}, {7920, 16985859}, {7921, 1}, {7922, 16986115}, - {7923, 1}, {7924, 16986371}, {7925, 1}, {7926, 16986627}, - {7927, 1}, {7928, 16986883}, {7929, 1}, {7930, 16987139}, - {7931, 1}, {7932, 16987395}, {7933, 1}, {7934, 16987651}, - {7935, 1}, {7944, 16987907}, {7945, 16988163}, {7946, 16988419}, - {7947, 16988675}, {7948, 16988931}, {7949, 16989187}, {7950, 16989443}, - {7951, 16989699}, {7952, 1}, {7958, 2}, {7960, 16989955}, - {7961, 16990211}, {7962, 16990467}, {7963, 16990723}, {7964, 16990979}, - {7965, 16991235}, {7966, 2}, {7968, 1}, {7976, 16991491}, - {7977, 16991747}, {7978, 16992003}, {7979, 16992259}, {7980, 16992515}, - {7981, 16992771}, {7982, 16993027}, {7983, 16993283}, {7984, 1}, - {7992, 16993539}, {7993, 16993795}, {7994, 16994051}, {7995, 16994307}, - {7996, 16994563}, {7997, 16994819}, {7998, 16995075}, {7999, 16995331}, - {8000, 1}, {8006, 2}, {8008, 16995587}, {8009, 16995843}, - {8010, 16996099}, {8011, 16996355}, {8012, 16996611}, {8013, 16996867}, - {8014, 2}, {8016, 1}, {8024, 2}, {8025, 16997123}, - {8026, 2}, {8027, 16997379}, {8028, 2}, {8029, 16997635}, - {8030, 2}, {8031, 16997891}, {8032, 1}, {8040, 16998147}, - {8041, 16998403}, {8042, 16998659}, {8043, 16998915}, {8044, 16999171}, - {8045, 16999427}, {8046, 16999683}, {8047, 16999939}, {8048, 1}, - {8049, 16849923}, {8050, 1}, {8051, 16850179}, {8052, 1}, - {8053, 16850435}, {8054, 1}, {8055, 16850691}, {8056, 1}, - {8057, 16850947}, {8058, 1}, {8059, 16851203}, {8060, 1}, - {8061, 16851459}, {8062, 2}, {8064, 33777411}, {8065, 33777923}, - {8066, 33778435}, {8067, 33778947}, {8068, 33779459}, {8069, 33779971}, - {8070, 33780483}, {8071, 33780995}, {8072, 33777411}, {8073, 33777923}, - {8074, 33778435}, {8075, 33778947}, {8076, 33779459}, {8077, 33779971}, - {8078, 33780483}, {8079, 33780995}, {8080, 33781507}, {8081, 33782019}, - {8082, 33782531}, {8083, 33783043}, {8084, 33783555}, {8085, 33784067}, - {8086, 33784579}, {8087, 33785091}, {8088, 33781507}, {8089, 33782019}, - {8090, 33782531}, {8091, 33783043}, {8092, 33783555}, {8093, 33784067}, - {8094, 33784579}, {8095, 33785091}, {8096, 33785603}, {8097, 33786115}, - {8098, 33786627}, {8099, 33787139}, {8100, 33787651}, {8101, 33788163}, - {8102, 33788675}, {8103, 33789187}, {8104, 33785603}, {8105, 33786115}, - {8106, 33786627}, {8107, 33787139}, {8108, 33787651}, {8109, 33788163}, - {8110, 33788675}, {8111, 33789187}, {8112, 1}, {8114, 33789699}, - {8115, 33790211}, {8116, 33790723}, {8117, 2}, {8118, 1}, - {8119, 33791235}, {8120, 17014531}, {8121, 17014787}, {8122, 17012483}, - {8123, 16849923}, {8124, 33790211}, {8125, 33792259}, {8126, 16846851}, - {8127, 33792259}, {8128, 33792771}, {8129, 50570499}, {8130, 33794051}, - {8131, 33794563}, {8132, 33795075}, {8133, 2}, {8134, 1}, - {8135, 33795587}, {8136, 17018883}, {8137, 16850179}, {8138, 17016835}, - {8139, 16850435}, {8140, 33794563}, {8141, 50573571}, {8142, 50574339}, - {8143, 50575107}, {8144, 1}, {8147, 17021443}, {8148, 2}, - {8150, 1}, {8152, 17021699}, {8153, 17021955}, {8154, 17022211}, - {8155, 16850691}, {8156, 2}, {8157, 50576899}, {8158, 50577667}, - {8159, 50578435}, {8160, 1}, {8163, 17024771}, {8164, 1}, - {8168, 17025027}, {8169, 17025283}, {8170, 17025539}, {8171, 16851203}, - {8172, 17025795}, {8173, 50580483}, {8174, 50403587}, {8175, 17026819}, - {8176, 2}, {8178, 33804291}, {8179, 33804803}, {8180, 33805315}, - {8181, 2}, {8182, 1}, {8183, 33805827}, {8184, 17029123}, - {8185, 16850947}, {8186, 17027075}, {8187, 16851459}, {8188, 33804803}, - {8189, 33562883}, {8190, 33799683}, {8191, 2}, {8192, 16783875}, - {8203, 0}, {8204, 1}, {8206, 2}, {8208, 1}, - {8209, 17029379}, {8210, 1}, {8215, 33806851}, {8216, 1}, - {8228, 2}, {8231, 1}, {8232, 2}, {8239, 16783875}, - {8240, 1}, {8243, 33807363}, {8244, 50585091}, {8245, 1}, - {8246, 33808643}, {8247, 50586371}, {8248, 1}, {8252, 33809923}, - {8253, 1}, {8254, 33810435}, {8255, 1}, {8263, 33810947}, - {8264, 33811459}, {8265, 33811971}, {8266, 1}, {8279, 67361795}, - {8280, 1}, {8287, 16783875}, {8288, 0}, {8289, 2}, - {8292, 0}, {8293, 2}, {8304, 17035267}, {8305, 16779267}, - {8306, 2}, {8308, 16787715}, {8309, 17035523}, {8310, 17035779}, - {8311, 17036035}, {8312, 17036291}, {8313, 17036547}, {8314, 17036803}, - {8315, 17037059}, {8316, 17037315}, {8317, 17037571}, {8318, 17037827}, - {8319, 16780547}, {8320, 17035267}, {8321, 16786947}, {8322, 16785155}, - {8323, 16785411}, {8324, 16787715}, {8325, 17035523}, {8326, 17035779}, - {8327, 17036035}, {8328, 17036291}, {8329, 17036547}, {8330, 17036803}, - {8331, 17037059}, {8332, 17037315}, {8333, 17037571}, {8334, 17037827}, - {8335, 2}, {8336, 16777219}, {8337, 16778243}, {8338, 16780803}, - {8339, 16783107}, {8340, 16816387}, {8341, 16779011}, {8342, 16779779}, - {8343, 16780035}, {8344, 16780291}, {8345, 16780547}, {8346, 16781059}, - {8347, 16781827}, {8348, 16782083}, {8349, 2}, {8352, 1}, - {8360, 33558787}, {8361, 1}, {8385, 2}, {8400, 1}, - {8433, 2}, {8448, 50592515}, {8449, 50593283}, {8450, 16777731}, - {8451, 33816835}, {8452, 1}, {8453, 50594563}, {8454, 50595331}, - {8455, 16816643}, {8456, 1}, {8457, 33818883}, {8458, 16778755}, - {8459, 16779011}, {8463, 16802051}, {8464, 16779267}, {8466, 16780035}, - {8468, 1}, {8469, 16780547}, {8470, 33557763}, {8471, 1}, - {8473, 16781059}, {8474, 16781315}, {8475, 16781571}, {8478, 1}, - {8480, 33819395}, {8481, 50597123}, {8482, 33820675}, {8483, 1}, - {8484, 16783619}, {8485, 1}, {8486, 16857091}, {8487, 1}, - {8488, 16783619}, {8489, 1}, {8490, 16779779}, {8491, 16790787}, - {8492, 16777475}, {8493, 16777731}, {8494, 1}, {8495, 16778243}, - {8497, 16778499}, {8498, 2}, {8499, 16780291}, {8500, 16780803}, - {8501, 17043971}, {8502, 17044227}, {8503, 17044483}, {8504, 17044739}, - {8505, 16779267}, {8506, 1}, {8507, 50599427}, {8508, 16855043}, - {8509, 16852227}, {8511, 16855043}, {8512, 17045763}, {8513, 1}, - {8517, 16777987}, {8519, 16778243}, {8520, 16779267}, {8521, 16779523}, - {8522, 1}, {8528, 50600451}, {8529, 50601219}, {8530, 67379203}, - {8531, 50603011}, {8532, 50603779}, {8533, 50604547}, {8534, 50605315}, - {8535, 50606083}, {8536, 50606851}, {8537, 50607619}, {8538, 50608387}, - {8539, 50609155}, {8540, 50609923}, {8541, 50610691}, {8542, 50611459}, - {8543, 33564419}, {8544, 16779267}, {8545, 33835011}, {8546, 50612739}, - {8547, 33836291}, {8548, 16782595}, {8549, 33836803}, {8550, 50614531}, - {8551, 67392515}, {8552, 33839107}, {8553, 16783107}, {8554, 33839619}, - {8555, 50617347}, {8556, 16780035}, {8557, 16777731}, {8558, 16777987}, - {8559, 16780291}, {8560, 16779267}, {8561, 33835011}, {8562, 50612227}, - {8563, 33836291}, {8564, 16782595}, {8565, 33836803}, {8566, 50614531}, - {8567, 67392515}, {8568, 33839107}, {8569, 16783107}, {8570, 33839619}, - {8571, 50617347}, {8572, 16780035}, {8573, 16777731}, {8574, 16777987}, - {8575, 16780291}, {8576, 1}, {8579, 2}, {8580, 1}, - {8585, 50618115}, {8586, 1}, {8588, 2}, {8592, 1}, - {8748, 33841667}, {8749, 50619395}, {8750, 1}, {8751, 33842947}, - {8752, 50620675}, {8753, 1}, {9001, 17067011}, {9002, 17067267}, - {9003, 1}, {9255, 2}, {9280, 1}, {9291, 2}, - {9312, 16786947}, {9313, 16785155}, {9314, 16785411}, {9315, 16787715}, - {9316, 17035523}, {9317, 17035779}, {9318, 17036035}, {9319, 17036291}, - {9320, 17036547}, {9321, 33825283}, {9322, 33564163}, {9323, 33844739}, - {9324, 33845251}, {9325, 33845763}, {9326, 33846275}, {9327, 33846787}, - {9328, 33847299}, {9329, 33847811}, {9330, 33848323}, {9331, 33848835}, - {9332, 50626563}, {9333, 50627331}, {9334, 50628099}, {9335, 50628867}, - {9336, 50629635}, {9337, 50630403}, {9338, 50631171}, {9339, 50631939}, - {9340, 50632707}, {9341, 67410691}, {9342, 67411715}, {9343, 67412739}, - {9344, 67413763}, {9345, 67414787}, {9346, 67415811}, {9347, 67416835}, - {9348, 67417859}, {9349, 67418883}, {9350, 67419907}, {9351, 67420931}, - {9352, 2}, {9372, 50644739}, {9373, 50645507}, {9374, 50646275}, - {9375, 50647043}, {9376, 50647811}, {9377, 50648579}, {9378, 50649347}, - {9379, 50650115}, {9380, 50650883}, {9381, 50651651}, {9382, 50652419}, - {9383, 50653187}, {9384, 50653955}, {9385, 50654723}, {9386, 50655491}, - {9387, 50656259}, {9388, 50657027}, {9389, 50657795}, {9390, 50658563}, - {9391, 50659331}, {9392, 50660099}, {9393, 50660867}, {9394, 50661635}, - {9395, 50662403}, {9396, 50663171}, {9397, 50663939}, {9398, 16777219}, - {9399, 16777475}, {9400, 16777731}, {9401, 16777987}, {9402, 16778243}, - {9403, 16778499}, {9404, 16778755}, {9405, 16779011}, {9406, 16779267}, - {9407, 16779523}, {9408, 16779779}, {9409, 16780035}, {9410, 16780291}, - {9411, 16780547}, {9412, 16780803}, {9413, 16781059}, {9414, 16781315}, - {9415, 16781571}, {9416, 16781827}, {9417, 16782083}, {9418, 16782339}, - {9419, 16782595}, {9420, 16782851}, {9421, 16783107}, {9422, 16783363}, - {9423, 16783619}, {9424, 16777219}, {9425, 16777475}, {9426, 16777731}, - {9427, 16777987}, {9428, 16778243}, {9429, 16778499}, {9430, 16778755}, - {9431, 16779011}, {9432, 16779267}, {9433, 16779523}, {9434, 16779779}, - {9435, 16780035}, {9436, 16780291}, {9437, 16780547}, {9438, 16780803}, - {9439, 16781059}, {9440, 16781315}, {9441, 16781571}, {9442, 16781827}, - {9443, 16782083}, {9444, 16782339}, {9445, 16782595}, {9446, 16782851}, - {9447, 16783107}, {9448, 16783363}, {9449, 16783619}, {9450, 17035267}, - {9451, 1}, {10764, 67396099}, {10765, 1}, {10868, 50664707}, - {10869, 33888259}, {10870, 50665219}, {10871, 1}, {10972, 33888771}, - {10973, 1}, {11124, 2}, {11126, 1}, {11158, 2}, - {11159, 1}, {11264, 17112067}, {11265, 17112323}, {11266, 17112579}, - {11267, 17112835}, {11268, 17113091}, {11269, 17113347}, {11270, 17113603}, - {11271, 17113859}, {11272, 17114115}, {11273, 17114371}, {11274, 17114627}, - {11275, 17114883}, {11276, 17115139}, {11277, 17115395}, {11278, 17115651}, - {11279, 17115907}, {11280, 17116163}, {11281, 17116419}, {11282, 17116675}, - {11283, 17116931}, {11284, 17117187}, {11285, 17117443}, {11286, 17117699}, - {11287, 17117955}, {11288, 17118211}, {11289, 17118467}, {11290, 17118723}, - {11291, 17118979}, {11292, 17119235}, {11293, 17119491}, {11294, 17119747}, - {11295, 17120003}, {11296, 17120259}, {11297, 17120515}, {11298, 17120771}, - {11299, 17121027}, {11300, 17121283}, {11301, 17121539}, {11302, 17121795}, - {11303, 17122051}, {11304, 17122307}, {11305, 17122563}, {11306, 17122819}, - {11307, 17123075}, {11308, 17123331}, {11309, 17123587}, {11310, 17123843}, - {11311, 17124099}, {11312, 1}, {11360, 17124355}, {11361, 1}, - {11362, 17124611}, {11363, 17124867}, {11364, 17125123}, {11365, 1}, - {11367, 17125379}, {11368, 1}, {11369, 17125635}, {11370, 1}, - {11371, 17125891}, {11372, 1}, {11373, 16948483}, {11374, 16953091}, - {11375, 16948227}, {11376, 16950275}, {11377, 1}, {11378, 17126147}, - {11379, 1}, {11381, 17126403}, {11382, 1}, {11388, 16779523}, - {11389, 16782595}, {11390, 17126659}, {11391, 17126915}, {11392, 17127171}, - {11393, 1}, {11394, 17127427}, {11395, 1}, {11396, 17127683}, - {11397, 1}, {11398, 17127939}, {11399, 1}, {11400, 17128195}, - {11401, 1}, {11402, 17128451}, {11403, 1}, {11404, 17128707}, - {11405, 1}, {11406, 17128963}, {11407, 1}, {11408, 17129219}, - {11409, 1}, {11410, 17129475}, {11411, 1}, {11412, 17129731}, - {11413, 1}, {11414, 17129987}, {11415, 1}, {11416, 17130243}, - {11417, 1}, {11418, 17130499}, {11419, 1}, {11420, 17130755}, - {11421, 1}, {11422, 17131011}, {11423, 1}, {11424, 17131267}, - {11425, 1}, {11426, 17131523}, {11427, 1}, {11428, 17131779}, - {11429, 1}, {11430, 17132035}, {11431, 1}, {11432, 17132291}, - {11433, 1}, {11434, 17132547}, {11435, 1}, {11436, 17132803}, - {11437, 1}, {11438, 17133059}, {11439, 1}, {11440, 17133315}, - {11441, 1}, {11442, 17133571}, {11443, 1}, {11444, 17133827}, - {11445, 1}, {11446, 17134083}, {11447, 1}, {11448, 17134339}, - {11449, 1}, {11450, 17134595}, {11451, 1}, {11452, 17134851}, - {11453, 1}, {11454, 17135107}, {11455, 1}, {11456, 17135363}, - {11457, 1}, {11458, 17135619}, {11459, 1}, {11460, 17135875}, - {11461, 1}, {11462, 17136131}, {11463, 1}, {11464, 17136387}, - {11465, 1}, {11466, 17136643}, {11467, 1}, {11468, 17136899}, - {11469, 1}, {11470, 17137155}, {11471, 1}, {11472, 17137411}, - {11473, 1}, {11474, 17137667}, {11475, 1}, {11476, 17137923}, - {11477, 1}, {11478, 17138179}, {11479, 1}, {11480, 17138435}, - {11481, 1}, {11482, 17138691}, {11483, 1}, {11484, 17138947}, - {11485, 1}, {11486, 17139203}, {11487, 1}, {11488, 17139459}, - {11489, 1}, {11490, 17139715}, {11491, 1}, {11499, 17139971}, - {11500, 1}, {11501, 17140227}, {11502, 1}, {11506, 17140483}, - {11507, 1}, {11508, 2}, {11513, 1}, {11558, 2}, - {11559, 1}, {11560, 2}, {11565, 1}, {11566, 2}, - {11568, 1}, {11624, 2}, {11631, 17140739}, {11632, 1}, - {11633, 2}, {11647, 1}, {11671, 2}, {11680, 1}, - {11687, 2}, {11688, 1}, {11695, 2}, {11696, 1}, - {11703, 2}, {11704, 1}, {11711, 2}, {11712, 1}, - {11719, 2}, {11720, 1}, {11727, 2}, {11728, 1}, - {11735, 2}, {11736, 1}, {11743, 2}, {11744, 1}, - {11870, 2}, {11904, 1}, {11930, 2}, {11931, 1}, - {11935, 17140995}, {11936, 1}, {12019, 17141251}, {12020, 2}, - {12032, 17141507}, {12033, 17141763}, {12034, 17142019}, {12035, 17142275}, - {12036, 17142531}, {12037, 17142787}, {12038, 17143043}, {12039, 17143299}, - {12040, 17143555}, {12041, 17143811}, {12042, 17144067}, {12043, 17144323}, - {12044, 17144579}, {12045, 17144835}, {12046, 17145091}, {12047, 17145347}, - {12048, 17145603}, {12049, 17145859}, {12050, 17146115}, {12051, 17146371}, - {12052, 17146627}, {12053, 17146883}, {12054, 17147139}, {12055, 17147395}, - {12056, 17147651}, {12057, 17147907}, {12058, 17148163}, {12059, 17148419}, - {12060, 17148675}, {12061, 17148931}, {12062, 17149187}, {12063, 17149443}, - {12064, 17149699}, {12065, 17149955}, {12066, 17150211}, {12067, 17150467}, - {12068, 17150723}, {12069, 17150979}, {12070, 17151235}, {12071, 17151491}, - {12072, 17151747}, {12073, 17152003}, {12074, 17152259}, {12075, 17152515}, - {12076, 17152771}, {12077, 17153027}, {12078, 17153283}, {12079, 17153539}, - {12080, 17153795}, {12081, 17154051}, {12082, 17154307}, {12083, 17154563}, - {12084, 17154819}, {12085, 17155075}, {12086, 17155331}, {12087, 17155587}, - {12088, 17155843}, {12089, 17156099}, {12090, 17156355}, {12091, 17156611}, - {12092, 17156867}, {12093, 17157123}, {12094, 17157379}, {12095, 17157635}, - {12096, 17157891}, {12097, 17158147}, {12098, 17158403}, {12099, 17158659}, - {12100, 17158915}, {12101, 17159171}, {12102, 17159427}, {12103, 17159683}, - {12104, 17159939}, {12105, 17160195}, {12106, 17160451}, {12107, 17160707}, - {12108, 17160963}, {12109, 17161219}, {12110, 17161475}, {12111, 17161731}, - {12112, 17161987}, {12113, 17162243}, {12114, 17162499}, {12115, 17162755}, - {12116, 17163011}, {12117, 17163267}, {12118, 17163523}, {12119, 17163779}, - {12120, 17164035}, {12121, 17164291}, {12122, 17164547}, {12123, 17164803}, - {12124, 17165059}, {12125, 17165315}, {12126, 17165571}, {12127, 17165827}, - {12128, 17166083}, {12129, 17166339}, {12130, 17166595}, {12131, 17166851}, - {12132, 17167107}, {12133, 17167363}, {12134, 17167619}, {12135, 17167875}, - {12136, 17168131}, {12137, 17168387}, {12138, 17168643}, {12139, 17168899}, - {12140, 17169155}, {12141, 17169411}, {12142, 17169667}, {12143, 17169923}, - {12144, 17170179}, {12145, 17170435}, {12146, 17170691}, {12147, 17170947}, - {12148, 17171203}, {12149, 17171459}, {12150, 17171715}, {12151, 17171971}, - {12152, 17172227}, {12153, 17172483}, {12154, 17172739}, {12155, 17172995}, - {12156, 17173251}, {12157, 17173507}, {12158, 17173763}, {12159, 17174019}, - {12160, 17174275}, {12161, 17174531}, {12162, 17174787}, {12163, 17175043}, - {12164, 17175299}, {12165, 17175555}, {12166, 17175811}, {12167, 17176067}, - {12168, 17176323}, {12169, 17176579}, {12170, 17176835}, {12171, 17177091}, - {12172, 17177347}, {12173, 17177603}, {12174, 17177859}, {12175, 17178115}, - {12176, 17178371}, {12177, 17178627}, {12178, 17178883}, {12179, 17179139}, - {12180, 17179395}, {12181, 17179651}, {12182, 17179907}, {12183, 17180163}, - {12184, 17180419}, {12185, 17180675}, {12186, 17180931}, {12187, 17181187}, - {12188, 17181443}, {12189, 17181699}, {12190, 17181955}, {12191, 17182211}, - {12192, 17182467}, {12193, 17182723}, {12194, 17182979}, {12195, 17183235}, - {12196, 17183491}, {12197, 17183747}, {12198, 17184003}, {12199, 17184259}, - {12200, 17184515}, {12201, 17184771}, {12202, 17185027}, {12203, 17185283}, - {12204, 17185539}, {12205, 17185795}, {12206, 17186051}, {12207, 17186307}, - {12208, 17186563}, {12209, 17186819}, {12210, 17187075}, {12211, 17187331}, - {12212, 17187587}, {12213, 17187843}, {12214, 17188099}, {12215, 17188355}, - {12216, 17188611}, {12217, 17188867}, {12218, 17189123}, {12219, 17189379}, - {12220, 17189635}, {12221, 17189891}, {12222, 17190147}, {12223, 17190403}, - {12224, 17190659}, {12225, 17190915}, {12226, 17191171}, {12227, 17191427}, - {12228, 17191683}, {12229, 17191939}, {12230, 17192195}, {12231, 17192451}, - {12232, 17192707}, {12233, 17192963}, {12234, 17193219}, {12235, 17193475}, - {12236, 17193731}, {12237, 17193987}, {12238, 17194243}, {12239, 17194499}, - {12240, 17194755}, {12241, 17195011}, {12242, 17195267}, {12243, 17195523}, - {12244, 17195779}, {12245, 17196035}, {12246, 2}, {12288, 16783875}, - {12289, 1}, {12290, 17196291}, {12291, 1}, {12342, 17196547}, - {12343, 1}, {12344, 17147395}, {12345, 17196803}, {12346, 17197059}, - {12347, 1}, {12352, 2}, {12353, 1}, {12439, 2}, - {12441, 1}, {12443, 33974531}, {12444, 33975043}, {12445, 1}, - {12447, 33975555}, {12448, 1}, {12543, 33976067}, {12544, 2}, - {12549, 1}, {12592, 2}, {12593, 17199363}, {12594, 17199619}, - {12595, 17199875}, {12596, 17200131}, {12597, 17200387}, {12598, 17200643}, - {12599, 17200899}, {12600, 17201155}, {12601, 17201411}, {12602, 17201667}, - {12603, 17201923}, {12604, 17202179}, {12605, 17202435}, {12606, 17202691}, - {12607, 17202947}, {12608, 17203203}, {12609, 17203459}, {12610, 17203715}, - {12611, 17203971}, {12612, 17204227}, {12613, 17204483}, {12614, 17204739}, - {12615, 17204995}, {12616, 17205251}, {12617, 17205507}, {12618, 17205763}, - {12619, 17206019}, {12620, 17206275}, {12621, 17206531}, {12622, 17206787}, - {12623, 17207043}, {12624, 17207299}, {12625, 17207555}, {12626, 17207811}, - {12627, 17208067}, {12628, 17208323}, {12629, 17208579}, {12630, 17208835}, - {12631, 17209091}, {12632, 17209347}, {12633, 17209603}, {12634, 17209859}, - {12635, 17210115}, {12636, 17210371}, {12637, 17210627}, {12638, 17210883}, - {12639, 17211139}, {12640, 17211395}, {12641, 17211651}, {12642, 17211907}, - {12643, 17212163}, {12644, 2}, {12645, 17212419}, {12646, 17212675}, - {12647, 17212931}, {12648, 17213187}, {12649, 17213443}, {12650, 17213699}, - {12651, 17213955}, {12652, 17214211}, {12653, 17214467}, {12654, 17214723}, - {12655, 17214979}, {12656, 17215235}, {12657, 17215491}, {12658, 17215747}, - {12659, 17216003}, {12660, 17216259}, {12661, 17216515}, {12662, 17216771}, - {12663, 17217027}, {12664, 17217283}, {12665, 17217539}, {12666, 17217795}, - {12667, 17218051}, {12668, 17218307}, {12669, 17218563}, {12670, 17218819}, - {12671, 17219075}, {12672, 17219331}, {12673, 17219587}, {12674, 17219843}, - {12675, 17220099}, {12676, 17220355}, {12677, 17220611}, {12678, 17220867}, - {12679, 17221123}, {12680, 17221379}, {12681, 17221635}, {12682, 17221891}, - {12683, 17222147}, {12684, 17222403}, {12685, 17222659}, {12686, 17222915}, - {12687, 2}, {12688, 1}, {12690, 17141507}, {12691, 17143043}, - {12692, 17223171}, {12693, 17223427}, {12694, 17223683}, {12695, 17223939}, - {12696, 17224195}, {12697, 17224451}, {12698, 17142531}, {12699, 17224707}, - {12700, 17224963}, {12701, 17225219}, {12702, 17225475}, {12703, 17143555}, - {12704, 1}, {12772, 2}, {12784, 1}, {12800, 50780163}, - {12801, 50780931}, {12802, 50781699}, {12803, 50782467}, {12804, 50783235}, - {12805, 50784003}, {12806, 50784771}, {12807, 50785539}, {12808, 50786307}, - {12809, 50787075}, {12810, 50787843}, {12811, 50788611}, {12812, 50789379}, - {12813, 50790147}, {12814, 50790915}, {12815, 50791683}, {12816, 50792451}, - {12817, 50793219}, {12818, 50793987}, {12819, 50794755}, {12820, 50795523}, - {12821, 50796291}, {12822, 50797059}, {12823, 50797827}, {12824, 50798595}, - {12825, 50799363}, {12826, 50800131}, {12827, 50800899}, {12828, 50801667}, - {12829, 67579651}, {12830, 67580675}, {12831, 2}, {12832, 50804483}, - {12833, 50805251}, {12834, 50806019}, {12835, 50806787}, {12836, 50807555}, - {12837, 50808323}, {12838, 50809091}, {12839, 50809859}, {12840, 50810627}, - {12841, 50811395}, {12842, 50812163}, {12843, 50812931}, {12844, 50813699}, - {12845, 50814467}, {12846, 50815235}, {12847, 50816003}, {12848, 50816771}, - {12849, 50817539}, {12850, 50818307}, {12851, 50819075}, {12852, 50819843}, - {12853, 50820611}, {12854, 50821379}, {12855, 50822147}, {12856, 50822915}, - {12857, 50823683}, {12858, 50824451}, {12859, 50825219}, {12860, 50825987}, - {12861, 50826755}, {12862, 50827523}, {12863, 50828291}, {12864, 50829059}, - {12865, 50829827}, {12866, 50830595}, {12867, 50831363}, {12868, 17277699}, - {12869, 17277955}, {12870, 17158403}, {12871, 17278211}, {12872, 1}, - {12880, 50832899}, {12881, 33844995}, {12882, 34056451}, {12883, 33562371}, - {12884, 34056963}, {12885, 34057475}, {12886, 34057987}, {12887, 34058499}, - {12888, 34059011}, {12889, 34059523}, {12890, 34060035}, {12891, 33827075}, - {12892, 33826307}, {12893, 34060547}, {12894, 34061059}, {12895, 34061571}, - {12896, 17199363}, {12897, 17200131}, {12898, 17200899}, {12899, 17201411}, - {12900, 17203459}, {12901, 17203715}, {12902, 17204483}, {12903, 17204995}, - {12904, 17205251}, {12905, 17205763}, {12906, 17206019}, {12907, 17206275}, - {12908, 17206531}, {12909, 17206787}, {12910, 17236739}, {12911, 17237507}, - {12912, 17238275}, {12913, 17239043}, {12914, 17239811}, {12915, 17240579}, - {12916, 17241347}, {12917, 17242115}, {12918, 17242883}, {12919, 17243651}, - {12920, 17244419}, {12921, 17245187}, {12922, 17245955}, {12923, 17246723}, - {12924, 34062083}, {12925, 34062595}, {12926, 17285891}, {12927, 1}, - {12928, 17141507}, {12929, 17143043}, {12930, 17223171}, {12931, 17223427}, - {12932, 17253379}, {12933, 17254147}, {12934, 17254915}, {12935, 17144323}, - {12936, 17256451}, {12937, 17147395}, {12938, 17160195}, {12939, 17163267}, - {12940, 17163011}, {12941, 17160451}, {12942, 17184003}, {12943, 17149443}, - {12944, 17159683}, {12945, 17263363}, {12946, 17264131}, {12947, 17264899}, - {12948, 17265667}, {12949, 17266435}, {12950, 17267203}, {12951, 17267971}, - {12952, 17268739}, {12953, 17286147}, {12954, 17286403}, {12955, 17150979}, - {12956, 17286659}, {12957, 17286915}, {12958, 17287171}, {12959, 17287427}, - {12960, 17287683}, {12961, 17275651}, {12962, 17287939}, {12963, 17288195}, - {12964, 17223683}, {12965, 17223939}, {12966, 17224195}, {12967, 17288451}, - {12968, 17288707}, {12969, 17288963}, {12970, 17289219}, {12971, 17271043}, - {12972, 17271811}, {12973, 17272579}, {12974, 17273347}, {12975, 17274115}, - {12976, 17289475}, {12977, 34066947}, {12978, 34067459}, {12979, 34067971}, - {12980, 34068483}, {12981, 34068995}, {12982, 33564931}, {12983, 34057219}, - {12984, 34061315}, {12985, 34069507}, {12986, 34070019}, {12987, 34070531}, - {12988, 34071043}, {12989, 34071555}, {12990, 34072067}, {12991, 34072579}, - {12992, 34073091}, {12993, 34073603}, {12994, 34074115}, {12995, 34074627}, - {12996, 34075139}, {12997, 34075651}, {12998, 34076163}, {12999, 34076675}, - {13000, 34077187}, {13001, 50854915}, {13002, 50855683}, {13003, 50856451}, - {13004, 34080003}, {13005, 50857731}, {13006, 34081283}, {13007, 50859011}, - {13008, 17305347}, {13009, 17305603}, {13010, 17305859}, {13011, 17306115}, - {13012, 17306371}, {13013, 17306627}, {13014, 17306883}, {13015, 17307139}, - {13016, 17307395}, {13017, 17198851}, {13018, 17307651}, {13019, 17307907}, - {13020, 17308163}, {13021, 17308419}, {13022, 17308675}, {13023, 17308931}, - {13024, 17309187}, {13025, 17309443}, {13026, 17309699}, {13027, 17199107}, - {13028, 17309955}, {13029, 17310211}, {13030, 17310467}, {13031, 17310723}, - {13032, 17310979}, {13033, 17311235}, {13034, 17311491}, {13035, 17311747}, - {13036, 17312003}, {13037, 17312259}, {13038, 17312515}, {13039, 17312771}, - {13040, 17313027}, {13041, 17313283}, {13042, 17313539}, {13043, 17313795}, - {13044, 17314051}, {13045, 17314307}, {13046, 17314563}, {13047, 17314819}, - {13048, 17315075}, {13049, 17315331}, {13050, 17315587}, {13051, 17315843}, - {13052, 17316099}, {13053, 17316355}, {13054, 17316611}, {13055, 34094083}, - {13056, 67649027}, {13057, 67650051}, {13058, 67651075}, {13059, 50874883}, - {13060, 67652867}, {13061, 50876675}, {13062, 50877443}, {13063, 84432643}, - {13064, 67656707}, {13065, 50880515}, {13066, 50881283}, {13067, 50882051}, - {13068, 67660035}, {13069, 67661059}, {13070, 50884867}, {13071, 50885635}, - {13072, 34109187}, {13073, 50886915}, {13074, 67664899}, {13075, 67665923}, - {13076, 34112515}, {13077, 84444675}, {13078, 101223171}, {13079, 84447491}, - {13080, 50890755}, {13081, 84448771}, {13082, 84450051}, {13083, 67674115}, - {13084, 50897923}, {13085, 50898691}, {13086, 50899459}, {13087, 67677443}, - {13088, 84455683}, {13089, 67679747}, {13090, 50903555}, {13091, 50904323}, - {13092, 50905091}, {13093, 34128643}, {13094, 34129155}, {13095, 34117891}, - {13096, 34129667}, {13097, 50907395}, {13098, 50908163}, {13099, 84463363}, - {13100, 50910211}, {13101, 67688195}, {13102, 84466435}, {13103, 50913283}, - {13104, 34136835}, {13105, 34137347}, {13106, 84469507}, {13107, 67693571}, - {13108, 84471811}, {13109, 50918659}, {13110, 84473859}, {13111, 34143491}, - {13112, 50921219}, {13113, 50921987}, {13114, 50922755}, {13115, 50923523}, - {13116, 50924291}, {13117, 67702275}, {13118, 50926083}, {13119, 34149635}, - {13120, 50927363}, {13121, 50928131}, {13122, 50928899}, {13123, 67706883}, - {13124, 50930691}, {13125, 50931459}, {13126, 50932227}, {13127, 84487427}, - {13128, 67711491}, {13129, 34158083}, {13130, 84490243}, {13131, 34159875}, - {13132, 67714819}, {13133, 67669251}, {13134, 50938627}, {13135, 50939395}, - {13136, 50940163}, {13137, 67718147}, {13138, 34164739}, {13139, 50942467}, - {13140, 67720451}, {13141, 34167043}, {13142, 84499203}, {13143, 50893571}, - {13144, 34168835}, {13145, 34169347}, {13146, 34169859}, {13147, 34170371}, - {13148, 34170883}, {13149, 34171395}, {13150, 34171907}, {13151, 34172419}, - {13152, 34172931}, {13153, 34173443}, {13154, 50951171}, {13155, 50951939}, - {13156, 50952707}, {13157, 50953475}, {13158, 50954243}, {13159, 50955011}, - {13160, 50955779}, {13161, 50956547}, {13162, 50957315}, {13163, 50958083}, - {13164, 50958851}, {13165, 50959619}, {13166, 50960387}, {13167, 50961155}, - {13168, 50961923}, {13169, 50962691}, {13170, 34186243}, {13171, 34186755}, - {13172, 50964483}, {13173, 34188035}, {13174, 34188547}, {13175, 34189059}, - {13176, 50966787}, {13177, 50967555}, {13178, 34191107}, {13179, 34191619}, - {13180, 34192131}, {13181, 34192643}, {13182, 34193155}, {13183, 67748099}, - {13184, 34185731}, {13185, 34194691}, {13186, 34195203}, {13187, 34195715}, - {13188, 34196227}, {13189, 34196739}, {13190, 34197251}, {13191, 34197763}, - {13192, 50975491}, {13193, 67753475}, {13194, 34200067}, {13195, 34200579}, - {13196, 34201091}, {13197, 34201603}, {13198, 34202115}, {13199, 34202627}, - {13200, 34203139}, {13201, 50980867}, {13202, 50981635}, {13203, 50980099}, - {13204, 50982403}, {13205, 34205955}, {13206, 34206467}, {13207, 34206979}, - {13208, 33556995}, {13209, 34207491}, {13210, 34208003}, {13211, 34208515}, - {13212, 34209027}, {13213, 34209539}, {13214, 34210051}, {13215, 50987779}, - {13216, 50988547}, {13217, 34189827}, {13218, 50989315}, {13219, 50990083}, - {13220, 50990851}, {13221, 34190595}, {13222, 50991619}, {13223, 50992387}, - {13224, 67770371}, {13225, 34185731}, {13226, 50994179}, {13227, 50994947}, - {13228, 50995715}, {13229, 50996483}, {13230, 84551683}, {13231, 101330179}, - {13232, 34222851}, {13233, 34223363}, {13234, 34223875}, {13235, 34224387}, - {13236, 34224899}, {13237, 34225411}, {13238, 34225923}, {13239, 34226435}, - {13240, 34226947}, {13241, 34226435}, {13242, 34227459}, {13243, 34227971}, - {13244, 34228483}, {13245, 34228995}, {13246, 34229507}, {13247, 34228995}, - {13248, 34230019}, {13249, 34230531}, {13250, 2}, {13251, 34231043}, - {13252, 33817091}, {13253, 33554947}, {13254, 67785987}, {13255, 2}, - {13256, 34232579}, {13257, 34233091}, {13258, 34233603}, {13259, 34185475}, - {13260, 34234115}, {13261, 34234627}, {13262, 34210051}, {13263, 34235139}, - {13264, 33557251}, {13265, 34235651}, {13266, 51013379}, {13267, 34236931}, - {13268, 34197251}, {13269, 51014659}, {13270, 51015427}, {13271, 34238979}, - {13272, 2}, {13273, 51016707}, {13274, 34240259}, {13275, 34221059}, - {13276, 34240771}, {13277, 34241283}, {13278, 51019011}, {13279, 51019779}, - {13280, 34243331}, {13281, 34243843}, {13282, 34244355}, {13283, 34244867}, - {13284, 34245379}, {13285, 34245891}, {13286, 34246403}, {13287, 34246915}, - {13288, 34247427}, {13289, 51025155}, {13290, 51025923}, {13291, 51026691}, - {13292, 51027459}, {13293, 51028227}, {13294, 51028995}, {13295, 51029763}, - {13296, 51030531}, {13297, 51031299}, {13298, 51032067}, {13299, 51032835}, - {13300, 51033603}, {13301, 51034371}, {13302, 51035139}, {13303, 51035907}, - {13304, 51036675}, {13305, 51037443}, {13306, 51038211}, {13307, 51038979}, - {13308, 51039747}, {13309, 51040515}, {13310, 51041283}, {13311, 51042051}, - {13312, 1}, {42125, 2}, {42128, 1}, {42183, 2}, - {42192, 1}, {42540, 2}, {42560, 17488387}, {42561, 1}, - {42562, 17488643}, {42563, 1}, {42564, 17488899}, {42565, 1}, - {42566, 17489155}, {42567, 1}, {42568, 17489411}, {42569, 1}, - {42570, 16936451}, {42571, 1}, {42572, 17489667}, {42573, 1}, - {42574, 17489923}, {42575, 1}, {42576, 17490179}, {42577, 1}, - {42578, 17490435}, {42579, 1}, {42580, 17490691}, {42581, 1}, - {42582, 17490947}, {42583, 1}, {42584, 17491203}, {42585, 1}, - {42586, 17491459}, {42587, 1}, {42588, 17491715}, {42589, 1}, - {42590, 17491971}, {42591, 1}, {42592, 17492227}, {42593, 1}, - {42594, 17492483}, {42595, 1}, {42596, 17492739}, {42597, 1}, - {42598, 17492995}, {42599, 1}, {42600, 17493251}, {42601, 1}, - {42602, 17493507}, {42603, 1}, {42604, 17493763}, {42605, 1}, - {42624, 17494019}, {42625, 1}, {42626, 17494275}, {42627, 1}, - {42628, 17494531}, {42629, 1}, {42630, 17494787}, {42631, 1}, - {42632, 17495043}, {42633, 1}, {42634, 17495299}, {42635, 1}, - {42636, 17495555}, {42637, 1}, {42638, 17495811}, {42639, 1}, - {42640, 17496067}, {42641, 1}, {42642, 17496323}, {42643, 1}, - {42644, 17496579}, {42645, 1}, {42646, 17496835}, {42647, 1}, - {42648, 17497091}, {42649, 1}, {42650, 17497347}, {42651, 1}, - {42652, 16873219}, {42653, 16873731}, {42654, 1}, {42744, 2}, - {42752, 1}, {42786, 17497603}, {42787, 1}, {42788, 17497859}, - {42789, 1}, {42790, 17498115}, {42791, 1}, {42792, 17498371}, - {42793, 1}, {42794, 17498627}, {42795, 1}, {42796, 17498883}, - {42797, 1}, {42798, 17499139}, {42799, 1}, {42802, 17499395}, - {42803, 1}, {42804, 17499651}, {42805, 1}, {42806, 17499907}, - {42807, 1}, {42808, 17500163}, {42809, 1}, {42810, 17500419}, - {42811, 1}, {42812, 17500675}, {42813, 1}, {42814, 17500931}, - {42815, 1}, {42816, 17501187}, {42817, 1}, {42818, 17501443}, - {42819, 1}, {42820, 17501699}, {42821, 1}, {42822, 17501955}, - {42823, 1}, {42824, 17502211}, {42825, 1}, {42826, 17502467}, - {42827, 1}, {42828, 17502723}, {42829, 1}, {42830, 17502979}, - {42831, 1}, {42832, 17503235}, {42833, 1}, {42834, 17503491}, - {42835, 1}, {42836, 17503747}, {42837, 1}, {42838, 17504003}, - {42839, 1}, {42840, 17504259}, {42841, 1}, {42842, 17504515}, - {42843, 1}, {42844, 17504771}, {42845, 1}, {42846, 17505027}, - {42847, 1}, {42848, 17505283}, {42849, 1}, {42850, 17505539}, - {42851, 1}, {42852, 17505795}, {42853, 1}, {42854, 17506051}, - {42855, 1}, {42856, 17506307}, {42857, 1}, {42858, 17506563}, - {42859, 1}, {42860, 17506819}, {42861, 1}, {42862, 17507075}, - {42863, 1}, {42864, 17507075}, {42865, 1}, {42873, 17507331}, - {42874, 1}, {42875, 17507587}, {42876, 1}, {42877, 17507843}, - {42878, 17508099}, {42879, 1}, {42880, 17508355}, {42881, 1}, - {42882, 17508611}, {42883, 1}, {42884, 17508867}, {42885, 1}, - {42886, 17509123}, {42887, 1}, {42891, 17509379}, {42892, 1}, - {42893, 16951299}, {42894, 1}, {42896, 17509635}, {42897, 1}, - {42898, 17509891}, {42899, 1}, {42902, 17510147}, {42903, 1}, - {42904, 17510403}, {42905, 1}, {42906, 17510659}, {42907, 1}, - {42908, 17510915}, {42909, 1}, {42910, 17511171}, {42911, 1}, - {42912, 17511427}, {42913, 1}, {42914, 17511683}, {42915, 1}, - {42916, 17511939}, {42917, 1}, {42918, 17512195}, {42919, 1}, - {42920, 17512451}, {42921, 1}, {42922, 16841475}, {42923, 16948995}, - {42924, 16951043}, {42925, 17512707}, {42926, 16951555}, {42927, 1}, - {42928, 17512963}, {42929, 17513219}, {42930, 16952067}, {42931, 17513475}, - {42932, 17513731}, {42933, 1}, {42934, 17513987}, {42935, 1}, - {42936, 17514243}, {42937, 1}, {42938, 17514499}, {42939, 1}, - {42940, 17514755}, {42941, 1}, {42942, 17515011}, {42943, 1}, - {42944, 17515267}, {42945, 1}, {42946, 17515523}, {42947, 1}, - {42948, 17515779}, {42949, 16954371}, {42950, 17516035}, {42951, 17516291}, - {42952, 1}, {42953, 17516547}, {42954, 1}, {42955, 2}, - {42960, 17516803}, {42961, 1}, {42962, 2}, {42963, 1}, - {42964, 2}, {42965, 1}, {42966, 17517059}, {42967, 1}, - {42968, 17517315}, {42969, 1}, {42970, 2}, {42994, 16777731}, - {42995, 16778499}, {42996, 16781315}, {42997, 17517571}, {42998, 1}, - {43000, 16802051}, {43001, 16808195}, {43002, 1}, {43053, 2}, - {43056, 1}, {43066, 2}, {43072, 1}, {43128, 2}, - {43136, 1}, {43206, 2}, {43214, 1}, {43226, 2}, - {43232, 1}, {43348, 2}, {43359, 1}, {43389, 2}, - {43392, 1}, {43470, 2}, {43471, 1}, {43482, 2}, - {43486, 1}, {43519, 2}, {43520, 1}, {43575, 2}, - {43584, 1}, {43598, 2}, {43600, 1}, {43610, 2}, - {43612, 1}, {43715, 2}, {43739, 1}, {43767, 2}, - {43777, 1}, {43783, 2}, {43785, 1}, {43791, 2}, - {43793, 1}, {43799, 2}, {43808, 1}, {43815, 2}, - {43816, 1}, {43823, 2}, {43824, 1}, {43868, 17498115}, - {43869, 17517827}, {43870, 17124611}, {43871, 17518083}, {43872, 1}, - {43881, 17518339}, {43882, 1}, {43884, 2}, {43888, 17518595}, - {43889, 17518851}, {43890, 17519107}, {43891, 17519363}, {43892, 17519619}, - {43893, 17519875}, {43894, 17520131}, {43895, 17520387}, {43896, 17520643}, - {43897, 17520899}, {43898, 17521155}, {43899, 17521411}, {43900, 17521667}, - {43901, 17521923}, {43902, 17522179}, {43903, 17522435}, {43904, 17522691}, - {43905, 17522947}, {43906, 17523203}, {43907, 17523459}, {43908, 17523715}, - {43909, 17523971}, {43910, 17524227}, {43911, 17524483}, {43912, 17524739}, - {43913, 17524995}, {43914, 17525251}, {43915, 17525507}, {43916, 17525763}, - {43917, 17526019}, {43918, 17526275}, {43919, 17526531}, {43920, 17526787}, - {43921, 17527043}, {43922, 17527299}, {43923, 17527555}, {43924, 17527811}, - {43925, 17528067}, {43926, 17528323}, {43927, 17528579}, {43928, 17528835}, - {43929, 17529091}, {43930, 17529347}, {43931, 17529603}, {43932, 17529859}, - {43933, 17530115}, {43934, 17530371}, {43935, 17530627}, {43936, 17530883}, - {43937, 17531139}, {43938, 17531395}, {43939, 17531651}, {43940, 17531907}, - {43941, 17532163}, {43942, 17532419}, {43943, 17532675}, {43944, 17532931}, - {43945, 17533187}, {43946, 17533443}, {43947, 17533699}, {43948, 17533955}, - {43949, 17534211}, {43950, 17534467}, {43951, 17534723}, {43952, 17534979}, - {43953, 17535235}, {43954, 17535491}, {43955, 17535747}, {43956, 17536003}, - {43957, 17536259}, {43958, 17536515}, {43959, 17536771}, {43960, 17537027}, - {43961, 17537283}, {43962, 17537539}, {43963, 17537795}, {43964, 17538051}, - {43965, 17538307}, {43966, 17538563}, {43967, 17538819}, {43968, 1}, - {44014, 2}, {44016, 1}, {44026, 2}, {44032, 1}, - {55204, 2}, {55216, 1}, {55239, 2}, {55243, 1}, - {55292, 2}, {63744, 17539075}, {63745, 17539331}, {63746, 17181955}, - {63747, 17539587}, {63748, 17539843}, {63749, 17540099}, {63750, 17540355}, - {63751, 17195779}, {63753, 17540611}, {63754, 17184003}, {63755, 17540867}, - {63756, 17541123}, {63757, 17541379}, {63758, 17541635}, {63759, 17541891}, - {63760, 17542147}, {63761, 17542403}, {63762, 17542659}, {63763, 17542915}, - {63764, 17543171}, {63765, 17543427}, {63766, 17543683}, {63767, 17543939}, - {63768, 17544195}, {63769, 17544451}, {63770, 17544707}, {63771, 17544963}, - {63772, 17545219}, {63773, 17545475}, {63774, 17545731}, {63775, 17545987}, - {63776, 17546243}, {63777, 17546499}, {63778, 17546755}, {63779, 17547011}, - {63780, 17547267}, {63781, 17547523}, {63782, 17547779}, {63783, 17548035}, - {63784, 17548291}, {63785, 17548547}, {63786, 17548803}, {63787, 17549059}, - {63788, 17549315}, {63789, 17549571}, {63790, 17549827}, {63791, 17550083}, - {63792, 17550339}, {63793, 17550595}, {63794, 17550851}, {63795, 17551107}, - {63796, 17173251}, {63797, 17551363}, {63798, 17551619}, {63799, 17551875}, - {63800, 17552131}, {63801, 17552387}, {63802, 17552643}, {63803, 17552899}, - {63804, 17553155}, {63805, 17553411}, {63806, 17553667}, {63807, 17553923}, - {63808, 17191939}, {63809, 17554179}, {63810, 17554435}, {63811, 17554691}, - {63812, 17554947}, {63813, 17555203}, {63814, 17555459}, {63815, 17555715}, - {63816, 17555971}, {63817, 17556227}, {63818, 17556483}, {63819, 17556739}, - {63820, 17556995}, {63821, 17557251}, {63822, 17557507}, {63823, 17557763}, - {63824, 17558019}, {63825, 17558275}, {63826, 17558531}, {63827, 17558787}, - {63828, 17559043}, {63829, 17559299}, {63830, 17559555}, {63831, 17559811}, - {63832, 17560067}, {63833, 17560323}, {63834, 17560579}, {63835, 17560835}, - {63836, 17543171}, {63837, 17561091}, {63838, 17561347}, {63839, 17561603}, - {63840, 17561859}, {63841, 17562115}, {63842, 17562371}, {63843, 17562627}, - {63844, 17562883}, {63845, 17563139}, {63846, 17563395}, {63847, 17563651}, - {63848, 17563907}, {63849, 17564163}, {63850, 17564419}, {63851, 17564675}, - {63852, 17564931}, {63853, 17565187}, {63854, 17565443}, {63855, 17565699}, - {63856, 17565955}, {63857, 17182467}, {63858, 17566211}, {63859, 17566467}, - {63860, 17566723}, {63861, 17566979}, {63862, 17567235}, {63863, 17567491}, - {63864, 17567747}, {63865, 17568003}, {63866, 17568259}, {63867, 17568515}, - {63868, 17568771}, {63869, 17569027}, {63870, 17569283}, {63871, 17569539}, - {63872, 17569795}, {63873, 17150979}, {63874, 17570051}, {63875, 17570307}, - {63876, 17570563}, {63877, 17570819}, {63878, 17571075}, {63879, 17571331}, - {63880, 17571587}, {63881, 17571843}, {63882, 17146115}, {63883, 17572099}, - {63884, 17572355}, {63885, 17572611}, {63886, 17572867}, {63887, 17573123}, - {63888, 17573379}, {63889, 17573635}, {63890, 17573891}, {63891, 17574147}, - {63892, 17574403}, {63893, 17574659}, {63894, 17574915}, {63895, 17575171}, - {63896, 17575427}, {63897, 17575683}, {63898, 17575939}, {63899, 17576195}, - {63900, 17576451}, {63901, 17576707}, {63902, 17576963}, {63903, 17577219}, - {63904, 17577475}, {63905, 17565699}, {63906, 17577731}, {63907, 17577987}, - {63908, 17578243}, {63909, 17578499}, {63910, 17578755}, {63911, 17579011}, - {63912, 17316867}, {63913, 17579267}, {63914, 17561603}, {63915, 17579523}, - {63916, 17579779}, {63917, 17580035}, {63918, 17580291}, {63919, 17580547}, - {63920, 17580803}, {63921, 17581059}, {63922, 17581315}, {63923, 17581571}, - {63924, 17581827}, {63925, 17582083}, {63926, 17582339}, {63927, 17582595}, - {63928, 17582851}, {63929, 17583107}, {63930, 17583363}, {63931, 17583619}, - {63932, 17583875}, {63933, 17584131}, {63934, 17584387}, {63935, 17543171}, - {63936, 17584643}, {63937, 17584899}, {63938, 17585155}, {63939, 17585411}, - {63940, 17195523}, {63941, 17585667}, {63942, 17585923}, {63943, 17586179}, - {63944, 17586435}, {63945, 17586691}, {63946, 17586947}, {63947, 17587203}, - {63948, 17587459}, {63949, 17587715}, {63950, 17587971}, {63951, 17588227}, - {63952, 17588483}, {63953, 17254147}, {63954, 17588739}, {63955, 17588995}, - {63956, 17589251}, {63957, 17589507}, {63958, 17589763}, {63959, 17590019}, - {63960, 17590275}, {63961, 17590531}, {63962, 17590787}, {63963, 17562115}, - {63964, 17591043}, {63965, 17591299}, {63966, 17591555}, {63967, 17591811}, - {63968, 17592067}, {63969, 17592323}, {63970, 17592579}, {63971, 17592835}, - {63972, 17593091}, {63973, 17593347}, {63974, 17593603}, {63975, 17593859}, - {63976, 17594115}, {63977, 17183747}, {63978, 17594371}, {63979, 17594627}, - {63980, 17594883}, {63981, 17595139}, {63982, 17595395}, {63983, 17595651}, - {63984, 17595907}, {63985, 17596163}, {63986, 17596419}, {63987, 17596675}, - {63988, 17596931}, {63989, 17597187}, {63990, 17597443}, {63991, 17171203}, - {63992, 17597699}, {63993, 17597955}, {63994, 17598211}, {63995, 17598467}, - {63996, 17598723}, {63997, 17598979}, {63998, 17599235}, {63999, 17599491}, - {64000, 17599747}, {64001, 17600003}, {64002, 17600259}, {64003, 17600515}, - {64004, 17600771}, {64005, 17601027}, {64006, 17601283}, {64007, 17601539}, - {64008, 17178115}, {64009, 17601795}, {64010, 17178883}, {64011, 17602051}, - {64012, 17602307}, {64013, 17602563}, {64014, 1}, {64016, 17602819}, - {64017, 1}, {64018, 17603075}, {64019, 1}, {64021, 17603331}, - {64022, 17603587}, {64023, 17603843}, {64024, 17604099}, {64025, 17604355}, - {64026, 17604611}, {64027, 17604867}, {64028, 17605123}, {64029, 17605379}, - {64030, 17172995}, {64031, 1}, {64032, 17605635}, {64033, 1}, - {64034, 17605891}, {64035, 1}, {64037, 17606147}, {64038, 17606403}, - {64039, 1}, {64042, 17606659}, {64043, 17606915}, {64044, 17607171}, - {64045, 17607427}, {64046, 17607683}, {64047, 17607939}, {64048, 17608195}, - {64049, 17608451}, {64050, 17608707}, {64051, 17608963}, {64052, 17609219}, - {64053, 17609475}, {64054, 17609731}, {64055, 17609987}, {64056, 17610243}, - {64057, 17610499}, {64058, 17610755}, {64059, 17611011}, {64060, 17152771}, - {64061, 17611267}, {64062, 17611523}, {64063, 17611779}, {64064, 17612035}, - {64065, 17612291}, {64066, 17612547}, {64067, 17612803}, {64068, 17613059}, - {64069, 17613315}, {64070, 17613571}, {64071, 17613827}, {64072, 17614083}, - {64073, 17614339}, {64074, 17614595}, {64075, 17614851}, {64076, 17264899}, - {64077, 17615107}, {64078, 17615363}, {64079, 17615619}, {64080, 17615875}, - {64081, 17267971}, {64082, 17616131}, {64083, 17616387}, {64084, 17616643}, - {64085, 17616899}, {64086, 17617155}, {64087, 17574915}, {64088, 17617411}, - {64089, 17617667}, {64090, 17617923}, {64091, 17618179}, {64092, 17618435}, - {64093, 17618691}, {64095, 17618947}, {64096, 17619203}, {64097, 17619459}, - {64098, 17619715}, {64099, 17619971}, {64100, 17620227}, {64101, 17620483}, - {64102, 17620739}, {64103, 17606147}, {64104, 17620995}, {64105, 17621251}, - {64106, 17621507}, {64107, 17621763}, {64108, 17622019}, {64109, 17622275}, - {64110, 2}, {64112, 17622531}, {64113, 17622787}, {64114, 17623043}, - {64115, 17623299}, {64116, 17623555}, {64117, 17623811}, {64118, 17624067}, - {64119, 17624323}, {64120, 17609731}, {64121, 17624579}, {64122, 17624835}, - {64123, 17625091}, {64124, 17602819}, {64125, 17625347}, {64126, 17625603}, - {64127, 17625859}, {64128, 17626115}, {64129, 17626371}, {64130, 17626627}, - {64131, 17626883}, {64132, 17627139}, {64133, 17627395}, {64134, 17627651}, - {64135, 17627907}, {64136, 17628163}, {64137, 17611779}, {64138, 17628419}, - {64139, 17612035}, {64140, 17628675}, {64141, 17628931}, {64142, 17629187}, - {64143, 17629443}, {64144, 17629699}, {64145, 17603075}, {64146, 17548547}, - {64147, 17629955}, {64148, 17630211}, {64149, 17161219}, {64150, 17565955}, - {64151, 17586947}, {64152, 17630467}, {64153, 17630723}, {64154, 17613827}, - {64155, 17630979}, {64156, 17614083}, {64157, 17631235}, {64158, 17631491}, - {64159, 17631747}, {64160, 17603587}, {64161, 17632003}, {64162, 17632259}, - {64163, 17632515}, {64164, 17632771}, {64165, 17633027}, {64166, 17603843}, - {64167, 17633283}, {64168, 17633539}, {64169, 17633795}, {64170, 17634051}, - {64171, 17634307}, {64172, 17634563}, {64173, 17617155}, {64174, 17634819}, - {64175, 17635075}, {64176, 17574915}, {64177, 17635331}, {64178, 17618179}, - {64179, 17635587}, {64180, 17635843}, {64181, 17636099}, {64182, 17636355}, - {64183, 17636611}, {64184, 17619459}, {64185, 17636867}, {64186, 17605891}, - {64187, 17637123}, {64188, 17619715}, {64189, 17561091}, {64190, 17637379}, - {64191, 17619971}, {64192, 17637635}, {64193, 17620483}, {64194, 17637891}, - {64195, 17638147}, {64196, 17638403}, {64197, 17638659}, {64198, 17638915}, - {64199, 17620995}, {64200, 17605123}, {64201, 17639171}, {64202, 17621251}, - {64203, 17639427}, {64204, 17621507}, {64205, 17639683}, {64206, 17195779}, - {64207, 17639939}, {64208, 17640195}, {64209, 17640451}, {64210, 17640707}, - {64211, 17640963}, {64212, 17641219}, {64213, 17641475}, {64214, 17641731}, - {64215, 17641987}, {64216, 17642243}, {64217, 17642499}, {64218, 2}, - {64256, 34419971}, {64257, 34420483}, {64258, 34420995}, {64259, 51197443}, - {64260, 51198723}, {64261, 33559043}, {64263, 2}, {64275, 34422275}, - {64276, 34422787}, {64277, 34423299}, {64278, 34423811}, {64279, 34424323}, - {64280, 2}, {64285, 34424835}, {64286, 1}, {64287, 34425347}, - {64288, 17648643}, {64289, 17043971}, {64290, 17044739}, {64291, 17648899}, - {64292, 17649155}, {64293, 17649411}, {64294, 17649667}, {64295, 17649923}, - {64296, 17650179}, {64297, 17036803}, {64298, 34427651}, {64299, 34428163}, - {64300, 51205891}, {64301, 51206659}, {64302, 34430211}, {64303, 34430723}, - {64304, 34431235}, {64305, 34431747}, {64306, 34432259}, {64307, 34432771}, - {64308, 34433283}, {64309, 34433795}, {64310, 34434307}, {64311, 2}, - {64312, 34434819}, {64313, 34435331}, {64314, 34435843}, {64315, 34436355}, - {64316, 34436867}, {64317, 2}, {64318, 34437379}, {64319, 2}, - {64320, 34437891}, {64321, 34438403}, {64322, 2}, {64323, 34438915}, - {64324, 34439427}, {64325, 2}, {64326, 34439939}, {64327, 34440451}, - {64328, 34440963}, {64329, 34428675}, {64330, 34441475}, {64331, 34441987}, - {64332, 34442499}, {64333, 34443011}, {64334, 34443523}, {64335, 34444035}, - {64336, 17667331}, {64338, 17667587}, {64342, 17667843}, {64346, 17668099}, - {64350, 17668355}, {64354, 17668611}, {64358, 17668867}, {64362, 17669123}, - {64366, 17669379}, {64370, 17669635}, {64374, 17669891}, {64378, 17670147}, - {64382, 17670403}, {64386, 17670659}, {64388, 17670915}, {64390, 17671171}, - {64392, 17671427}, {64394, 17671683}, {64396, 17671939}, {64398, 17672195}, - {64402, 17672451}, {64406, 17672707}, {64410, 17672963}, {64414, 17673219}, - {64416, 17673475}, {64420, 17673731}, {64422, 17673987}, {64426, 17674243}, - {64430, 17674499}, {64432, 17674755}, {64434, 1}, {64451, 2}, - {64467, 17675011}, {64471, 16911363}, {64473, 17675267}, {64475, 17675523}, - {64477, 33688579}, {64478, 17675779}, {64480, 17676035}, {64482, 17676291}, - {64484, 17676547}, {64488, 17676803}, {64490, 34454275}, {64492, 34454787}, - {64494, 34455299}, {64496, 34455811}, {64498, 34456323}, {64500, 34456835}, - {64502, 34457347}, {64505, 34457859}, {64508, 17681155}, {64512, 34458627}, - {64513, 34459139}, {64514, 34459651}, {64515, 34457859}, {64516, 34460163}, - {64517, 34460675}, {64518, 34461187}, {64519, 34461699}, {64520, 34462211}, - {64521, 34462723}, {64522, 34463235}, {64523, 34463747}, {64524, 34464259}, - {64525, 34464771}, {64526, 34465283}, {64527, 34465795}, {64528, 34466307}, - {64529, 34466819}, {64530, 34467331}, {64531, 34467843}, {64532, 34468355}, - {64533, 34468867}, {64534, 34469379}, {64535, 34469123}, {64536, 34469891}, - {64537, 34470403}, {64538, 34470915}, {64539, 34471427}, {64540, 34471939}, - {64541, 34472451}, {64542, 34472963}, {64543, 34473475}, {64544, 34473987}, - {64545, 34474499}, {64546, 34475011}, {64547, 34475523}, {64548, 34476035}, - {64549, 34476547}, {64550, 34477059}, {64551, 34477571}, {64552, 34478083}, - {64553, 34478595}, {64554, 34479107}, {64555, 34479619}, {64556, 34480131}, - {64557, 34480643}, {64558, 34481155}, {64559, 34481667}, {64560, 34482179}, - {64561, 34482691}, {64562, 34483203}, {64563, 34483715}, {64564, 34484227}, - {64565, 34484739}, {64566, 34485251}, {64567, 34485763}, {64568, 34486275}, - {64569, 34486787}, {64570, 34487299}, {64571, 34487811}, {64572, 34488323}, - {64573, 34488835}, {64574, 34489347}, {64575, 34489859}, {64576, 34490371}, - {64577, 34490883}, {64578, 34491395}, {64579, 34491907}, {64580, 34492419}, - {64581, 34492931}, {64582, 34469635}, {64583, 34470147}, {64584, 34493443}, - {64585, 34493955}, {64586, 34494467}, {64587, 34494979}, {64588, 34495491}, - {64589, 34496003}, {64590, 34496515}, {64591, 34497027}, {64592, 34497539}, - {64593, 34498051}, {64594, 34498563}, {64595, 34499075}, {64596, 34499587}, - {64597, 34468611}, {64598, 34500099}, {64599, 34500611}, {64600, 34492675}, - {64601, 34501123}, {64602, 34499843}, {64603, 34501635}, {64604, 34502147}, - {64605, 34502659}, {64606, 51280387}, {64607, 51281155}, {64608, 51281923}, - {64609, 51282691}, {64610, 51283459}, {64611, 51284227}, {64612, 34507779}, - {64613, 34508291}, {64614, 34459651}, {64615, 34508803}, {64616, 34457859}, - {64617, 34460163}, {64618, 34509315}, {64619, 34509827}, {64620, 34462211}, - {64621, 34510339}, {64622, 34462723}, {64623, 34463235}, {64624, 34510851}, - {64625, 34511363}, {64626, 34465283}, {64627, 34511875}, {64628, 34465795}, - {64629, 34466307}, {64630, 34512387}, {64631, 34512899}, {64632, 34467331}, - {64633, 34513411}, {64634, 34467843}, {64635, 34468355}, {64636, 34482691}, - {64637, 34483203}, {64638, 34484739}, {64639, 34485251}, {64640, 34485763}, - {64641, 34487811}, {64642, 34488323}, {64643, 34488835}, {64644, 34489347}, - {64645, 34491395}, {64646, 34491907}, {64647, 34492419}, {64648, 34513923}, - {64649, 34493443}, {64650, 34514435}, {64651, 34514947}, {64652, 34496515}, - {64653, 34515459}, {64654, 34497027}, {64655, 34497539}, {64656, 34502659}, - {64657, 34515971}, {64658, 34516483}, {64659, 34492675}, {64660, 34494723}, - {64661, 34501123}, {64662, 34499843}, {64663, 34458627}, {64664, 34459139}, - {64665, 34516995}, {64666, 34459651}, {64667, 34517507}, {64668, 34460675}, - {64669, 34461187}, {64670, 34461699}, {64671, 34462211}, {64672, 34518019}, - {64673, 34463747}, {64674, 34464259}, {64675, 34464771}, {64676, 34465283}, - {64677, 34518531}, {64678, 34467331}, {64679, 34468867}, {64680, 34469379}, - {64681, 34469123}, {64682, 34469891}, {64683, 34470403}, {64684, 34471427}, - {64685, 34471939}, {64686, 34472451}, {64687, 34472963}, {64688, 34473475}, - {64689, 34473987}, {64690, 34519043}, {64691, 34474499}, {64692, 34475011}, - {64693, 34475523}, {64694, 34476035}, {64695, 34476547}, {64696, 34477059}, - {64697, 34478083}, {64698, 34478595}, {64699, 34479107}, {64700, 34479619}, - {64701, 34480131}, {64702, 34480643}, {64703, 34481155}, {64704, 34481667}, - {64705, 34482179}, {64706, 34483715}, {64707, 34484227}, {64708, 34486275}, - {64709, 34486787}, {64710, 34487299}, {64711, 34487811}, {64712, 34488323}, - {64713, 34489859}, {64714, 34490371}, {64715, 34490883}, {64716, 34491395}, - {64717, 34519555}, {64718, 34492931}, {64719, 34469635}, {64720, 34470147}, - {64721, 34493443}, {64722, 34494979}, {64723, 34495491}, {64724, 34496003}, - {64725, 34496515}, {64726, 34520067}, {64727, 34498051}, {64728, 34498563}, - {64729, 34520579}, {64730, 34468611}, {64731, 34500099}, {64732, 34500611}, - {64733, 34492675}, {64734, 34497795}, {64735, 34459651}, {64736, 34517507}, - {64737, 34462211}, {64738, 34518019}, {64739, 34465283}, {64740, 34518531}, - {64741, 34467331}, {64742, 34521091}, {64743, 34473475}, {64744, 34521603}, - {64745, 34522115}, {64746, 34522627}, {64747, 34487811}, {64748, 34488323}, - {64749, 34491395}, {64750, 34496515}, {64751, 34520067}, {64752, 34492675}, - {64753, 34497795}, {64754, 51300355}, {64755, 51301123}, {64756, 51301891}, - {64757, 34525443}, {64758, 34525955}, {64759, 34526467}, {64760, 34526979}, - {64761, 34527491}, {64762, 34528003}, {64763, 34528515}, {64764, 34529027}, - {64765, 34529539}, {64766, 34530051}, {64767, 34530563}, {64768, 34500355}, - {64769, 34531075}, {64770, 34531587}, {64771, 34532099}, {64772, 34500867}, - {64773, 34532611}, {64774, 34533123}, {64775, 34533635}, {64776, 34534147}, - {64777, 34534659}, {64778, 34535171}, {64779, 34535683}, {64780, 34522115}, - {64781, 34536195}, {64782, 34536707}, {64783, 34537219}, {64784, 34537731}, - {64785, 34525443}, {64786, 34525955}, {64787, 34526467}, {64788, 34526979}, - {64789, 34527491}, {64790, 34528003}, {64791, 34528515}, {64792, 34529027}, - {64793, 34529539}, {64794, 34530051}, {64795, 34530563}, {64796, 34500355}, - {64797, 34531075}, {64798, 34531587}, {64799, 34532099}, {64800, 34500867}, - {64801, 34532611}, {64802, 34533123}, {64803, 34533635}, {64804, 34534147}, - {64805, 34534659}, {64806, 34535171}, {64807, 34535683}, {64808, 34522115}, - {64809, 34536195}, {64810, 34536707}, {64811, 34537219}, {64812, 34537731}, - {64813, 34534659}, {64814, 34535171}, {64815, 34535683}, {64816, 34522115}, - {64817, 34521603}, {64818, 34522627}, {64819, 34477571}, {64820, 34471939}, - {64821, 34472451}, {64822, 34472963}, {64823, 34534659}, {64824, 34535171}, - {64825, 34535683}, {64826, 34477571}, {64827, 34478083}, {64828, 34538243}, - {64830, 1}, {64848, 51315971}, {64849, 51316739}, {64851, 51317507}, - {64852, 51318275}, {64853, 51319043}, {64854, 51319811}, {64855, 51320579}, - {64856, 51246595}, {64858, 51321347}, {64859, 51322115}, {64860, 51322883}, - {64861, 51323651}, {64862, 51324419}, {64863, 51325187}, {64865, 51325955}, - {64866, 51326723}, {64868, 51327491}, {64870, 51328259}, {64871, 51329027}, - {64873, 51329795}, {64874, 51330563}, {64876, 51331331}, {64878, 51332099}, - {64879, 51332867}, {64881, 51333635}, {64883, 51334403}, {64884, 51335171}, - {64885, 51335939}, {64886, 51336707}, {64888, 51337475}, {64889, 51338243}, - {64890, 51339011}, {64891, 51339779}, {64892, 51340547}, {64894, 51341315}, - {64895, 51342083}, {64896, 51342851}, {64897, 51343619}, {64898, 51344387}, - {64899, 51345155}, {64901, 51345923}, {64903, 51346691}, {64905, 51347459}, - {64906, 51246851}, {64907, 51348227}, {64908, 51348995}, {64909, 51270147}, - {64910, 51247363}, {64911, 51349763}, {64912, 2}, {64914, 51350531}, - {64915, 51351299}, {64916, 51352067}, {64917, 51352835}, {64918, 51353603}, - {64919, 51354371}, {64921, 51355139}, {64922, 51355907}, {64923, 51356675}, - {64924, 51357443}, {64926, 51358211}, {64927, 51358979}, {64928, 51359747}, - {64929, 51360515}, {64930, 51361283}, {64931, 51362051}, {64932, 51362819}, - {64933, 51363587}, {64934, 51364355}, {64935, 51365123}, {64936, 51365891}, - {64937, 51366659}, {64938, 51367427}, {64939, 51368195}, {64940, 51368963}, - {64941, 51369731}, {64942, 51277315}, {64943, 51370499}, {64944, 51371267}, - {64945, 51372035}, {64946, 51372803}, {64947, 51373571}, {64948, 51341315}, - {64949, 51342851}, {64950, 51374339}, {64951, 51375107}, {64952, 51375875}, - {64953, 51376643}, {64954, 51377411}, {64955, 51378179}, {64956, 51377411}, - {64957, 51375875}, {64958, 51378947}, {64959, 51379715}, {64960, 51380483}, - {64961, 51381251}, {64962, 51382019}, {64963, 51378179}, {64964, 51335939}, - {64965, 51328259}, {64966, 51382787}, {64967, 51383555}, {64968, 2}, - {64975, 1}, {64976, 2}, {65008, 51384323}, {65009, 51385091}, - {65010, 68163075}, {65011, 68164099}, {65012, 68165123}, {65013, 68166147}, - {65014, 68167171}, {65015, 68168195}, {65016, 68169219}, {65017, 51393027}, - {65018, 303052035}, {65019, 135284483}, {65020, 68177667}, {65021, 1}, - {65024, 0}, {65040, 17847043}, {65041, 17847299}, {65042, 2}, - {65043, 17110275}, {65044, 16848643}, {65045, 17032707}, {65046, 17033731}, - {65047, 17847555}, {65048, 17847811}, {65049, 2}, {65056, 1}, - {65072, 2}, {65073, 17848067}, {65074, 17848323}, {65075, 17848579}, - {65077, 17037571}, {65078, 17037827}, {65079, 17848835}, {65080, 17849091}, - {65081, 17849347}, {65082, 17849603}, {65083, 17849859}, {65084, 17850115}, - {65085, 17850371}, {65086, 17850627}, {65087, 17067011}, {65088, 17067267}, - {65089, 17850883}, {65090, 17851139}, {65091, 17851395}, {65092, 17851651}, - {65093, 1}, {65095, 17851907}, {65096, 17852163}, {65097, 33810435}, - {65101, 17848579}, {65104, 17847043}, {65105, 17847299}, {65106, 2}, - {65108, 16848643}, {65109, 17110275}, {65110, 17033731}, {65111, 17032707}, - {65112, 17848067}, {65113, 17037571}, {65114, 17037827}, {65115, 17848835}, - {65116, 17849091}, {65117, 17849347}, {65118, 17849603}, {65119, 17852419}, - {65120, 17852675}, {65121, 17852931}, {65122, 17036803}, {65123, 17853187}, - {65124, 17853443}, {65125, 17853699}, {65126, 17037315}, {65127, 2}, - {65128, 17853955}, {65129, 17854211}, {65130, 17854467}, {65131, 17854723}, - {65132, 2}, {65136, 34632195}, {65137, 34632707}, {65138, 34503171}, - {65139, 1}, {65140, 34503939}, {65141, 2}, {65142, 34504707}, - {65143, 34523139}, {65144, 34505475}, {65145, 34523907}, {65146, 34506243}, - {65147, 34524675}, {65148, 34507011}, {65149, 34633219}, {65150, 34633731}, - {65151, 34634243}, {65152, 17857539}, {65153, 17857795}, {65155, 17858051}, - {65157, 17858307}, {65159, 17858563}, {65161, 17677059}, {65165, 16910339}, - {65167, 17683459}, {65171, 17858819}, {65173, 17686531}, {65177, 17689603}, - {65181, 17681667}, {65185, 17682179}, {65189, 17684739}, {65193, 17834243}, - {65195, 17724419}, {65197, 17724931}, {65199, 17731331}, {65201, 17694723}, - {65205, 17744899}, {65209, 17696771}, {65213, 17697795}, {65217, 17699843}, - {65221, 17700867}, {65225, 17701379}, {65229, 17702403}, {65233, 17703427}, - {65237, 17706499}, {65241, 17708547}, {65245, 17710851}, {65249, 17682691}, - {65253, 17717763}, {65257, 17720835}, {65261, 16910851}, {65263, 17676803}, - {65265, 16911875}, {65269, 34636291}, {65271, 34636803}, {65273, 34637315}, - {65275, 34622211}, {65277, 2}, {65279, 0}, {65280, 2}, - {65281, 17032707}, {65282, 17860611}, {65283, 17852419}, {65284, 17854211}, - {65285, 17854467}, {65286, 17852675}, {65287, 17860867}, {65288, 17037571}, - {65289, 17037827}, {65290, 17852931}, {65291, 17036803}, {65292, 17847043}, - {65293, 17853187}, {65294, 17196291}, {65295, 17038339}, {65296, 17035267}, - {65297, 16786947}, {65298, 16785155}, {65299, 16785411}, {65300, 16787715}, - {65301, 17035523}, {65302, 17035779}, {65303, 17036035}, {65304, 17036291}, - {65305, 17036547}, {65306, 17110275}, {65307, 16848643}, {65308, 17853443}, - {65309, 17037315}, {65310, 17853699}, {65311, 17033731}, {65312, 17854723}, - {65313, 16777219}, {65314, 16777475}, {65315, 16777731}, {65316, 16777987}, - {65317, 16778243}, {65318, 16778499}, {65319, 16778755}, {65320, 16779011}, - {65321, 16779267}, {65322, 16779523}, {65323, 16779779}, {65324, 16780035}, - {65325, 16780291}, {65326, 16780547}, {65327, 16780803}, {65328, 16781059}, - {65329, 16781315}, {65330, 16781571}, {65331, 16781827}, {65332, 16782083}, - {65333, 16782339}, {65334, 16782595}, {65335, 16782851}, {65336, 16783107}, - {65337, 16783363}, {65338, 16783619}, {65339, 17851907}, {65340, 17853955}, - {65341, 17852163}, {65342, 17861123}, {65343, 17848579}, {65344, 17026819}, - {65345, 16777219}, {65346, 16777475}, {65347, 16777731}, {65348, 16777987}, - {65349, 16778243}, {65350, 16778499}, {65351, 16778755}, {65352, 16779011}, - {65353, 16779267}, {65354, 16779523}, {65355, 16779779}, {65356, 16780035}, - {65357, 16780291}, {65358, 16780547}, {65359, 16780803}, {65360, 16781059}, - {65361, 16781315}, {65362, 16781571}, {65363, 16781827}, {65364, 16782083}, - {65365, 16782339}, {65366, 16782595}, {65367, 16782851}, {65368, 16783107}, - {65369, 16783363}, {65370, 16783619}, {65371, 17848835}, {65372, 17861379}, - {65373, 17849091}, {65374, 17861635}, {65375, 17861891}, {65376, 17862147}, - {65377, 17196291}, {65378, 17850883}, {65379, 17851139}, {65380, 17847299}, - {65381, 17862403}, {65382, 17316611}, {65383, 17319171}, {65384, 17362179}, - {65385, 17862659}, {65386, 17363715}, {65387, 17323267}, {65388, 17862915}, - {65389, 17333507}, {65390, 17379331}, {65391, 17328899}, {65392, 17317891}, - {65393, 17305347}, {65394, 17305603}, {65395, 17305859}, {65396, 17306115}, - {65397, 17306371}, {65398, 17306627}, {65399, 17306883}, {65400, 17307139}, - {65401, 17307395}, {65402, 17198851}, {65403, 17307651}, {65404, 17307907}, - {65405, 17308163}, {65406, 17308419}, {65407, 17308675}, {65408, 17308931}, - {65409, 17309187}, {65410, 17309443}, {65411, 17309699}, {65412, 17199107}, - {65413, 17309955}, {65414, 17310211}, {65415, 17310467}, {65416, 17310723}, - {65417, 17310979}, {65418, 17311235}, {65419, 17311491}, {65420, 17311747}, - {65421, 17312003}, {65422, 17312259}, {65423, 17312515}, {65424, 17312771}, - {65425, 17313027}, {65426, 17313283}, {65427, 17313539}, {65428, 17313795}, - {65429, 17314051}, {65430, 17314307}, {65431, 17314563}, {65432, 17314819}, - {65433, 17315075}, {65434, 17315331}, {65435, 17315587}, {65436, 17315843}, - {65437, 17319683}, {65438, 17197571}, {65439, 17198083}, {65440, 2}, - {65441, 17199363}, {65442, 17199619}, {65443, 17199875}, {65444, 17200131}, - {65445, 17200387}, {65446, 17200643}, {65447, 17200899}, {65448, 17201155}, - {65449, 17201411}, {65450, 17201667}, {65451, 17201923}, {65452, 17202179}, - {65453, 17202435}, {65454, 17202691}, {65455, 17202947}, {65456, 17203203}, - {65457, 17203459}, {65458, 17203715}, {65459, 17203971}, {65460, 17204227}, - {65461, 17204483}, {65462, 17204739}, {65463, 17204995}, {65464, 17205251}, - {65465, 17205507}, {65466, 17205763}, {65467, 17206019}, {65468, 17206275}, - {65469, 17206531}, {65470, 17206787}, {65471, 2}, {65474, 17207043}, - {65475, 17207299}, {65476, 17207555}, {65477, 17207811}, {65478, 17208067}, - {65479, 17208323}, {65480, 2}, {65482, 17208579}, {65483, 17208835}, - {65484, 17209091}, {65485, 17209347}, {65486, 17209603}, {65487, 17209859}, - {65488, 2}, {65490, 17210115}, {65491, 17210371}, {65492, 17210627}, - {65493, 17210883}, {65494, 17211139}, {65495, 17211395}, {65496, 2}, - {65498, 17211651}, {65499, 17211907}, {65500, 17212163}, {65501, 2}, - {65504, 17863171}, {65505, 17863427}, {65506, 17863683}, {65507, 33561859}, - {65508, 17863939}, {65509, 17864195}, {65510, 17864451}, {65511, 2}, - {65512, 17864707}, {65513, 17864963}, {65514, 17865219}, {65515, 17865475}, - {65516, 17865731}, {65517, 17865987}, {65518, 17866243}, {65519, 2}, - {65536, 1}, {65548, 2}, {65549, 1}, {65575, 2}, - {65576, 1}, {65595, 2}, {65596, 1}, {65598, 2}, - {65599, 1}, {65614, 2}, {65616, 1}, {65630, 2}, - {65664, 1}, {65787, 2}, {65792, 1}, {65795, 2}, - {65799, 1}, {65844, 2}, {65847, 1}, {65935, 2}, - {65936, 1}, {65949, 2}, {65952, 1}, {65953, 2}, - {66000, 1}, {66046, 2}, {66176, 1}, {66205, 2}, - {66208, 1}, {66257, 2}, {66272, 1}, {66300, 2}, - {66304, 1}, {66340, 2}, {66349, 1}, {66379, 2}, - {66384, 1}, {66427, 2}, {66432, 1}, {66462, 2}, - {66463, 1}, {66500, 2}, {66504, 1}, {66518, 2}, - {66560, 17866499}, {66561, 17866755}, {66562, 17867011}, {66563, 17867267}, - {66564, 17867523}, {66565, 17867779}, {66566, 17868035}, {66567, 17868291}, - {66568, 17868547}, {66569, 17868803}, {66570, 17869059}, {66571, 17869315}, - {66572, 17869571}, {66573, 17869827}, {66574, 17870083}, {66575, 17870339}, - {66576, 17870595}, {66577, 17870851}, {66578, 17871107}, {66579, 17871363}, - {66580, 17871619}, {66581, 17871875}, {66582, 17872131}, {66583, 17872387}, - {66584, 17872643}, {66585, 17872899}, {66586, 17873155}, {66587, 17873411}, - {66588, 17873667}, {66589, 17873923}, {66590, 17874179}, {66591, 17874435}, - {66592, 17874691}, {66593, 17874947}, {66594, 17875203}, {66595, 17875459}, - {66596, 17875715}, {66597, 17875971}, {66598, 17876227}, {66599, 17876483}, - {66600, 1}, {66718, 2}, {66720, 1}, {66730, 2}, - {66736, 17876739}, {66737, 17876995}, {66738, 17877251}, {66739, 17877507}, - {66740, 17877763}, {66741, 17878019}, {66742, 17878275}, {66743, 17878531}, - {66744, 17878787}, {66745, 17879043}, {66746, 17879299}, {66747, 17879555}, - {66748, 17879811}, {66749, 17880067}, {66750, 17880323}, {66751, 17880579}, - {66752, 17880835}, {66753, 17881091}, {66754, 17881347}, {66755, 17881603}, - {66756, 17881859}, {66757, 17882115}, {66758, 17882371}, {66759, 17882627}, - {66760, 17882883}, {66761, 17883139}, {66762, 17883395}, {66763, 17883651}, - {66764, 17883907}, {66765, 17884163}, {66766, 17884419}, {66767, 17884675}, - {66768, 17884931}, {66769, 17885187}, {66770, 17885443}, {66771, 17885699}, - {66772, 2}, {66776, 1}, {66812, 2}, {66816, 1}, - {66856, 2}, {66864, 1}, {66916, 2}, {66927, 1}, - {66928, 17885955}, {66929, 17886211}, {66930, 17886467}, {66931, 17886723}, - {66932, 17886979}, {66933, 17887235}, {66934, 17887491}, {66935, 17887747}, - {66936, 17888003}, {66937, 17888259}, {66938, 17888515}, {66939, 2}, - {66940, 17888771}, {66941, 17889027}, {66942, 17889283}, {66943, 17889539}, - {66944, 17889795}, {66945, 17890051}, {66946, 17890307}, {66947, 17890563}, - {66948, 17890819}, {66949, 17891075}, {66950, 17891331}, {66951, 17891587}, - {66952, 17891843}, {66953, 17892099}, {66954, 17892355}, {66955, 2}, - {66956, 17892611}, {66957, 17892867}, {66958, 17893123}, {66959, 17893379}, - {66960, 17893635}, {66961, 17893891}, {66962, 17894147}, {66963, 2}, - {66964, 17894403}, {66965, 17894659}, {66966, 2}, {66967, 1}, - {66978, 2}, {66979, 1}, {66994, 2}, {66995, 1}, - {67002, 2}, {67003, 1}, {67005, 2}, {67072, 1}, - {67383, 2}, {67392, 1}, {67414, 2}, {67424, 1}, - {67432, 2}, {67456, 1}, {67457, 17894915}, {67458, 17895171}, - {67459, 16791043}, {67460, 17895427}, {67461, 16814083}, {67462, 2}, - {67463, 17895683}, {67464, 17895939}, {67465, 17896195}, {67466, 17896451}, - {67467, 16815363}, {67468, 16815619}, {67469, 17896707}, {67470, 17896963}, - {67471, 17897219}, {67472, 17897475}, {67473, 17897731}, {67474, 17897987}, - {67475, 16817155}, {67476, 17898243}, {67477, 16802051}, {67478, 17898499}, - {67479, 17898755}, {67480, 17899011}, {67481, 17899267}, {67482, 17899523}, - {67483, 17512707}, {67484, 17899779}, {67485, 17900035}, {67486, 17900291}, - {67487, 17900547}, {67488, 17900803}, {67489, 17901059}, {67490, 16795395}, - {67491, 17901315}, {67492, 17901571}, {67493, 16781315}, {67494, 17901827}, - {67495, 17902083}, {67496, 17125123}, {67497, 17902339}, {67498, 16819971}, - {67499, 17902595}, {67500, 17902851}, {67501, 17903107}, {67502, 17903363}, - {67503, 16820995}, {67504, 17903619}, {67505, 2}, {67506, 17903875}, - {67507, 17904131}, {67508, 17904387}, {67509, 17904643}, {67510, 17904899}, - {67511, 17905155}, {67512, 17905411}, {67513, 17905667}, {67514, 17905923}, - {67515, 2}, {67584, 1}, {67590, 2}, {67592, 1}, - {67593, 2}, {67594, 1}, {67638, 2}, {67639, 1}, - {67641, 2}, {67644, 1}, {67645, 2}, {67647, 1}, - {67670, 2}, {67671, 1}, {67743, 2}, {67751, 1}, - {67760, 2}, {67808, 1}, {67827, 2}, {67828, 1}, - {67830, 2}, {67835, 1}, {67868, 2}, {67871, 1}, - {67898, 2}, {67903, 1}, {67904, 2}, {67968, 1}, - {68024, 2}, {68028, 1}, {68048, 2}, {68050, 1}, - {68100, 2}, {68101, 1}, {68103, 2}, {68108, 1}, - {68116, 2}, {68117, 1}, {68120, 2}, {68121, 1}, - {68150, 2}, {68152, 1}, {68155, 2}, {68159, 1}, - {68169, 2}, {68176, 1}, {68185, 2}, {68192, 1}, - {68256, 2}, {68288, 1}, {68327, 2}, {68331, 1}, - {68343, 2}, {68352, 1}, {68406, 2}, {68409, 1}, - {68438, 2}, {68440, 1}, {68467, 2}, {68472, 1}, - {68498, 2}, {68505, 1}, {68509, 2}, {68521, 1}, - {68528, 2}, {68608, 1}, {68681, 2}, {68736, 17906179}, - {68737, 17906435}, {68738, 17906691}, {68739, 17906947}, {68740, 17907203}, - {68741, 17907459}, {68742, 17907715}, {68743, 17907971}, {68744, 17908227}, - {68745, 17908483}, {68746, 17908739}, {68747, 17908995}, {68748, 17909251}, - {68749, 17909507}, {68750, 17909763}, {68751, 17910019}, {68752, 17910275}, - {68753, 17910531}, {68754, 17910787}, {68755, 17911043}, {68756, 17911299}, - {68757, 17911555}, {68758, 17911811}, {68759, 17912067}, {68760, 17912323}, - {68761, 17912579}, {68762, 17912835}, {68763, 17913091}, {68764, 17913347}, - {68765, 17913603}, {68766, 17913859}, {68767, 17914115}, {68768, 17914371}, - {68769, 17914627}, {68770, 17914883}, {68771, 17915139}, {68772, 17915395}, - {68773, 17915651}, {68774, 17915907}, {68775, 17916163}, {68776, 17916419}, - {68777, 17916675}, {68778, 17916931}, {68779, 17917187}, {68780, 17917443}, - {68781, 17917699}, {68782, 17917955}, {68783, 17918211}, {68784, 17918467}, - {68785, 17918723}, {68786, 17918979}, {68787, 2}, {68800, 1}, - {68851, 2}, {68858, 1}, {68904, 2}, {68912, 1}, - {68922, 2}, {69216, 1}, {69247, 2}, {69248, 1}, - {69290, 2}, {69291, 1}, {69294, 2}, {69296, 1}, - {69298, 2}, {69373, 1}, {69416, 2}, {69424, 1}, - {69466, 2}, {69488, 1}, {69514, 2}, {69552, 1}, - {69580, 2}, {69600, 1}, {69623, 2}, {69632, 1}, - {69710, 2}, {69714, 1}, {69750, 2}, {69759, 1}, - {69821, 2}, {69822, 1}, {69827, 2}, {69840, 1}, - {69865, 2}, {69872, 1}, {69882, 2}, {69888, 1}, - {69941, 2}, {69942, 1}, {69960, 2}, {69968, 1}, - {70007, 2}, {70016, 1}, {70112, 2}, {70113, 1}, - {70133, 2}, {70144, 1}, {70162, 2}, {70163, 1}, - {70210, 2}, {70272, 1}, {70279, 2}, {70280, 1}, - {70281, 2}, {70282, 1}, {70286, 2}, {70287, 1}, - {70302, 2}, {70303, 1}, {70314, 2}, {70320, 1}, - {70379, 2}, {70384, 1}, {70394, 2}, {70400, 1}, - {70404, 2}, {70405, 1}, {70413, 2}, {70415, 1}, - {70417, 2}, {70419, 1}, {70441, 2}, {70442, 1}, - {70449, 2}, {70450, 1}, {70452, 2}, {70453, 1}, - {70458, 2}, {70459, 1}, {70469, 2}, {70471, 1}, - {70473, 2}, {70475, 1}, {70478, 2}, {70480, 1}, - {70481, 2}, {70487, 1}, {70488, 2}, {70493, 1}, - {70500, 2}, {70502, 1}, {70509, 2}, {70512, 1}, - {70517, 2}, {70656, 1}, {70748, 2}, {70749, 1}, - {70754, 2}, {70784, 1}, {70856, 2}, {70864, 1}, - {70874, 2}, {71040, 1}, {71094, 2}, {71096, 1}, - {71134, 2}, {71168, 1}, {71237, 2}, {71248, 1}, - {71258, 2}, {71264, 1}, {71277, 2}, {71296, 1}, - {71354, 2}, {71360, 1}, {71370, 2}, {71424, 1}, - {71451, 2}, {71453, 1}, {71468, 2}, {71472, 1}, - {71495, 2}, {71680, 1}, {71740, 2}, {71840, 17919235}, - {71841, 17919491}, {71842, 17919747}, {71843, 17920003}, {71844, 17920259}, - {71845, 17920515}, {71846, 17920771}, {71847, 17921027}, {71848, 17921283}, - {71849, 17921539}, {71850, 17921795}, {71851, 17922051}, {71852, 17922307}, - {71853, 17922563}, {71854, 17922819}, {71855, 17923075}, {71856, 17923331}, - {71857, 17923587}, {71858, 17923843}, {71859, 17924099}, {71860, 17924355}, - {71861, 17924611}, {71862, 17924867}, {71863, 17925123}, {71864, 17925379}, - {71865, 17925635}, {71866, 17925891}, {71867, 17926147}, {71868, 17926403}, - {71869, 17926659}, {71870, 17926915}, {71871, 17927171}, {71872, 1}, - {71923, 2}, {71935, 1}, {71943, 2}, {71945, 1}, - {71946, 2}, {71948, 1}, {71956, 2}, {71957, 1}, - {71959, 2}, {71960, 1}, {71990, 2}, {71991, 1}, - {71993, 2}, {71995, 1}, {72007, 2}, {72016, 1}, - {72026, 2}, {72096, 1}, {72104, 2}, {72106, 1}, - {72152, 2}, {72154, 1}, {72165, 2}, {72192, 1}, - {72264, 2}, {72272, 1}, {72355, 2}, {72368, 1}, - {72441, 2}, {72448, 1}, {72458, 2}, {72704, 1}, - {72713, 2}, {72714, 1}, {72759, 2}, {72760, 1}, - {72774, 2}, {72784, 1}, {72813, 2}, {72816, 1}, - {72848, 2}, {72850, 1}, {72872, 2}, {72873, 1}, - {72887, 2}, {72960, 1}, {72967, 2}, {72968, 1}, - {72970, 2}, {72971, 1}, {73015, 2}, {73018, 1}, - {73019, 2}, {73020, 1}, {73022, 2}, {73023, 1}, - {73032, 2}, {73040, 1}, {73050, 2}, {73056, 1}, - {73062, 2}, {73063, 1}, {73065, 2}, {73066, 1}, - {73103, 2}, {73104, 1}, {73106, 2}, {73107, 1}, - {73113, 2}, {73120, 1}, {73130, 2}, {73440, 1}, - {73465, 2}, {73472, 1}, {73489, 2}, {73490, 1}, - {73531, 2}, {73534, 1}, {73562, 2}, {73648, 1}, - {73649, 2}, {73664, 1}, {73714, 2}, {73727, 1}, - {74650, 2}, {74752, 1}, {74863, 2}, {74864, 1}, - {74869, 2}, {74880, 1}, {75076, 2}, {77712, 1}, - {77811, 2}, {77824, 1}, {78896, 2}, {78912, 1}, - {78934, 2}, {82944, 1}, {83527, 2}, {92160, 1}, - {92729, 2}, {92736, 1}, {92767, 2}, {92768, 1}, - {92778, 2}, {92782, 1}, {92863, 2}, {92864, 1}, - {92874, 2}, {92880, 1}, {92910, 2}, {92912, 1}, - {92918, 2}, {92928, 1}, {92998, 2}, {93008, 1}, - {93018, 2}, {93019, 1}, {93026, 2}, {93027, 1}, - {93048, 2}, {93053, 1}, {93072, 2}, {93760, 17927427}, - {93761, 17927683}, {93762, 17927939}, {93763, 17928195}, {93764, 17928451}, - {93765, 17928707}, {93766, 17928963}, {93767, 17929219}, {93768, 17929475}, - {93769, 17929731}, {93770, 17929987}, {93771, 17930243}, {93772, 17930499}, - {93773, 17930755}, {93774, 17931011}, {93775, 17931267}, {93776, 17931523}, - {93777, 17931779}, {93778, 17932035}, {93779, 17932291}, {93780, 17932547}, - {93781, 17932803}, {93782, 17933059}, {93783, 17933315}, {93784, 17933571}, - {93785, 17933827}, {93786, 17934083}, {93787, 17934339}, {93788, 17934595}, - {93789, 17934851}, {93790, 17935107}, {93791, 17935363}, {93792, 1}, - {93851, 2}, {93952, 1}, {94027, 2}, {94031, 1}, - {94088, 2}, {94095, 1}, {94112, 2}, {94176, 1}, - {94181, 2}, {94192, 1}, {94194, 2}, {94208, 1}, - {100344, 2}, {100352, 1}, {101590, 2}, {101632, 1}, - {101641, 2}, {110576, 1}, {110580, 2}, {110581, 1}, - {110588, 2}, {110589, 1}, {110591, 2}, {110592, 1}, - {110883, 2}, {110898, 1}, {110899, 2}, {110928, 1}, - {110931, 2}, {110933, 1}, {110934, 2}, {110948, 1}, - {110952, 2}, {110960, 1}, {111356, 2}, {113664, 1}, - {113771, 2}, {113776, 1}, {113789, 2}, {113792, 1}, - {113801, 2}, {113808, 1}, {113818, 2}, {113820, 1}, - {113824, 0}, {113828, 2}, {118528, 1}, {118574, 2}, - {118576, 1}, {118599, 2}, {118608, 1}, {118724, 2}, - {118784, 1}, {119030, 2}, {119040, 1}, {119079, 2}, - {119081, 1}, {119134, 34712835}, {119135, 34713347}, {119136, 51491075}, - {119137, 51491843}, {119138, 51492611}, {119139, 51493379}, {119140, 51494147}, - {119141, 1}, {119155, 2}, {119163, 1}, {119227, 34717699}, - {119228, 34718211}, {119229, 51495939}, {119230, 51496707}, {119231, 51497475}, - {119232, 51498243}, {119233, 1}, {119275, 2}, {119296, 1}, - {119366, 2}, {119488, 1}, {119508, 2}, {119520, 1}, - {119540, 2}, {119552, 1}, {119639, 2}, {119648, 1}, - {119673, 2}, {119808, 16777219}, {119809, 16777475}, {119810, 16777731}, - {119811, 16777987}, {119812, 16778243}, {119813, 16778499}, {119814, 16778755}, - {119815, 16779011}, {119816, 16779267}, {119817, 16779523}, {119818, 16779779}, - {119819, 16780035}, {119820, 16780291}, {119821, 16780547}, {119822, 16780803}, - {119823, 16781059}, {119824, 16781315}, {119825, 16781571}, {119826, 16781827}, - {119827, 16782083}, {119828, 16782339}, {119829, 16782595}, {119830, 16782851}, - {119831, 16783107}, {119832, 16783363}, {119833, 16783619}, {119834, 16777219}, - {119835, 16777475}, {119836, 16777731}, {119837, 16777987}, {119838, 16778243}, - {119839, 16778499}, {119840, 16778755}, {119841, 16779011}, {119842, 16779267}, - {119843, 16779523}, {119844, 16779779}, {119845, 16780035}, {119846, 16780291}, - {119847, 16780547}, {119848, 16780803}, {119849, 16781059}, {119850, 16781315}, - {119851, 16781571}, {119852, 16781827}, {119853, 16782083}, {119854, 16782339}, - {119855, 16782595}, {119856, 16782851}, {119857, 16783107}, {119858, 16783363}, - {119859, 16783619}, {119860, 16777219}, {119861, 16777475}, {119862, 16777731}, - {119863, 16777987}, {119864, 16778243}, {119865, 16778499}, {119866, 16778755}, - {119867, 16779011}, {119868, 16779267}, {119869, 16779523}, {119870, 16779779}, - {119871, 16780035}, {119872, 16780291}, {119873, 16780547}, {119874, 16780803}, - {119875, 16781059}, {119876, 16781315}, {119877, 16781571}, {119878, 16781827}, - {119879, 16782083}, {119880, 16782339}, {119881, 16782595}, {119882, 16782851}, - {119883, 16783107}, {119884, 16783363}, {119885, 16783619}, {119886, 16777219}, - {119887, 16777475}, {119888, 16777731}, {119889, 16777987}, {119890, 16778243}, - {119891, 16778499}, {119892, 16778755}, {119893, 2}, {119894, 16779267}, - {119895, 16779523}, {119896, 16779779}, {119897, 16780035}, {119898, 16780291}, - {119899, 16780547}, {119900, 16780803}, {119901, 16781059}, {119902, 16781315}, - {119903, 16781571}, {119904, 16781827}, {119905, 16782083}, {119906, 16782339}, - {119907, 16782595}, {119908, 16782851}, {119909, 16783107}, {119910, 16783363}, - {119911, 16783619}, {119912, 16777219}, {119913, 16777475}, {119914, 16777731}, - {119915, 16777987}, {119916, 16778243}, {119917, 16778499}, {119918, 16778755}, - {119919, 16779011}, {119920, 16779267}, {119921, 16779523}, {119922, 16779779}, - {119923, 16780035}, {119924, 16780291}, {119925, 16780547}, {119926, 16780803}, - {119927, 16781059}, {119928, 16781315}, {119929, 16781571}, {119930, 16781827}, - {119931, 16782083}, {119932, 16782339}, {119933, 16782595}, {119934, 16782851}, - {119935, 16783107}, {119936, 16783363}, {119937, 16783619}, {119938, 16777219}, - {119939, 16777475}, {119940, 16777731}, {119941, 16777987}, {119942, 16778243}, - {119943, 16778499}, {119944, 16778755}, {119945, 16779011}, {119946, 16779267}, - {119947, 16779523}, {119948, 16779779}, {119949, 16780035}, {119950, 16780291}, - {119951, 16780547}, {119952, 16780803}, {119953, 16781059}, {119954, 16781315}, - {119955, 16781571}, {119956, 16781827}, {119957, 16782083}, {119958, 16782339}, - {119959, 16782595}, {119960, 16782851}, {119961, 16783107}, {119962, 16783363}, - {119963, 16783619}, {119964, 16777219}, {119965, 2}, {119966, 16777731}, - {119967, 16777987}, {119968, 2}, {119970, 16778755}, {119971, 2}, - {119973, 16779523}, {119974, 16779779}, {119975, 2}, {119977, 16780547}, - {119978, 16780803}, {119979, 16781059}, {119980, 16781315}, {119981, 2}, - {119982, 16781827}, {119983, 16782083}, {119984, 16782339}, {119985, 16782595}, - {119986, 16782851}, {119987, 16783107}, {119988, 16783363}, {119989, 16783619}, - {119990, 16777219}, {119991, 16777475}, {119992, 16777731}, {119993, 16777987}, - {119994, 2}, {119995, 16778499}, {119996, 2}, {119997, 16779011}, - {119998, 16779267}, {119999, 16779523}, {120000, 16779779}, {120001, 16780035}, - {120002, 16780291}, {120003, 16780547}, {120004, 2}, {120005, 16781059}, - {120006, 16781315}, {120007, 16781571}, {120008, 16781827}, {120009, 16782083}, - {120010, 16782339}, {120011, 16782595}, {120012, 16782851}, {120013, 16783107}, - {120014, 16783363}, {120015, 16783619}, {120016, 16777219}, {120017, 16777475}, - {120018, 16777731}, {120019, 16777987}, {120020, 16778243}, {120021, 16778499}, - {120022, 16778755}, {120023, 16779011}, {120024, 16779267}, {120025, 16779523}, - {120026, 16779779}, {120027, 16780035}, {120028, 16780291}, {120029, 16780547}, - {120030, 16780803}, {120031, 16781059}, {120032, 16781315}, {120033, 16781571}, - {120034, 16781827}, {120035, 16782083}, {120036, 16782339}, {120037, 16782595}, - {120038, 16782851}, {120039, 16783107}, {120040, 16783363}, {120041, 16783619}, - {120042, 16777219}, {120043, 16777475}, {120044, 16777731}, {120045, 16777987}, - {120046, 16778243}, {120047, 16778499}, {120048, 16778755}, {120049, 16779011}, - {120050, 16779267}, {120051, 16779523}, {120052, 16779779}, {120053, 16780035}, - {120054, 16780291}, {120055, 16780547}, {120056, 16780803}, {120057, 16781059}, - {120058, 16781315}, {120059, 16781571}, {120060, 16781827}, {120061, 16782083}, - {120062, 16782339}, {120063, 16782595}, {120064, 16782851}, {120065, 16783107}, - {120066, 16783363}, {120067, 16783619}, {120068, 16777219}, {120069, 16777475}, - {120070, 2}, {120071, 16777987}, {120072, 16778243}, {120073, 16778499}, - {120074, 16778755}, {120075, 2}, {120077, 16779523}, {120078, 16779779}, - {120079, 16780035}, {120080, 16780291}, {120081, 16780547}, {120082, 16780803}, - {120083, 16781059}, {120084, 16781315}, {120085, 2}, {120086, 16781827}, - {120087, 16782083}, {120088, 16782339}, {120089, 16782595}, {120090, 16782851}, - {120091, 16783107}, {120092, 16783363}, {120093, 2}, {120094, 16777219}, - {120095, 16777475}, {120096, 16777731}, {120097, 16777987}, {120098, 16778243}, - {120099, 16778499}, {120100, 16778755}, {120101, 16779011}, {120102, 16779267}, - {120103, 16779523}, {120104, 16779779}, {120105, 16780035}, {120106, 16780291}, - {120107, 16780547}, {120108, 16780803}, {120109, 16781059}, {120110, 16781315}, - {120111, 16781571}, {120112, 16781827}, {120113, 16782083}, {120114, 16782339}, - {120115, 16782595}, {120116, 16782851}, {120117, 16783107}, {120118, 16783363}, - {120119, 16783619}, {120120, 16777219}, {120121, 16777475}, {120122, 2}, - {120123, 16777987}, {120124, 16778243}, {120125, 16778499}, {120126, 16778755}, - {120127, 2}, {120128, 16779267}, {120129, 16779523}, {120130, 16779779}, - {120131, 16780035}, {120132, 16780291}, {120133, 2}, {120134, 16780803}, - {120135, 2}, {120138, 16781827}, {120139, 16782083}, {120140, 16782339}, - {120141, 16782595}, {120142, 16782851}, {120143, 16783107}, {120144, 16783363}, - {120145, 2}, {120146, 16777219}, {120147, 16777475}, {120148, 16777731}, - {120149, 16777987}, {120150, 16778243}, {120151, 16778499}, {120152, 16778755}, - {120153, 16779011}, {120154, 16779267}, {120155, 16779523}, {120156, 16779779}, - {120157, 16780035}, {120158, 16780291}, {120159, 16780547}, {120160, 16780803}, - {120161, 16781059}, {120162, 16781315}, {120163, 16781571}, {120164, 16781827}, - {120165, 16782083}, {120166, 16782339}, {120167, 16782595}, {120168, 16782851}, - {120169, 16783107}, {120170, 16783363}, {120171, 16783619}, {120172, 16777219}, - {120173, 16777475}, {120174, 16777731}, {120175, 16777987}, {120176, 16778243}, - {120177, 16778499}, {120178, 16778755}, {120179, 16779011}, {120180, 16779267}, - {120181, 16779523}, {120182, 16779779}, {120183, 16780035}, {120184, 16780291}, - {120185, 16780547}, {120186, 16780803}, {120187, 16781059}, {120188, 16781315}, - {120189, 16781571}, {120190, 16781827}, {120191, 16782083}, {120192, 16782339}, - {120193, 16782595}, {120194, 16782851}, {120195, 16783107}, {120196, 16783363}, - {120197, 16783619}, {120198, 16777219}, {120199, 16777475}, {120200, 16777731}, - {120201, 16777987}, {120202, 16778243}, {120203, 16778499}, {120204, 16778755}, - {120205, 16779011}, {120206, 16779267}, {120207, 16779523}, {120208, 16779779}, - {120209, 16780035}, {120210, 16780291}, {120211, 16780547}, {120212, 16780803}, - {120213, 16781059}, {120214, 16781315}, {120215, 16781571}, {120216, 16781827}, - {120217, 16782083}, {120218, 16782339}, {120219, 16782595}, {120220, 16782851}, - {120221, 16783107}, {120222, 16783363}, {120223, 16783619}, {120224, 16777219}, - {120225, 16777475}, {120226, 16777731}, {120227, 16777987}, {120228, 16778243}, - {120229, 16778499}, {120230, 16778755}, {120231, 16779011}, {120232, 16779267}, - {120233, 16779523}, {120234, 16779779}, {120235, 16780035}, {120236, 16780291}, - {120237, 16780547}, {120238, 16780803}, {120239, 16781059}, {120240, 16781315}, - {120241, 16781571}, {120242, 16781827}, {120243, 16782083}, {120244, 16782339}, - {120245, 16782595}, {120246, 16782851}, {120247, 16783107}, {120248, 16783363}, - {120249, 16783619}, {120250, 16777219}, {120251, 16777475}, {120252, 16777731}, - {120253, 16777987}, {120254, 16778243}, {120255, 16778499}, {120256, 16778755}, - {120257, 16779011}, {120258, 16779267}, {120259, 16779523}, {120260, 16779779}, - {120261, 16780035}, {120262, 16780291}, {120263, 16780547}, {120264, 16780803}, - {120265, 16781059}, {120266, 16781315}, {120267, 16781571}, {120268, 16781827}, - {120269, 16782083}, {120270, 16782339}, {120271, 16782595}, {120272, 16782851}, - {120273, 16783107}, {120274, 16783363}, {120275, 16783619}, {120276, 16777219}, - {120277, 16777475}, {120278, 16777731}, {120279, 16777987}, {120280, 16778243}, - {120281, 16778499}, {120282, 16778755}, {120283, 16779011}, {120284, 16779267}, - {120285, 16779523}, {120286, 16779779}, {120287, 16780035}, {120288, 16780291}, - {120289, 16780547}, {120290, 16780803}, {120291, 16781059}, {120292, 16781315}, - {120293, 16781571}, {120294, 16781827}, {120295, 16782083}, {120296, 16782339}, - {120297, 16782595}, {120298, 16782851}, {120299, 16783107}, {120300, 16783363}, - {120301, 16783619}, {120302, 16777219}, {120303, 16777475}, {120304, 16777731}, - {120305, 16777987}, {120306, 16778243}, {120307, 16778499}, {120308, 16778755}, - {120309, 16779011}, {120310, 16779267}, {120311, 16779523}, {120312, 16779779}, - {120313, 16780035}, {120314, 16780291}, {120315, 16780547}, {120316, 16780803}, - {120317, 16781059}, {120318, 16781315}, {120319, 16781571}, {120320, 16781827}, - {120321, 16782083}, {120322, 16782339}, {120323, 16782595}, {120324, 16782851}, - {120325, 16783107}, {120326, 16783363}, {120327, 16783619}, {120328, 16777219}, - {120329, 16777475}, {120330, 16777731}, {120331, 16777987}, {120332, 16778243}, - {120333, 16778499}, {120334, 16778755}, {120335, 16779011}, {120336, 16779267}, - {120337, 16779523}, {120338, 16779779}, {120339, 16780035}, {120340, 16780291}, - {120341, 16780547}, {120342, 16780803}, {120343, 16781059}, {120344, 16781315}, - {120345, 16781571}, {120346, 16781827}, {120347, 16782083}, {120348, 16782339}, - {120349, 16782595}, {120350, 16782851}, {120351, 16783107}, {120352, 16783363}, - {120353, 16783619}, {120354, 16777219}, {120355, 16777475}, {120356, 16777731}, - {120357, 16777987}, {120358, 16778243}, {120359, 16778499}, {120360, 16778755}, - {120361, 16779011}, {120362, 16779267}, {120363, 16779523}, {120364, 16779779}, - {120365, 16780035}, {120366, 16780291}, {120367, 16780547}, {120368, 16780803}, - {120369, 16781059}, {120370, 16781315}, {120371, 16781571}, {120372, 16781827}, - {120373, 16782083}, {120374, 16782339}, {120375, 16782595}, {120376, 16782851}, - {120377, 16783107}, {120378, 16783363}, {120379, 16783619}, {120380, 16777219}, - {120381, 16777475}, {120382, 16777731}, {120383, 16777987}, {120384, 16778243}, - {120385, 16778499}, {120386, 16778755}, {120387, 16779011}, {120388, 16779267}, - {120389, 16779523}, {120390, 16779779}, {120391, 16780035}, {120392, 16780291}, - {120393, 16780547}, {120394, 16780803}, {120395, 16781059}, {120396, 16781315}, - {120397, 16781571}, {120398, 16781827}, {120399, 16782083}, {120400, 16782339}, - {120401, 16782595}, {120402, 16782851}, {120403, 16783107}, {120404, 16783363}, - {120405, 16783619}, {120406, 16777219}, {120407, 16777475}, {120408, 16777731}, - {120409, 16777987}, {120410, 16778243}, {120411, 16778499}, {120412, 16778755}, - {120413, 16779011}, {120414, 16779267}, {120415, 16779523}, {120416, 16779779}, - {120417, 16780035}, {120418, 16780291}, {120419, 16780547}, {120420, 16780803}, - {120421, 16781059}, {120422, 16781315}, {120423, 16781571}, {120424, 16781827}, - {120425, 16782083}, {120426, 16782339}, {120427, 16782595}, {120428, 16782851}, - {120429, 16783107}, {120430, 16783363}, {120431, 16783619}, {120432, 16777219}, - {120433, 16777475}, {120434, 16777731}, {120435, 16777987}, {120436, 16778243}, - {120437, 16778499}, {120438, 16778755}, {120439, 16779011}, {120440, 16779267}, - {120441, 16779523}, {120442, 16779779}, {120443, 16780035}, {120444, 16780291}, - {120445, 16780547}, {120446, 16780803}, {120447, 16781059}, {120448, 16781315}, - {120449, 16781571}, {120450, 16781827}, {120451, 16782083}, {120452, 16782339}, - {120453, 16782595}, {120454, 16782851}, {120455, 16783107}, {120456, 16783363}, - {120457, 16783619}, {120458, 16777219}, {120459, 16777475}, {120460, 16777731}, - {120461, 16777987}, {120462, 16778243}, {120463, 16778499}, {120464, 16778755}, - {120465, 16779011}, {120466, 16779267}, {120467, 16779523}, {120468, 16779779}, - {120469, 16780035}, {120470, 16780291}, {120471, 16780547}, {120472, 16780803}, - {120473, 16781059}, {120474, 16781315}, {120475, 16781571}, {120476, 16781827}, - {120477, 16782083}, {120478, 16782339}, {120479, 16782595}, {120480, 16782851}, - {120481, 16783107}, {120482, 16783363}, {120483, 16783619}, {120484, 17944579}, - {120485, 17944835}, {120486, 2}, {120488, 16851715}, {120489, 16851971}, - {120490, 16852227}, {120491, 16852483}, {120492, 16852739}, {120493, 16852995}, - {120494, 16853251}, {120495, 16853507}, {120496, 16846851}, {120497, 16853763}, - {120498, 16854019}, {120499, 16786179}, {120500, 16854275}, {120501, 16854531}, - {120502, 16854787}, {120503, 16855043}, {120504, 16855299}, {120505, 16853507}, - {120506, 16855555}, {120507, 16855811}, {120508, 16856067}, {120509, 16856323}, - {120510, 16856579}, {120511, 16856835}, {120512, 16857091}, {120513, 17945091}, - {120514, 16851715}, {120515, 16851971}, {120516, 16852227}, {120517, 16852483}, - {120518, 16852739}, {120519, 16852995}, {120520, 16853251}, {120521, 16853507}, - {120522, 16846851}, {120523, 16853763}, {120524, 16854019}, {120525, 16786179}, - {120526, 16854275}, {120527, 16854531}, {120528, 16854787}, {120529, 16855043}, - {120530, 16855299}, {120531, 16855555}, {120533, 16855811}, {120534, 16856067}, - {120535, 16856323}, {120536, 16856579}, {120537, 16856835}, {120538, 16857091}, - {120539, 17945347}, {120540, 16852739}, {120541, 16853507}, {120542, 16853763}, - {120543, 16856323}, {120544, 16855299}, {120545, 16855043}, {120546, 16851715}, - {120547, 16851971}, {120548, 16852227}, {120549, 16852483}, {120550, 16852739}, - {120551, 16852995}, {120552, 16853251}, {120553, 16853507}, {120554, 16846851}, - {120555, 16853763}, {120556, 16854019}, {120557, 16786179}, {120558, 16854275}, - {120559, 16854531}, {120560, 16854787}, {120561, 16855043}, {120562, 16855299}, - {120563, 16853507}, {120564, 16855555}, {120565, 16855811}, {120566, 16856067}, - {120567, 16856323}, {120568, 16856579}, {120569, 16856835}, {120570, 16857091}, - {120571, 17945091}, {120572, 16851715}, {120573, 16851971}, {120574, 16852227}, - {120575, 16852483}, {120576, 16852739}, {120577, 16852995}, {120578, 16853251}, - {120579, 16853507}, {120580, 16846851}, {120581, 16853763}, {120582, 16854019}, - {120583, 16786179}, {120584, 16854275}, {120585, 16854531}, {120586, 16854787}, - {120587, 16855043}, {120588, 16855299}, {120589, 16855555}, {120591, 16855811}, - {120592, 16856067}, {120593, 16856323}, {120594, 16856579}, {120595, 16856835}, - {120596, 16857091}, {120597, 17945347}, {120598, 16852739}, {120599, 16853507}, - {120600, 16853763}, {120601, 16856323}, {120602, 16855299}, {120603, 16855043}, - {120604, 16851715}, {120605, 16851971}, {120606, 16852227}, {120607, 16852483}, - {120608, 16852739}, {120609, 16852995}, {120610, 16853251}, {120611, 16853507}, - {120612, 16846851}, {120613, 16853763}, {120614, 16854019}, {120615, 16786179}, - {120616, 16854275}, {120617, 16854531}, {120618, 16854787}, {120619, 16855043}, - {120620, 16855299}, {120621, 16853507}, {120622, 16855555}, {120623, 16855811}, - {120624, 16856067}, {120625, 16856323}, {120626, 16856579}, {120627, 16856835}, - {120628, 16857091}, {120629, 17945091}, {120630, 16851715}, {120631, 16851971}, - {120632, 16852227}, {120633, 16852483}, {120634, 16852739}, {120635, 16852995}, - {120636, 16853251}, {120637, 16853507}, {120638, 16846851}, {120639, 16853763}, - {120640, 16854019}, {120641, 16786179}, {120642, 16854275}, {120643, 16854531}, - {120644, 16854787}, {120645, 16855043}, {120646, 16855299}, {120647, 16855555}, - {120649, 16855811}, {120650, 16856067}, {120651, 16856323}, {120652, 16856579}, - {120653, 16856835}, {120654, 16857091}, {120655, 17945347}, {120656, 16852739}, - {120657, 16853507}, {120658, 16853763}, {120659, 16856323}, {120660, 16855299}, - {120661, 16855043}, {120662, 16851715}, {120663, 16851971}, {120664, 16852227}, - {120665, 16852483}, {120666, 16852739}, {120667, 16852995}, {120668, 16853251}, - {120669, 16853507}, {120670, 16846851}, {120671, 16853763}, {120672, 16854019}, - {120673, 16786179}, {120674, 16854275}, {120675, 16854531}, {120676, 16854787}, - {120677, 16855043}, {120678, 16855299}, {120679, 16853507}, {120680, 16855555}, - {120681, 16855811}, {120682, 16856067}, {120683, 16856323}, {120684, 16856579}, - {120685, 16856835}, {120686, 16857091}, {120687, 17945091}, {120688, 16851715}, - {120689, 16851971}, {120690, 16852227}, {120691, 16852483}, {120692, 16852739}, - {120693, 16852995}, {120694, 16853251}, {120695, 16853507}, {120696, 16846851}, - {120697, 16853763}, {120698, 16854019}, {120699, 16786179}, {120700, 16854275}, - {120701, 16854531}, {120702, 16854787}, {120703, 16855043}, {120704, 16855299}, - {120705, 16855555}, {120707, 16855811}, {120708, 16856067}, {120709, 16856323}, - {120710, 16856579}, {120711, 16856835}, {120712, 16857091}, {120713, 17945347}, - {120714, 16852739}, {120715, 16853507}, {120716, 16853763}, {120717, 16856323}, - {120718, 16855299}, {120719, 16855043}, {120720, 16851715}, {120721, 16851971}, - {120722, 16852227}, {120723, 16852483}, {120724, 16852739}, {120725, 16852995}, - {120726, 16853251}, {120727, 16853507}, {120728, 16846851}, {120729, 16853763}, - {120730, 16854019}, {120731, 16786179}, {120732, 16854275}, {120733, 16854531}, - {120734, 16854787}, {120735, 16855043}, {120736, 16855299}, {120737, 16853507}, - {120738, 16855555}, {120739, 16855811}, {120740, 16856067}, {120741, 16856323}, - {120742, 16856579}, {120743, 16856835}, {120744, 16857091}, {120745, 17945091}, - {120746, 16851715}, {120747, 16851971}, {120748, 16852227}, {120749, 16852483}, - {120750, 16852739}, {120751, 16852995}, {120752, 16853251}, {120753, 16853507}, - {120754, 16846851}, {120755, 16853763}, {120756, 16854019}, {120757, 16786179}, - {120758, 16854275}, {120759, 16854531}, {120760, 16854787}, {120761, 16855043}, - {120762, 16855299}, {120763, 16855555}, {120765, 16855811}, {120766, 16856067}, - {120767, 16856323}, {120768, 16856579}, {120769, 16856835}, {120770, 16857091}, - {120771, 17945347}, {120772, 16852739}, {120773, 16853507}, {120774, 16853763}, - {120775, 16856323}, {120776, 16855299}, {120777, 16855043}, {120778, 16858627}, - {120780, 2}, {120782, 17035267}, {120783, 16786947}, {120784, 16785155}, - {120785, 16785411}, {120786, 16787715}, {120787, 17035523}, {120788, 17035779}, - {120789, 17036035}, {120790, 17036291}, {120791, 17036547}, {120792, 17035267}, - {120793, 16786947}, {120794, 16785155}, {120795, 16785411}, {120796, 16787715}, - {120797, 17035523}, {120798, 17035779}, {120799, 17036035}, {120800, 17036291}, - {120801, 17036547}, {120802, 17035267}, {120803, 16786947}, {120804, 16785155}, - {120805, 16785411}, {120806, 16787715}, {120807, 17035523}, {120808, 17035779}, - {120809, 17036035}, {120810, 17036291}, {120811, 17036547}, {120812, 17035267}, - {120813, 16786947}, {120814, 16785155}, {120815, 16785411}, {120816, 16787715}, - {120817, 17035523}, {120818, 17035779}, {120819, 17036035}, {120820, 17036291}, - {120821, 17036547}, {120822, 17035267}, {120823, 16786947}, {120824, 16785155}, - {120825, 16785411}, {120826, 16787715}, {120827, 17035523}, {120828, 17035779}, - {120829, 17036035}, {120830, 17036291}, {120831, 17036547}, {120832, 1}, - {121484, 2}, {121499, 1}, {121504, 2}, {121505, 1}, - {121520, 2}, {122624, 1}, {122655, 2}, {122661, 1}, - {122667, 2}, {122880, 1}, {122887, 2}, {122888, 1}, - {122905, 2}, {122907, 1}, {122914, 2}, {122915, 1}, - {122917, 2}, {122918, 1}, {122923, 2}, {122928, 16866563}, - {122929, 16866819}, {122930, 16867075}, {122931, 16867331}, {122932, 16867587}, - {122933, 16867843}, {122934, 16868099}, {122935, 16868355}, {122936, 16868611}, - {122937, 16869123}, {122938, 16869379}, {122939, 16869635}, {122940, 16870147}, - {122941, 16870403}, {122942, 16870659}, {122943, 16870915}, {122944, 16871171}, - {122945, 16871427}, {122946, 16871683}, {122947, 16871939}, {122948, 16872195}, - {122949, 16872451}, {122950, 16872707}, {122951, 16873475}, {122952, 16873987}, - {122953, 16874243}, {122954, 17495043}, {122955, 16888835}, {122956, 16864003}, - {122957, 16864515}, {122958, 16890883}, {122959, 16883715}, {122960, 17945603}, - {122961, 16866563}, {122962, 16866819}, {122963, 16867075}, {122964, 16867331}, - {122965, 16867587}, {122966, 16867843}, {122967, 16868099}, {122968, 16868355}, - {122969, 16868611}, {122970, 16869123}, {122971, 16869379}, {122972, 16870147}, - {122973, 16870403}, {122974, 16870915}, {122975, 16871427}, {122976, 16871683}, - {122977, 16871939}, {122978, 16872195}, {122979, 16872451}, {122980, 16872707}, - {122981, 16873219}, {122982, 16873475}, {122983, 16879875}, {122984, 16864003}, - {122985, 16863747}, {122986, 16866307}, {122987, 16883203}, {122988, 17490179}, - {122989, 16883971}, {122990, 2}, {123023, 1}, {123024, 2}, - {123136, 1}, {123181, 2}, {123184, 1}, {123198, 2}, - {123200, 1}, {123210, 2}, {123214, 1}, {123216, 2}, - {123536, 1}, {123567, 2}, {123584, 1}, {123642, 2}, - {123647, 1}, {123648, 2}, {124112, 1}, {124154, 2}, - {124896, 1}, {124903, 2}, {124904, 1}, {124908, 2}, - {124909, 1}, {124911, 2}, {124912, 1}, {124927, 2}, - {124928, 1}, {125125, 2}, {125127, 1}, {125143, 2}, - {125184, 17945859}, {125185, 17946115}, {125186, 17946371}, {125187, 17946627}, - {125188, 17946883}, {125189, 17947139}, {125190, 17947395}, {125191, 17947651}, - {125192, 17947907}, {125193, 17948163}, {125194, 17948419}, {125195, 17948675}, - {125196, 17948931}, {125197, 17949187}, {125198, 17949443}, {125199, 17949699}, - {125200, 17949955}, {125201, 17950211}, {125202, 17950467}, {125203, 17950723}, - {125204, 17950979}, {125205, 17951235}, {125206, 17951491}, {125207, 17951747}, - {125208, 17952003}, {125209, 17952259}, {125210, 17952515}, {125211, 17952771}, - {125212, 17953027}, {125213, 17953283}, {125214, 17953539}, {125215, 17953795}, - {125216, 17954051}, {125217, 17954307}, {125218, 1}, {125260, 2}, - {125264, 1}, {125274, 2}, {125278, 1}, {125280, 2}, - {126065, 1}, {126133, 2}, {126209, 1}, {126270, 2}, - {126464, 16910339}, {126465, 17683459}, {126466, 17681667}, {126467, 17834243}, - {126468, 2}, {126469, 16910851}, {126470, 17731331}, {126471, 17682179}, - {126472, 17699843}, {126473, 16911875}, {126474, 17708547}, {126475, 17710851}, - {126476, 17682691}, {126477, 17717763}, {126478, 17694723}, {126479, 17701379}, - {126480, 17703427}, {126481, 17696771}, {126482, 17706499}, {126483, 17724931}, - {126484, 17744899}, {126485, 17686531}, {126486, 17689603}, {126487, 17684739}, - {126488, 17724419}, {126489, 17697795}, {126490, 17700867}, {126491, 17702403}, - {126492, 17954563}, {126493, 17673219}, {126494, 17954819}, {126495, 17955075}, - {126496, 2}, {126497, 17683459}, {126498, 17681667}, {126499, 2}, - {126500, 17720835}, {126501, 2}, {126503, 17682179}, {126504, 2}, - {126505, 16911875}, {126506, 17708547}, {126507, 17710851}, {126508, 17682691}, - {126509, 17717763}, {126510, 17694723}, {126511, 17701379}, {126512, 17703427}, - {126513, 17696771}, {126514, 17706499}, {126515, 2}, {126516, 17744899}, - {126517, 17686531}, {126518, 17689603}, {126519, 17684739}, {126520, 2}, - {126521, 17697795}, {126522, 2}, {126523, 17702403}, {126524, 2}, - {126530, 17681667}, {126531, 2}, {126535, 17682179}, {126536, 2}, - {126537, 16911875}, {126538, 2}, {126539, 17710851}, {126540, 2}, - {126541, 17717763}, {126542, 17694723}, {126543, 17701379}, {126544, 2}, - {126545, 17696771}, {126546, 17706499}, {126547, 2}, {126548, 17744899}, - {126549, 2}, {126551, 17684739}, {126552, 2}, {126553, 17697795}, - {126554, 2}, {126555, 17702403}, {126556, 2}, {126557, 17673219}, - {126558, 2}, {126559, 17955075}, {126560, 2}, {126561, 17683459}, - {126562, 17681667}, {126563, 2}, {126564, 17720835}, {126565, 2}, - {126567, 17682179}, {126568, 17699843}, {126569, 16911875}, {126570, 17708547}, - {126571, 2}, {126572, 17682691}, {126573, 17717763}, {126574, 17694723}, - {126575, 17701379}, {126576, 17703427}, {126577, 17696771}, {126578, 17706499}, - {126579, 2}, {126580, 17744899}, {126581, 17686531}, {126582, 17689603}, - {126583, 17684739}, {126584, 2}, {126585, 17697795}, {126586, 17700867}, - {126587, 17702403}, {126588, 17954563}, {126589, 2}, {126590, 17954819}, - {126591, 2}, {126592, 16910339}, {126593, 17683459}, {126594, 17681667}, - {126595, 17834243}, {126596, 17720835}, {126597, 16910851}, {126598, 17731331}, - {126599, 17682179}, {126600, 17699843}, {126601, 16911875}, {126602, 2}, - {126603, 17710851}, {126604, 17682691}, {126605, 17717763}, {126606, 17694723}, - {126607, 17701379}, {126608, 17703427}, {126609, 17696771}, {126610, 17706499}, - {126611, 17724931}, {126612, 17744899}, {126613, 17686531}, {126614, 17689603}, - {126615, 17684739}, {126616, 17724419}, {126617, 17697795}, {126618, 17700867}, - {126619, 17702403}, {126620, 2}, {126625, 17683459}, {126626, 17681667}, - {126627, 17834243}, {126628, 2}, {126629, 16910851}, {126630, 17731331}, - {126631, 17682179}, {126632, 17699843}, {126633, 16911875}, {126634, 2}, - {126635, 17710851}, {126636, 17682691}, {126637, 17717763}, {126638, 17694723}, - {126639, 17701379}, {126640, 17703427}, {126641, 17696771}, {126642, 17706499}, - {126643, 17724931}, {126644, 17744899}, {126645, 17686531}, {126646, 17689603}, - {126647, 17684739}, {126648, 17724419}, {126649, 17697795}, {126650, 17700867}, - {126651, 17702403}, {126652, 2}, {126704, 1}, {126706, 2}, - {126976, 1}, {127020, 2}, {127024, 1}, {127124, 2}, - {127136, 1}, {127151, 2}, {127153, 1}, {127168, 2}, - {127169, 1}, {127184, 2}, {127185, 1}, {127222, 2}, - {127233, 34732547}, {127234, 34733059}, {127235, 34733571}, {127236, 34734083}, - {127237, 34734595}, {127238, 34735107}, {127239, 34735619}, {127240, 34736131}, - {127241, 34736643}, {127242, 34737155}, {127243, 1}, {127248, 50644739}, - {127249, 50645507}, {127250, 50646275}, {127251, 50647043}, {127252, 50647811}, - {127253, 50648579}, {127254, 50649347}, {127255, 50650115}, {127256, 50650883}, - {127257, 50651651}, {127258, 50652419}, {127259, 50653187}, {127260, 50653955}, - {127261, 50654723}, {127262, 50655491}, {127263, 50656259}, {127264, 50657027}, - {127265, 50657795}, {127266, 50658563}, {127267, 50659331}, {127268, 50660099}, - {127269, 50660867}, {127270, 50661635}, {127271, 50662403}, {127272, 50663171}, - {127273, 50663939}, {127274, 51514883}, {127275, 16777731}, {127276, 16781571}, - {127277, 33554947}, {127278, 34738435}, {127279, 1}, {127280, 16777219}, - {127281, 16777475}, {127282, 16777731}, {127283, 16777987}, {127284, 16778243}, - {127285, 16778499}, {127286, 16778755}, {127287, 16779011}, {127288, 16779267}, - {127289, 16779523}, {127290, 16779779}, {127291, 16780035}, {127292, 16780291}, - {127293, 16780547}, {127294, 16780803}, {127295, 16781059}, {127296, 16781315}, - {127297, 16781571}, {127298, 16781827}, {127299, 16782083}, {127300, 16782339}, - {127301, 16782595}, {127302, 16782851}, {127303, 16783107}, {127304, 16783363}, - {127305, 16783619}, {127306, 34738947}, {127307, 34226435}, {127308, 34739459}, - {127309, 34739971}, {127310, 51517699}, {127311, 34741251}, {127312, 1}, - {127338, 34209283}, {127339, 34189315}, {127340, 34741763}, {127341, 1}, - {127376, 34742275}, {127377, 1}, {127406, 2}, {127462, 1}, - {127488, 34742787}, {127489, 34743299}, {127490, 17307651}, {127491, 2}, - {127504, 17157635}, {127505, 17966595}, {127506, 17966851}, {127507, 17351427}, - {127508, 17143043}, {127509, 17967107}, {127510, 17967363}, {127511, 17225219}, - {127512, 17967619}, {127513, 17967875}, {127514, 17968131}, {127515, 17584387}, - {127516, 17968387}, {127517, 17968643}, {127518, 17968899}, {127519, 17969155}, - {127520, 17969411}, {127521, 17969667}, {127522, 17166851}, {127523, 17969923}, - {127524, 17970179}, {127525, 17970435}, {127526, 17970691}, {127527, 17970947}, - {127528, 17971203}, {127529, 17141507}, {127530, 17223171}, {127531, 17971459}, - {127532, 17288451}, {127533, 17223939}, {127534, 17288707}, {127535, 17971715}, - {127536, 17181187}, {127537, 17971971}, {127538, 17972227}, {127539, 17972483}, - {127540, 17972739}, {127541, 17972995}, {127542, 17264131}, {127543, 17160195}, - {127544, 17973251}, {127545, 17973507}, {127546, 17973763}, {127547, 17974019}, - {127548, 2}, {127552, 51528707}, {127553, 51529475}, {127554, 51530243}, - {127555, 51531011}, {127556, 51531779}, {127557, 51532547}, {127558, 51533315}, - {127559, 51534083}, {127560, 51534851}, {127561, 2}, {127568, 17981187}, - {127569, 17981443}, {127570, 2}, {127584, 1}, {127590, 2}, - {127744, 1}, {128728, 2}, {128732, 1}, {128749, 2}, - {128752, 1}, {128765, 2}, {128768, 1}, {128887, 2}, - {128891, 1}, {128986, 2}, {128992, 1}, {129004, 2}, - {129008, 1}, {129009, 2}, {129024, 1}, {129036, 2}, - {129040, 1}, {129096, 2}, {129104, 1}, {129114, 2}, - {129120, 1}, {129160, 2}, {129168, 1}, {129198, 2}, - {129200, 1}, {129202, 2}, {129280, 1}, {129620, 2}, - {129632, 1}, {129646, 2}, {129648, 1}, {129661, 2}, - {129664, 1}, {129673, 2}, {129680, 1}, {129726, 2}, - {129727, 1}, {129734, 2}, {129742, 1}, {129756, 2}, - {129760, 1}, {129769, 2}, {129776, 1}, {129785, 2}, - {129792, 1}, {129939, 2}, {129940, 1}, {129995, 2}, - {130032, 17035267}, {130033, 16786947}, {130034, 16785155}, {130035, 16785411}, - {130036, 16787715}, {130037, 17035523}, {130038, 17035779}, {130039, 17036035}, - {130040, 17036291}, {130041, 17036547}, {130042, 2}, {131072, 1}, + {7304, 16946435}, {7305, 16946691}, {7306, 1}, {7307, 2}, + {7312, 16946947}, {7313, 16947203}, {7314, 16947459}, {7315, 16947715}, + {7316, 16947971}, {7317, 16948227}, {7318, 16948483}, {7319, 16948739}, + {7320, 16948995}, {7321, 16949251}, {7322, 16949507}, {7323, 16949763}, + {7324, 16944643}, {7325, 16950019}, {7326, 16950275}, {7327, 16950531}, + {7328, 16950787}, {7329, 16951043}, {7330, 16951299}, {7331, 16951555}, + {7332, 16951811}, {7333, 16952067}, {7334, 16952323}, {7335, 16952579}, + {7336, 16952835}, {7337, 16953091}, {7338, 16953347}, {7339, 16953603}, + {7340, 16953859}, {7341, 16954115}, {7342, 16954371}, {7343, 16954627}, + {7344, 16954883}, {7345, 16955139}, {7346, 16955395}, {7347, 16955651}, + {7348, 16955907}, {7349, 16956163}, {7350, 16956419}, {7351, 16956675}, + {7352, 16956931}, {7353, 16957187}, {7354, 16957443}, {7355, 2}, + {7357, 16957699}, {7358, 16957955}, {7359, 16958211}, {7360, 1}, + {7368, 2}, {7376, 1}, {7419, 2}, {7424, 1}, + {7468, 16777219}, {7469, 16791043}, {7470, 16777475}, {7471, 1}, + {7472, 16777987}, {7473, 16778243}, {7474, 16816131}, {7475, 16778755}, + {7476, 16779011}, {7477, 16779267}, {7478, 16779523}, {7479, 16779779}, + {7480, 16780035}, {7481, 16780291}, {7482, 16780547}, {7483, 1}, + {7484, 16780803}, {7485, 16835843}, {7486, 16781059}, {7487, 16781571}, + {7488, 16782083}, {7489, 16782339}, {7490, 16782851}, {7491, 16777219}, + {7492, 16958467}, {7493, 16958723}, {7494, 16958979}, {7495, 16777475}, + {7496, 16777987}, {7497, 16778243}, {7498, 16816387}, {7499, 16816643}, + {7500, 16959235}, {7501, 16778755}, {7502, 1}, {7503, 16779779}, + {7504, 16780291}, {7505, 16807171}, {7506, 16780803}, {7507, 16814851}, + {7508, 16959491}, {7509, 16959747}, {7510, 16781059}, {7511, 16782083}, + {7512, 16782339}, {7513, 16960003}, {7514, 16818435}, {7515, 16782595}, + {7516, 16960259}, {7517, 16851971}, {7518, 16852227}, {7519, 16852483}, + {7520, 16856323}, {7521, 16856579}, {7522, 16779267}, {7523, 16781571}, + {7524, 16782339}, {7525, 16782595}, {7526, 16851971}, {7527, 16852227}, + {7528, 16855299}, {7529, 16856323}, {7530, 16856579}, {7531, 1}, + {7544, 16869891}, {7545, 1}, {7579, 16960515}, {7580, 16777731}, + {7581, 16960771}, {7582, 16793603}, {7583, 16959235}, {7584, 16778499}, + {7585, 16961027}, {7586, 16961283}, {7587, 16961539}, {7588, 16817923}, + {7589, 16817667}, {7590, 16961795}, {7591, 16962051}, {7592, 16962307}, + {7593, 16962563}, {7594, 16962819}, {7595, 16963075}, {7596, 16963331}, + {7597, 16963587}, {7598, 16818691}, {7599, 16963843}, {7600, 16964099}, + {7601, 16818947}, {7602, 16964355}, {7603, 16964611}, {7604, 16820483}, + {7605, 16964867}, {7606, 16839683}, {7607, 16821507}, {7608, 16965123}, + {7609, 16821763}, {7610, 16839939}, {7611, 16783619}, {7612, 16965379}, + {7613, 16965635}, {7614, 16822531}, {7615, 16853507}, {7616, 1}, + {7680, 16965891}, {7681, 1}, {7682, 16966147}, {7683, 1}, + {7684, 16966403}, {7685, 1}, {7686, 16966659}, {7687, 1}, + {7688, 16966915}, {7689, 1}, {7690, 16967171}, {7691, 1}, + {7692, 16967427}, {7693, 1}, {7694, 16967683}, {7695, 1}, + {7696, 16967939}, {7697, 1}, {7698, 16968195}, {7699, 1}, + {7700, 16968451}, {7701, 1}, {7702, 16968707}, {7703, 1}, + {7704, 16968963}, {7705, 1}, {7706, 16969219}, {7707, 1}, + {7708, 16969475}, {7709, 1}, {7710, 16969731}, {7711, 1}, + {7712, 16969987}, {7713, 1}, {7714, 16970243}, {7715, 1}, + {7716, 16970499}, {7717, 1}, {7718, 16970755}, {7719, 1}, + {7720, 16971011}, {7721, 1}, {7722, 16971267}, {7723, 1}, + {7724, 16971523}, {7725, 1}, {7726, 16971779}, {7727, 1}, + {7728, 16972035}, {7729, 1}, {7730, 16972291}, {7731, 1}, + {7732, 16972547}, {7733, 1}, {7734, 16972803}, {7735, 1}, + {7736, 16973059}, {7737, 1}, {7738, 16973315}, {7739, 1}, + {7740, 16973571}, {7741, 1}, {7742, 16973827}, {7743, 1}, + {7744, 16974083}, {7745, 1}, {7746, 16974339}, {7747, 1}, + {7748, 16974595}, {7749, 1}, {7750, 16974851}, {7751, 1}, + {7752, 16975107}, {7753, 1}, {7754, 16975363}, {7755, 1}, + {7756, 16975619}, {7757, 1}, {7758, 16975875}, {7759, 1}, + {7760, 16976131}, {7761, 1}, {7762, 16976387}, {7763, 1}, + {7764, 16976643}, {7765, 1}, {7766, 16976899}, {7767, 1}, + {7768, 16977155}, {7769, 1}, {7770, 16977411}, {7771, 1}, + {7772, 16977667}, {7773, 1}, {7774, 16977923}, {7775, 1}, + {7776, 16978179}, {7777, 1}, {7778, 16978435}, {7779, 1}, + {7780, 16978691}, {7781, 1}, {7782, 16978947}, {7783, 1}, + {7784, 16979203}, {7785, 1}, {7786, 16979459}, {7787, 1}, + {7788, 16979715}, {7789, 1}, {7790, 16979971}, {7791, 1}, + {7792, 16980227}, {7793, 1}, {7794, 16980483}, {7795, 1}, + {7796, 16980739}, {7797, 1}, {7798, 16980995}, {7799, 1}, + {7800, 16981251}, {7801, 1}, {7802, 16981507}, {7803, 1}, + {7804, 16981763}, {7805, 1}, {7806, 16982019}, {7807, 1}, + {7808, 16982275}, {7809, 1}, {7810, 16982531}, {7811, 1}, + {7812, 16982787}, {7813, 1}, {7814, 16983043}, {7815, 1}, + {7816, 16983299}, {7817, 1}, {7818, 16983555}, {7819, 1}, + {7820, 16983811}, {7821, 1}, {7822, 16984067}, {7823, 1}, + {7824, 16984323}, {7825, 1}, {7826, 16984579}, {7827, 1}, + {7828, 16984835}, {7829, 1}, {7834, 33762307}, {7835, 16978179}, + {7836, 1}, {7838, 16985603}, {7839, 1}, {7840, 16985859}, + {7841, 1}, {7842, 16986115}, {7843, 1}, {7844, 16986371}, + {7845, 1}, {7846, 16986627}, {7847, 1}, {7848, 16986883}, + {7849, 1}, {7850, 16987139}, {7851, 1}, {7852, 16987395}, + {7853, 1}, {7854, 16987651}, {7855, 1}, {7856, 16987907}, + {7857, 1}, {7858, 16988163}, {7859, 1}, {7860, 16988419}, + {7861, 1}, {7862, 16988675}, {7863, 1}, {7864, 16988931}, + {7865, 1}, {7866, 16989187}, {7867, 1}, {7868, 16989443}, + {7869, 1}, {7870, 16989699}, {7871, 1}, {7872, 16989955}, + {7873, 1}, {7874, 16990211}, {7875, 1}, {7876, 16990467}, + {7877, 1}, {7878, 16990723}, {7879, 1}, {7880, 16990979}, + {7881, 1}, {7882, 16991235}, {7883, 1}, {7884, 16991491}, + {7885, 1}, {7886, 16991747}, {7887, 1}, {7888, 16992003}, + {7889, 1}, {7890, 16992259}, {7891, 1}, {7892, 16992515}, + {7893, 1}, {7894, 16992771}, {7895, 1}, {7896, 16993027}, + {7897, 1}, {7898, 16993283}, {7899, 1}, {7900, 16993539}, + {7901, 1}, {7902, 16993795}, {7903, 1}, {7904, 16994051}, + {7905, 1}, {7906, 16994307}, {7907, 1}, {7908, 16994563}, + {7909, 1}, {7910, 16994819}, {7911, 1}, {7912, 16995075}, + {7913, 1}, {7914, 16995331}, {7915, 1}, {7916, 16995587}, + {7917, 1}, {7918, 16995843}, {7919, 1}, {7920, 16996099}, + {7921, 1}, {7922, 16996355}, {7923, 1}, {7924, 16996611}, + {7925, 1}, {7926, 16996867}, {7927, 1}, {7928, 16997123}, + {7929, 1}, {7930, 16997379}, {7931, 1}, {7932, 16997635}, + {7933, 1}, {7934, 16997891}, {7935, 1}, {7944, 16998147}, + {7945, 16998403}, {7946, 16998659}, {7947, 16998915}, {7948, 16999171}, + {7949, 16999427}, {7950, 16999683}, {7951, 16999939}, {7952, 1}, + {7958, 2}, {7960, 17000195}, {7961, 17000451}, {7962, 17000707}, + {7963, 17000963}, {7964, 17001219}, {7965, 17001475}, {7966, 2}, + {7968, 1}, {7976, 17001731}, {7977, 17001987}, {7978, 17002243}, + {7979, 17002499}, {7980, 17002755}, {7981, 17003011}, {7982, 17003267}, + {7983, 17003523}, {7984, 1}, {7992, 17003779}, {7993, 17004035}, + {7994, 17004291}, {7995, 17004547}, {7996, 17004803}, {7997, 17005059}, + {7998, 17005315}, {7999, 17005571}, {8000, 1}, {8006, 2}, + {8008, 17005827}, {8009, 17006083}, {8010, 17006339}, {8011, 17006595}, + {8012, 17006851}, {8013, 17007107}, {8014, 2}, {8016, 1}, + {8024, 2}, {8025, 17007363}, {8026, 2}, {8027, 17007619}, + {8028, 2}, {8029, 17007875}, {8030, 2}, {8031, 17008131}, + {8032, 1}, {8040, 17008387}, {8041, 17008643}, {8042, 17008899}, + {8043, 17009155}, {8044, 17009411}, {8045, 17009667}, {8046, 17009923}, + {8047, 17010179}, {8048, 1}, {8049, 16849923}, {8050, 1}, + {8051, 16850179}, {8052, 1}, {8053, 16850435}, {8054, 1}, + {8055, 16850691}, {8056, 1}, {8057, 16850947}, {8058, 1}, + {8059, 16851203}, {8060, 1}, {8061, 16851459}, {8062, 2}, + {8064, 33787651}, {8065, 33788163}, {8066, 33788675}, {8067, 33789187}, + {8068, 33789699}, {8069, 33790211}, {8070, 33790723}, {8071, 33791235}, + {8072, 33787651}, {8073, 33788163}, {8074, 33788675}, {8075, 33789187}, + {8076, 33789699}, {8077, 33790211}, {8078, 33790723}, {8079, 33791235}, + {8080, 33791747}, {8081, 33792259}, {8082, 33792771}, {8083, 33793283}, + {8084, 33793795}, {8085, 33794307}, {8086, 33794819}, {8087, 33795331}, + {8088, 33791747}, {8089, 33792259}, {8090, 33792771}, {8091, 33793283}, + {8092, 33793795}, {8093, 33794307}, {8094, 33794819}, {8095, 33795331}, + {8096, 33795843}, {8097, 33796355}, {8098, 33796867}, {8099, 33797379}, + {8100, 33797891}, {8101, 33798403}, {8102, 33798915}, {8103, 33799427}, + {8104, 33795843}, {8105, 33796355}, {8106, 33796867}, {8107, 33797379}, + {8108, 33797891}, {8109, 33798403}, {8110, 33798915}, {8111, 33799427}, + {8112, 1}, {8114, 33799939}, {8115, 33800451}, {8116, 33800963}, + {8117, 2}, {8118, 1}, {8119, 33801475}, {8120, 17024771}, + {8121, 17025027}, {8122, 17022723}, {8123, 16849923}, {8124, 33800451}, + {8125, 33802499}, {8126, 16846851}, {8127, 33802499}, {8128, 33803011}, + {8129, 50580739}, {8130, 33804291}, {8131, 33804803}, {8132, 33805315}, + {8133, 2}, {8134, 1}, {8135, 33805827}, {8136, 17029123}, + {8137, 16850179}, {8138, 17027075}, {8139, 16850435}, {8140, 33804803}, + {8141, 50583811}, {8142, 50584579}, {8143, 50585347}, {8144, 1}, + {8147, 17031683}, {8148, 2}, {8150, 1}, {8152, 17031939}, + {8153, 17032195}, {8154, 17032451}, {8155, 16850691}, {8156, 2}, + {8157, 50587139}, {8158, 50587907}, {8159, 50588675}, {8160, 1}, + {8163, 17035011}, {8164, 1}, {8168, 17035267}, {8169, 17035523}, + {8170, 17035779}, {8171, 16851203}, {8172, 17036035}, {8173, 50590723}, + {8174, 50403587}, {8175, 17037059}, {8176, 2}, {8178, 33814531}, + {8179, 33815043}, {8180, 33815555}, {8181, 2}, {8182, 1}, + {8183, 33816067}, {8184, 17039363}, {8185, 16850947}, {8186, 17037315}, + {8187, 16851459}, {8188, 33815043}, {8189, 33562883}, {8190, 33809923}, + {8191, 2}, {8192, 16783875}, {8203, 0}, {8204, 1}, + {8206, 2}, {8208, 1}, {8209, 17039619}, {8210, 1}, + {8215, 33817091}, {8216, 1}, {8228, 2}, {8231, 1}, + {8232, 2}, {8239, 16783875}, {8240, 1}, {8243, 33817603}, + {8244, 50595331}, {8245, 1}, {8246, 33818883}, {8247, 50596611}, + {8248, 1}, {8252, 33820163}, {8253, 1}, {8254, 33820675}, + {8255, 1}, {8263, 33821187}, {8264, 33821699}, {8265, 33822211}, + {8266, 1}, {8279, 67372035}, {8280, 1}, {8287, 16783875}, + {8288, 0}, {8293, 2}, {8298, 0}, {8304, 17045507}, + {8305, 16779267}, {8306, 2}, {8308, 16787715}, {8309, 17045763}, + {8310, 17046019}, {8311, 17046275}, {8312, 17046531}, {8313, 17046787}, + {8314, 17047043}, {8315, 17047299}, {8316, 17047555}, {8317, 17047811}, + {8318, 17048067}, {8319, 16780547}, {8320, 17045507}, {8321, 16786947}, + {8322, 16785155}, {8323, 16785411}, {8324, 16787715}, {8325, 17045763}, + {8326, 17046019}, {8327, 17046275}, {8328, 17046531}, {8329, 17046787}, + {8330, 17047043}, {8331, 17047299}, {8332, 17047555}, {8333, 17047811}, + {8334, 17048067}, {8335, 2}, {8336, 16777219}, {8337, 16778243}, + {8338, 16780803}, {8339, 16783107}, {8340, 16816387}, {8341, 16779011}, + {8342, 16779779}, {8343, 16780035}, {8344, 16780291}, {8345, 16780547}, + {8346, 16781059}, {8347, 16781827}, {8348, 16782083}, {8349, 2}, + {8352, 1}, {8360, 33558787}, {8361, 1}, {8385, 2}, + {8400, 1}, {8433, 2}, {8448, 50602755}, {8449, 50603523}, + {8450, 16777731}, {8451, 33827075}, {8452, 1}, {8453, 50604803}, + {8454, 50605571}, {8455, 16816643}, {8456, 1}, {8457, 33829123}, + {8458, 16778755}, {8459, 16779011}, {8463, 16802051}, {8464, 16779267}, + {8466, 16780035}, {8468, 1}, {8469, 16780547}, {8470, 33557763}, + {8471, 1}, {8473, 16781059}, {8474, 16781315}, {8475, 16781571}, + {8478, 1}, {8480, 33829635}, {8481, 50607363}, {8482, 33830915}, + {8483, 1}, {8484, 16783619}, {8485, 1}, {8486, 16857091}, + {8487, 1}, {8488, 16783619}, {8489, 1}, {8490, 16779779}, + {8491, 16790787}, {8492, 16777475}, {8493, 16777731}, {8494, 1}, + {8495, 16778243}, {8497, 16778499}, {8498, 17054211}, {8499, 16780291}, + {8500, 16780803}, {8501, 17054467}, {8502, 17054723}, {8503, 17054979}, + {8504, 17055235}, {8505, 16779267}, {8506, 1}, {8507, 50609923}, + {8508, 16855043}, {8509, 16852227}, {8511, 16855043}, {8512, 17056259}, + {8513, 1}, {8517, 16777987}, {8519, 16778243}, {8520, 16779267}, + {8521, 16779523}, {8522, 1}, {8528, 50610947}, {8529, 50611715}, + {8530, 67389699}, {8531, 50613507}, {8532, 50614275}, {8533, 50615043}, + {8534, 50615811}, {8535, 50616579}, {8536, 50617347}, {8537, 50618115}, + {8538, 50618883}, {8539, 50619651}, {8540, 50620419}, {8541, 50621187}, + {8542, 50621955}, {8543, 33564419}, {8544, 16779267}, {8545, 33845507}, + {8546, 50623235}, {8547, 33846787}, {8548, 16782595}, {8549, 33847299}, + {8550, 50625027}, {8551, 67403011}, {8552, 33849603}, {8553, 16783107}, + {8554, 33850115}, {8555, 50627843}, {8556, 16780035}, {8557, 16777731}, + {8558, 16777987}, {8559, 16780291}, {8560, 16779267}, {8561, 33845507}, + {8562, 50622723}, {8563, 33846787}, {8564, 16782595}, {8565, 33847299}, + {8566, 50625027}, {8567, 67403011}, {8568, 33849603}, {8569, 16783107}, + {8570, 33850115}, {8571, 50627843}, {8572, 16780035}, {8573, 16777731}, + {8574, 16777987}, {8575, 16780291}, {8576, 1}, {8579, 17074179}, + {8580, 1}, {8585, 50628867}, {8586, 1}, {8588, 2}, + {8592, 1}, {8748, 33852419}, {8749, 50630147}, {8750, 1}, + {8751, 33853699}, {8752, 50631427}, {8753, 1}, {9001, 17077763}, + {9002, 17078019}, {9003, 1}, {9258, 2}, {9280, 1}, + {9291, 2}, {9312, 16786947}, {9313, 16785155}, {9314, 16785411}, + {9315, 16787715}, {9316, 17045763}, {9317, 17046019}, {9318, 17046275}, + {9319, 17046531}, {9320, 17046787}, {9321, 33835779}, {9322, 33564163}, + {9323, 33855491}, {9324, 33856003}, {9325, 33856515}, {9326, 33857027}, + {9327, 33857539}, {9328, 33858051}, {9329, 33858563}, {9330, 33859075}, + {9331, 33859587}, {9332, 50637315}, {9333, 50638083}, {9334, 50638851}, + {9335, 50639619}, {9336, 50640387}, {9337, 50641155}, {9338, 50641923}, + {9339, 50642691}, {9340, 50643459}, {9341, 67421443}, {9342, 67422467}, + {9343, 67423491}, {9344, 67424515}, {9345, 67425539}, {9346, 67426563}, + {9347, 67427587}, {9348, 67428611}, {9349, 67429635}, {9350, 67430659}, + {9351, 67431683}, {9352, 2}, {9372, 50655491}, {9373, 50656259}, + {9374, 50657027}, {9375, 50657795}, {9376, 50658563}, {9377, 50659331}, + {9378, 50660099}, {9379, 50660867}, {9380, 50661635}, {9381, 50662403}, + {9382, 50663171}, {9383, 50663939}, {9384, 50664707}, {9385, 50665475}, + {9386, 50666243}, {9387, 50667011}, {9388, 50667779}, {9389, 50668547}, + {9390, 50669315}, {9391, 50670083}, {9392, 50670851}, {9393, 50671619}, + {9394, 50672387}, {9395, 50673155}, {9396, 50673923}, {9397, 50674691}, + {9398, 16777219}, {9399, 16777475}, {9400, 16777731}, {9401, 16777987}, + {9402, 16778243}, {9403, 16778499}, {9404, 16778755}, {9405, 16779011}, + {9406, 16779267}, {9407, 16779523}, {9408, 16779779}, {9409, 16780035}, + {9410, 16780291}, {9411, 16780547}, {9412, 16780803}, {9413, 16781059}, + {9414, 16781315}, {9415, 16781571}, {9416, 16781827}, {9417, 16782083}, + {9418, 16782339}, {9419, 16782595}, {9420, 16782851}, {9421, 16783107}, + {9422, 16783363}, {9423, 16783619}, {9424, 16777219}, {9425, 16777475}, + {9426, 16777731}, {9427, 16777987}, {9428, 16778243}, {9429, 16778499}, + {9430, 16778755}, {9431, 16779011}, {9432, 16779267}, {9433, 16779523}, + {9434, 16779779}, {9435, 16780035}, {9436, 16780291}, {9437, 16780547}, + {9438, 16780803}, {9439, 16781059}, {9440, 16781315}, {9441, 16781571}, + {9442, 16781827}, {9443, 16782083}, {9444, 16782339}, {9445, 16782595}, + {9446, 16782851}, {9447, 16783107}, {9448, 16783363}, {9449, 16783619}, + {9450, 17045507}, {9451, 1}, {10764, 67406851}, {10765, 1}, + {10868, 50675459}, {10869, 33899011}, {10870, 50675971}, {10871, 1}, + {10972, 33899523}, {10973, 1}, {11124, 2}, {11126, 1}, + {11158, 2}, {11159, 1}, {11264, 17122819}, {11265, 17123075}, + {11266, 17123331}, {11267, 17123587}, {11268, 17123843}, {11269, 17124099}, + {11270, 17124355}, {11271, 17124611}, {11272, 17124867}, {11273, 17125123}, + {11274, 17125379}, {11275, 17125635}, {11276, 17125891}, {11277, 17126147}, + {11278, 17126403}, {11279, 17126659}, {11280, 17126915}, {11281, 17127171}, + {11282, 17127427}, {11283, 17127683}, {11284, 17127939}, {11285, 17128195}, + {11286, 17128451}, {11287, 17128707}, {11288, 17128963}, {11289, 17129219}, + {11290, 17129475}, {11291, 17129731}, {11292, 17129987}, {11293, 17130243}, + {11294, 17130499}, {11295, 17130755}, {11296, 17131011}, {11297, 17131267}, + {11298, 17131523}, {11299, 17131779}, {11300, 17132035}, {11301, 17132291}, + {11302, 17132547}, {11303, 17132803}, {11304, 17133059}, {11305, 17133315}, + {11306, 17133571}, {11307, 17133827}, {11308, 17134083}, {11309, 17134339}, + {11310, 17134595}, {11311, 17134851}, {11312, 1}, {11360, 17135107}, + {11361, 1}, {11362, 17135363}, {11363, 17135619}, {11364, 17135875}, + {11365, 1}, {11367, 17136131}, {11368, 1}, {11369, 17136387}, + {11370, 1}, {11371, 17136643}, {11372, 1}, {11373, 16958723}, + {11374, 16963331}, {11375, 16958467}, {11376, 16960515}, {11377, 1}, + {11378, 17136899}, {11379, 1}, {11381, 17137155}, {11382, 1}, + {11388, 16779523}, {11389, 16782595}, {11390, 17137411}, {11391, 17137667}, + {11392, 17137923}, {11393, 1}, {11394, 17138179}, {11395, 1}, + {11396, 17138435}, {11397, 1}, {11398, 17138691}, {11399, 1}, + {11400, 17138947}, {11401, 1}, {11402, 17139203}, {11403, 1}, + {11404, 17139459}, {11405, 1}, {11406, 17139715}, {11407, 1}, + {11408, 17139971}, {11409, 1}, {11410, 17140227}, {11411, 1}, + {11412, 17140483}, {11413, 1}, {11414, 17140739}, {11415, 1}, + {11416, 17140995}, {11417, 1}, {11418, 17141251}, {11419, 1}, + {11420, 17141507}, {11421, 1}, {11422, 17141763}, {11423, 1}, + {11424, 17142019}, {11425, 1}, {11426, 17142275}, {11427, 1}, + {11428, 17142531}, {11429, 1}, {11430, 17142787}, {11431, 1}, + {11432, 17143043}, {11433, 1}, {11434, 17143299}, {11435, 1}, + {11436, 17143555}, {11437, 1}, {11438, 17143811}, {11439, 1}, + {11440, 17144067}, {11441, 1}, {11442, 17144323}, {11443, 1}, + {11444, 17144579}, {11445, 1}, {11446, 17144835}, {11447, 1}, + {11448, 17145091}, {11449, 1}, {11450, 17145347}, {11451, 1}, + {11452, 17145603}, {11453, 1}, {11454, 17145859}, {11455, 1}, + {11456, 17146115}, {11457, 1}, {11458, 17146371}, {11459, 1}, + {11460, 17146627}, {11461, 1}, {11462, 17146883}, {11463, 1}, + {11464, 17147139}, {11465, 1}, {11466, 17147395}, {11467, 1}, + {11468, 17147651}, {11469, 1}, {11470, 17147907}, {11471, 1}, + {11472, 17148163}, {11473, 1}, {11474, 17148419}, {11475, 1}, + {11476, 17148675}, {11477, 1}, {11478, 17148931}, {11479, 1}, + {11480, 17149187}, {11481, 1}, {11482, 17149443}, {11483, 1}, + {11484, 17149699}, {11485, 1}, {11486, 17149955}, {11487, 1}, + {11488, 17150211}, {11489, 1}, {11490, 17150467}, {11491, 1}, + {11499, 17150723}, {11500, 1}, {11501, 17150979}, {11502, 1}, + {11506, 17151235}, {11507, 1}, {11508, 2}, {11513, 1}, + {11558, 2}, {11559, 1}, {11560, 2}, {11565, 1}, + {11566, 2}, {11568, 1}, {11624, 2}, {11631, 17151491}, + {11632, 1}, {11633, 2}, {11647, 1}, {11671, 2}, + {11680, 1}, {11687, 2}, {11688, 1}, {11695, 2}, + {11696, 1}, {11703, 2}, {11704, 1}, {11711, 2}, + {11712, 1}, {11719, 2}, {11720, 1}, {11727, 2}, + {11728, 1}, {11735, 2}, {11736, 1}, {11743, 2}, + {11744, 1}, {11870, 2}, {11904, 1}, {11930, 2}, + {11931, 1}, {11935, 17151747}, {11936, 1}, {12019, 17152003}, + {12020, 2}, {12032, 17152259}, {12033, 17152515}, {12034, 17152771}, + {12035, 17153027}, {12036, 17153283}, {12037, 17153539}, {12038, 17153795}, + {12039, 17154051}, {12040, 17154307}, {12041, 17154563}, {12042, 17154819}, + {12043, 17155075}, {12044, 17155331}, {12045, 17155587}, {12046, 17155843}, + {12047, 17156099}, {12048, 17156355}, {12049, 17156611}, {12050, 17156867}, + {12051, 17157123}, {12052, 17157379}, {12053, 17157635}, {12054, 17157891}, + {12055, 17158147}, {12056, 17158403}, {12057, 17158659}, {12058, 17158915}, + {12059, 17159171}, {12060, 17159427}, {12061, 17159683}, {12062, 17159939}, + {12063, 17160195}, {12064, 17160451}, {12065, 17160707}, {12066, 17160963}, + {12067, 17161219}, {12068, 17161475}, {12069, 17161731}, {12070, 17161987}, + {12071, 17162243}, {12072, 17162499}, {12073, 17162755}, {12074, 17163011}, + {12075, 17163267}, {12076, 17163523}, {12077, 17163779}, {12078, 17164035}, + {12079, 17164291}, {12080, 17164547}, {12081, 17164803}, {12082, 17165059}, + {12083, 17165315}, {12084, 17165571}, {12085, 17165827}, {12086, 17166083}, + {12087, 17166339}, {12088, 17166595}, {12089, 17166851}, {12090, 17167107}, + {12091, 17167363}, {12092, 17167619}, {12093, 17167875}, {12094, 17168131}, + {12095, 17168387}, {12096, 17168643}, {12097, 17168899}, {12098, 17169155}, + {12099, 17169411}, {12100, 17169667}, {12101, 17169923}, {12102, 17170179}, + {12103, 17170435}, {12104, 17170691}, {12105, 17170947}, {12106, 17171203}, + {12107, 17171459}, {12108, 17171715}, {12109, 17171971}, {12110, 17172227}, + {12111, 17172483}, {12112, 17172739}, {12113, 17172995}, {12114, 17173251}, + {12115, 17173507}, {12116, 17173763}, {12117, 17174019}, {12118, 17174275}, + {12119, 17174531}, {12120, 17174787}, {12121, 17175043}, {12122, 17175299}, + {12123, 17175555}, {12124, 17175811}, {12125, 17176067}, {12126, 17176323}, + {12127, 17176579}, {12128, 17176835}, {12129, 17177091}, {12130, 17177347}, + {12131, 17177603}, {12132, 17177859}, {12133, 17178115}, {12134, 17178371}, + {12135, 17178627}, {12136, 17178883}, {12137, 17179139}, {12138, 17179395}, + {12139, 17179651}, {12140, 17179907}, {12141, 17180163}, {12142, 17180419}, + {12143, 17180675}, {12144, 17180931}, {12145, 17181187}, {12146, 17181443}, + {12147, 17181699}, {12148, 17181955}, {12149, 17182211}, {12150, 17182467}, + {12151, 17182723}, {12152, 17182979}, {12153, 17183235}, {12154, 17183491}, + {12155, 17183747}, {12156, 17184003}, {12157, 17184259}, {12158, 17184515}, + {12159, 17184771}, {12160, 17185027}, {12161, 17185283}, {12162, 17185539}, + {12163, 17185795}, {12164, 17186051}, {12165, 17186307}, {12166, 17186563}, + {12167, 17186819}, {12168, 17187075}, {12169, 17187331}, {12170, 17187587}, + {12171, 17187843}, {12172, 17188099}, {12173, 17188355}, {12174, 17188611}, + {12175, 17188867}, {12176, 17189123}, {12177, 17189379}, {12178, 17189635}, + {12179, 17189891}, {12180, 17190147}, {12181, 17190403}, {12182, 17190659}, + {12183, 17190915}, {12184, 17191171}, {12185, 17191427}, {12186, 17191683}, + {12187, 17191939}, {12188, 17192195}, {12189, 17192451}, {12190, 17192707}, + {12191, 17192963}, {12192, 17193219}, {12193, 17193475}, {12194, 17193731}, + {12195, 17193987}, {12196, 17194243}, {12197, 17194499}, {12198, 17194755}, + {12199, 17195011}, {12200, 17195267}, {12201, 17195523}, {12202, 17195779}, + {12203, 17196035}, {12204, 17196291}, {12205, 17196547}, {12206, 17196803}, + {12207, 17197059}, {12208, 17197315}, {12209, 17197571}, {12210, 17197827}, + {12211, 17198083}, {12212, 17198339}, {12213, 17198595}, {12214, 17198851}, + {12215, 17199107}, {12216, 17199363}, {12217, 17199619}, {12218, 17199875}, + {12219, 17200131}, {12220, 17200387}, {12221, 17200643}, {12222, 17200899}, + {12223, 17201155}, {12224, 17201411}, {12225, 17201667}, {12226, 17201923}, + {12227, 17202179}, {12228, 17202435}, {12229, 17202691}, {12230, 17202947}, + {12231, 17203203}, {12232, 17203459}, {12233, 17203715}, {12234, 17203971}, + {12235, 17204227}, {12236, 17204483}, {12237, 17204739}, {12238, 17204995}, + {12239, 17205251}, {12240, 17205507}, {12241, 17205763}, {12242, 17206019}, + {12243, 17206275}, {12244, 17206531}, {12245, 17206787}, {12246, 2}, + {12288, 16783875}, {12289, 1}, {12290, 17207043}, {12291, 1}, + {12342, 17207299}, {12343, 1}, {12344, 17158147}, {12345, 17207555}, + {12346, 17207811}, {12347, 1}, {12352, 2}, {12353, 1}, + {12439, 2}, {12441, 1}, {12443, 33985283}, {12444, 33985795}, + {12445, 1}, {12447, 33986307}, {12448, 1}, {12543, 33986819}, + {12544, 2}, {12549, 1}, {12592, 2}, {12593, 17210115}, + {12594, 17210371}, {12595, 17210627}, {12596, 17210883}, {12597, 17211139}, + {12598, 17211395}, {12599, 17211651}, {12600, 17211907}, {12601, 17212163}, + {12602, 17212419}, {12603, 17212675}, {12604, 17212931}, {12605, 17213187}, + {12606, 17213443}, {12607, 17213699}, {12608, 17213955}, {12609, 17214211}, + {12610, 17214467}, {12611, 17214723}, {12612, 17214979}, {12613, 17215235}, + {12614, 17215491}, {12615, 17215747}, {12616, 17216003}, {12617, 17216259}, + {12618, 17216515}, {12619, 17216771}, {12620, 17217027}, {12621, 17217283}, + {12622, 17217539}, {12623, 17217795}, {12624, 17218051}, {12625, 17218307}, + {12626, 17218563}, {12627, 17218819}, {12628, 17219075}, {12629, 17219331}, + {12630, 17219587}, {12631, 17219843}, {12632, 17220099}, {12633, 17220355}, + {12634, 17220611}, {12635, 17220867}, {12636, 17221123}, {12637, 17221379}, + {12638, 17221635}, {12639, 17221891}, {12640, 17222147}, {12641, 17222403}, + {12642, 17222659}, {12643, 17222915}, {12644, 0}, {12645, 17223171}, + {12646, 17223427}, {12647, 17223683}, {12648, 17223939}, {12649, 17224195}, + {12650, 17224451}, {12651, 17224707}, {12652, 17224963}, {12653, 17225219}, + {12654, 17225475}, {12655, 17225731}, {12656, 17225987}, {12657, 17226243}, + {12658, 17226499}, {12659, 17226755}, {12660, 17227011}, {12661, 17227267}, + {12662, 17227523}, {12663, 17227779}, {12664, 17228035}, {12665, 17228291}, + {12666, 17228547}, {12667, 17228803}, {12668, 17229059}, {12669, 17229315}, + {12670, 17229571}, {12671, 17229827}, {12672, 17230083}, {12673, 17230339}, + {12674, 17230595}, {12675, 17230851}, {12676, 17231107}, {12677, 17231363}, + {12678, 17231619}, {12679, 17231875}, {12680, 17232131}, {12681, 17232387}, + {12682, 17232643}, {12683, 17232899}, {12684, 17233155}, {12685, 17233411}, + {12686, 17233667}, {12687, 2}, {12688, 1}, {12690, 17152259}, + {12691, 17153795}, {12692, 17233923}, {12693, 17234179}, {12694, 17234435}, + {12695, 17234691}, {12696, 17234947}, {12697, 17235203}, {12698, 17153283}, + {12699, 17235459}, {12700, 17235715}, {12701, 17235971}, {12702, 17236227}, + {12703, 17154307}, {12704, 1}, {12774, 2}, {12784, 1}, + {12800, 50790915}, {12801, 50791683}, {12802, 50792451}, {12803, 50793219}, + {12804, 50793987}, {12805, 50794755}, {12806, 50795523}, {12807, 50796291}, + {12808, 50797059}, {12809, 50797827}, {12810, 50798595}, {12811, 50799363}, + {12812, 50800131}, {12813, 50800899}, {12814, 50801667}, {12815, 50802435}, + {12816, 50803203}, {12817, 50803971}, {12818, 50804739}, {12819, 50805507}, + {12820, 50806275}, {12821, 50807043}, {12822, 50807811}, {12823, 50808579}, + {12824, 50809347}, {12825, 50810115}, {12826, 50810883}, {12827, 50811651}, + {12828, 50812419}, {12829, 67590403}, {12830, 67591427}, {12831, 2}, + {12832, 50815235}, {12833, 50816003}, {12834, 50816771}, {12835, 50817539}, + {12836, 50818307}, {12837, 50819075}, {12838, 50819843}, {12839, 50820611}, + {12840, 50821379}, {12841, 50822147}, {12842, 50822915}, {12843, 50823683}, + {12844, 50824451}, {12845, 50825219}, {12846, 50825987}, {12847, 50826755}, + {12848, 50827523}, {12849, 50828291}, {12850, 50829059}, {12851, 50829827}, + {12852, 50830595}, {12853, 50831363}, {12854, 50832131}, {12855, 50832899}, + {12856, 50833667}, {12857, 50834435}, {12858, 50835203}, {12859, 50835971}, + {12860, 50836739}, {12861, 50837507}, {12862, 50838275}, {12863, 50839043}, + {12864, 50839811}, {12865, 50840579}, {12866, 50841347}, {12867, 50842115}, + {12868, 17288451}, {12869, 17288707}, {12870, 17169155}, {12871, 17288963}, + {12872, 1}, {12880, 50843651}, {12881, 33855747}, {12882, 34067203}, + {12883, 33562371}, {12884, 34067715}, {12885, 34068227}, {12886, 34068739}, + {12887, 34069251}, {12888, 34069763}, {12889, 34070275}, {12890, 34070787}, + {12891, 33837571}, {12892, 33836803}, {12893, 34071299}, {12894, 34071811}, + {12895, 34072323}, {12896, 17210115}, {12897, 17210883}, {12898, 17211651}, + {12899, 17212163}, {12900, 17214211}, {12901, 17214467}, {12902, 17215235}, + {12903, 17215747}, {12904, 17216003}, {12905, 17216515}, {12906, 17216771}, + {12907, 17217027}, {12908, 17217283}, {12909, 17217539}, {12910, 17247491}, + {12911, 17248259}, {12912, 17249027}, {12913, 17249795}, {12914, 17250563}, + {12915, 17251331}, {12916, 17252099}, {12917, 17252867}, {12918, 17253635}, + {12919, 17254403}, {12920, 17255171}, {12921, 17255939}, {12922, 17256707}, + {12923, 17257475}, {12924, 34072835}, {12925, 34073347}, {12926, 17296643}, + {12927, 1}, {12928, 17152259}, {12929, 17153795}, {12930, 17233923}, + {12931, 17234179}, {12932, 17264131}, {12933, 17264899}, {12934, 17265667}, + {12935, 17155075}, {12936, 17267203}, {12937, 17158147}, {12938, 17170947}, + {12939, 17174019}, {12940, 17173763}, {12941, 17171203}, {12942, 17194755}, + {12943, 17160195}, {12944, 17170435}, {12945, 17274115}, {12946, 17274883}, + {12947, 17275651}, {12948, 17276419}, {12949, 17277187}, {12950, 17277955}, + {12951, 17278723}, {12952, 17279491}, {12953, 17296899}, {12954, 17297155}, + {12955, 17161731}, {12956, 17297411}, {12957, 17297667}, {12958, 17297923}, + {12959, 17298179}, {12960, 17298435}, {12961, 17286403}, {12962, 17298691}, + {12963, 17298947}, {12964, 17234435}, {12965, 17234691}, {12966, 17234947}, + {12967, 17299203}, {12968, 17299459}, {12969, 17299715}, {12970, 17299971}, + {12971, 17281795}, {12972, 17282563}, {12973, 17283331}, {12974, 17284099}, + {12975, 17284867}, {12976, 17300227}, {12977, 34077699}, {12978, 34078211}, + {12979, 34078723}, {12980, 34079235}, {12981, 34079747}, {12982, 33564931}, + {12983, 34067971}, {12984, 34072067}, {12985, 34080259}, {12986, 34080771}, + {12987, 34081283}, {12988, 34081795}, {12989, 34082307}, {12990, 34082819}, + {12991, 34083331}, {12992, 34083843}, {12993, 34084355}, {12994, 34084867}, + {12995, 34085379}, {12996, 34085891}, {12997, 34086403}, {12998, 34086915}, + {12999, 34087427}, {13000, 34087939}, {13001, 50865667}, {13002, 50866435}, + {13003, 50867203}, {13004, 34090755}, {13005, 50868483}, {13006, 34092035}, + {13007, 50869763}, {13008, 17316099}, {13009, 17316355}, {13010, 17316611}, + {13011, 17316867}, {13012, 17317123}, {13013, 17317379}, {13014, 17317635}, + {13015, 17317891}, {13016, 17318147}, {13017, 17209603}, {13018, 17318403}, + {13019, 17318659}, {13020, 17318915}, {13021, 17319171}, {13022, 17319427}, + {13023, 17319683}, {13024, 17319939}, {13025, 17320195}, {13026, 17320451}, + {13027, 17209859}, {13028, 17320707}, {13029, 17320963}, {13030, 17321219}, + {13031, 17321475}, {13032, 17321731}, {13033, 17321987}, {13034, 17322243}, + {13035, 17322499}, {13036, 17322755}, {13037, 17323011}, {13038, 17323267}, + {13039, 17323523}, {13040, 17323779}, {13041, 17324035}, {13042, 17324291}, + {13043, 17324547}, {13044, 17324803}, {13045, 17325059}, {13046, 17325315}, + {13047, 17325571}, {13048, 17325827}, {13049, 17326083}, {13050, 17326339}, + {13051, 17326595}, {13052, 17326851}, {13053, 17327107}, {13054, 17327363}, + {13055, 34104835}, {13056, 67659779}, {13057, 67660803}, {13058, 67661827}, + {13059, 50885635}, {13060, 67663619}, {13061, 50887427}, {13062, 50888195}, + {13063, 84443395}, {13064, 67667459}, {13065, 50891267}, {13066, 50892035}, + {13067, 50892803}, {13068, 67670787}, {13069, 67671811}, {13070, 50895619}, + {13071, 50896387}, {13072, 34119939}, {13073, 50897667}, {13074, 67675651}, + {13075, 67676675}, {13076, 34123267}, {13077, 84455427}, {13078, 101233923}, + {13079, 84458243}, {13080, 50901507}, {13081, 84459523}, {13082, 84460803}, + {13083, 67684867}, {13084, 50908675}, {13085, 50909443}, {13086, 50910211}, + {13087, 67688195}, {13088, 84466435}, {13089, 67690499}, {13090, 50914307}, + {13091, 50915075}, {13092, 50915843}, {13093, 34139395}, {13094, 34139907}, + {13095, 34128643}, {13096, 34140419}, {13097, 50918147}, {13098, 50918915}, + {13099, 84474115}, {13100, 50920963}, {13101, 67698947}, {13102, 84477187}, + {13103, 50924035}, {13104, 34147587}, {13105, 34148099}, {13106, 84480259}, + {13107, 67704323}, {13108, 84482563}, {13109, 50929411}, {13110, 84484611}, + {13111, 34154243}, {13112, 50931971}, {13113, 50932739}, {13114, 50933507}, + {13115, 50934275}, {13116, 50935043}, {13117, 67713027}, {13118, 50936835}, + {13119, 34160387}, {13120, 50938115}, {13121, 50938883}, {13122, 50939651}, + {13123, 67717635}, {13124, 50941443}, {13125, 50942211}, {13126, 50942979}, + {13127, 84498179}, {13128, 67722243}, {13129, 34168835}, {13130, 84500995}, + {13131, 34170627}, {13132, 67725571}, {13133, 67680003}, {13134, 50949379}, + {13135, 50950147}, {13136, 50950915}, {13137, 67728899}, {13138, 34175491}, + {13139, 50953219}, {13140, 67731203}, {13141, 34177795}, {13142, 84509955}, + {13143, 50904323}, {13144, 34179587}, {13145, 34180099}, {13146, 34180611}, + {13147, 34181123}, {13148, 34181635}, {13149, 34182147}, {13150, 34182659}, + {13151, 34183171}, {13152, 34183683}, {13153, 34184195}, {13154, 50961923}, + {13155, 50962691}, {13156, 50963459}, {13157, 50964227}, {13158, 50964995}, + {13159, 50965763}, {13160, 50966531}, {13161, 50967299}, {13162, 50968067}, + {13163, 50968835}, {13164, 50969603}, {13165, 50970371}, {13166, 50971139}, + {13167, 50971907}, {13168, 50972675}, {13169, 50973443}, {13170, 34196995}, + {13171, 34197507}, {13172, 50975235}, {13173, 34198787}, {13174, 34199299}, + {13175, 34199811}, {13176, 50977539}, {13177, 50978307}, {13178, 34201859}, + {13179, 34202371}, {13180, 34202883}, {13181, 34203395}, {13182, 34203907}, + {13183, 67758851}, {13184, 34196483}, {13185, 34205443}, {13186, 34205955}, + {13187, 34206467}, {13188, 34206979}, {13189, 34207491}, {13190, 34208003}, + {13191, 34208515}, {13192, 50986243}, {13193, 67764227}, {13194, 34210819}, + {13195, 34211331}, {13196, 34211843}, {13197, 34212355}, {13198, 34212867}, + {13199, 34213379}, {13200, 34213891}, {13201, 50991619}, {13202, 50992387}, + {13203, 50990851}, {13204, 50993155}, {13205, 34216707}, {13206, 34217219}, + {13207, 34217731}, {13208, 33556995}, {13209, 34218243}, {13210, 34218755}, + {13211, 34219267}, {13212, 34219779}, {13213, 34220291}, {13214, 34220803}, + {13215, 50998531}, {13216, 50999299}, {13217, 34200579}, {13218, 51000067}, + {13219, 51000835}, {13220, 51001603}, {13221, 34201347}, {13222, 51002371}, + {13223, 51003139}, {13224, 67781123}, {13225, 34196483}, {13226, 51004931}, + {13227, 51005699}, {13228, 51006467}, {13229, 51007235}, {13230, 84562435}, + {13231, 101340931}, {13232, 34233603}, {13233, 34234115}, {13234, 34234627}, + {13235, 34235139}, {13236, 34235651}, {13237, 34236163}, {13238, 34236675}, + {13239, 34237187}, {13240, 34237699}, {13241, 34237187}, {13242, 34238211}, + {13243, 34238723}, {13244, 34239235}, {13245, 34239747}, {13246, 34240259}, + {13247, 34239747}, {13248, 34240771}, {13249, 34241283}, {13250, 2}, + {13251, 34241795}, {13252, 33827331}, {13253, 33554947}, {13254, 67796739}, + {13255, 2}, {13256, 34243331}, {13257, 34243843}, {13258, 34244355}, + {13259, 34196227}, {13260, 34244867}, {13261, 34245379}, {13262, 34220803}, + {13263, 34245891}, {13264, 33557251}, {13265, 34246403}, {13266, 51024131}, + {13267, 34247683}, {13268, 34208003}, {13269, 51025411}, {13270, 51026179}, + {13271, 34249731}, {13272, 2}, {13273, 51027459}, {13274, 34251011}, + {13275, 34231811}, {13276, 34251523}, {13277, 34252035}, {13278, 51029763}, + {13279, 51030531}, {13280, 34254083}, {13281, 34254595}, {13282, 34255107}, + {13283, 34255619}, {13284, 34256131}, {13285, 34256643}, {13286, 34257155}, + {13287, 34257667}, {13288, 34258179}, {13289, 51035907}, {13290, 51036675}, + {13291, 51037443}, {13292, 51038211}, {13293, 51038979}, {13294, 51039747}, + {13295, 51040515}, {13296, 51041283}, {13297, 51042051}, {13298, 51042819}, + {13299, 51043587}, {13300, 51044355}, {13301, 51045123}, {13302, 51045891}, + {13303, 51046659}, {13304, 51047427}, {13305, 51048195}, {13306, 51048963}, + {13307, 51049731}, {13308, 51050499}, {13309, 51051267}, {13310, 51052035}, + {13311, 51052803}, {13312, 1}, {42125, 2}, {42128, 1}, + {42183, 2}, {42192, 1}, {42540, 2}, {42560, 17499139}, + {42561, 1}, {42562, 17499395}, {42563, 1}, {42564, 17499651}, + {42565, 1}, {42566, 17499907}, {42567, 1}, {42568, 17500163}, + {42569, 1}, {42570, 16946435}, {42571, 1}, {42572, 17500419}, + {42573, 1}, {42574, 17500675}, {42575, 1}, {42576, 17500931}, + {42577, 1}, {42578, 17501187}, {42579, 1}, {42580, 17501443}, + {42581, 1}, {42582, 17501699}, {42583, 1}, {42584, 17501955}, + {42585, 1}, {42586, 17502211}, {42587, 1}, {42588, 17502467}, + {42589, 1}, {42590, 17502723}, {42591, 1}, {42592, 17502979}, + {42593, 1}, {42594, 17503235}, {42595, 1}, {42596, 17503491}, + {42597, 1}, {42598, 17503747}, {42599, 1}, {42600, 17504003}, + {42601, 1}, {42602, 17504259}, {42603, 1}, {42604, 17504515}, + {42605, 1}, {42624, 17504771}, {42625, 1}, {42626, 17505027}, + {42627, 1}, {42628, 17505283}, {42629, 1}, {42630, 17505539}, + {42631, 1}, {42632, 17505795}, {42633, 1}, {42634, 17506051}, + {42635, 1}, {42636, 17506307}, {42637, 1}, {42638, 17506563}, + {42639, 1}, {42640, 17506819}, {42641, 1}, {42642, 17507075}, + {42643, 1}, {42644, 17507331}, {42645, 1}, {42646, 17507587}, + {42647, 1}, {42648, 17507843}, {42649, 1}, {42650, 17508099}, + {42651, 1}, {42652, 16873219}, {42653, 16873731}, {42654, 1}, + {42744, 2}, {42752, 1}, {42786, 17508355}, {42787, 1}, + {42788, 17508611}, {42789, 1}, {42790, 17508867}, {42791, 1}, + {42792, 17509123}, {42793, 1}, {42794, 17509379}, {42795, 1}, + {42796, 17509635}, {42797, 1}, {42798, 17509891}, {42799, 1}, + {42802, 17510147}, {42803, 1}, {42804, 17510403}, {42805, 1}, + {42806, 17510659}, {42807, 1}, {42808, 17510915}, {42809, 1}, + {42810, 17511171}, {42811, 1}, {42812, 17511427}, {42813, 1}, + {42814, 17511683}, {42815, 1}, {42816, 17511939}, {42817, 1}, + {42818, 17512195}, {42819, 1}, {42820, 17512451}, {42821, 1}, + {42822, 17512707}, {42823, 1}, {42824, 17512963}, {42825, 1}, + {42826, 17513219}, {42827, 1}, {42828, 17513475}, {42829, 1}, + {42830, 17513731}, {42831, 1}, {42832, 17513987}, {42833, 1}, + {42834, 17514243}, {42835, 1}, {42836, 17514499}, {42837, 1}, + {42838, 17514755}, {42839, 1}, {42840, 17515011}, {42841, 1}, + {42842, 17515267}, {42843, 1}, {42844, 17515523}, {42845, 1}, + {42846, 17515779}, {42847, 1}, {42848, 17516035}, {42849, 1}, + {42850, 17516291}, {42851, 1}, {42852, 17516547}, {42853, 1}, + {42854, 17516803}, {42855, 1}, {42856, 17517059}, {42857, 1}, + {42858, 17517315}, {42859, 1}, {42860, 17517571}, {42861, 1}, + {42862, 17517827}, {42863, 1}, {42864, 17517827}, {42865, 1}, + {42873, 17518083}, {42874, 1}, {42875, 17518339}, {42876, 1}, + {42877, 17518595}, {42878, 17518851}, {42879, 1}, {42880, 17519107}, + {42881, 1}, {42882, 17519363}, {42883, 1}, {42884, 17519619}, + {42885, 1}, {42886, 17519875}, {42887, 1}, {42891, 17520131}, + {42892, 1}, {42893, 16961539}, {42894, 1}, {42896, 17520387}, + {42897, 1}, {42898, 17520643}, {42899, 1}, {42902, 17520899}, + {42903, 1}, {42904, 17521155}, {42905, 1}, {42906, 17521411}, + {42907, 1}, {42908, 17521667}, {42909, 1}, {42910, 17521923}, + {42911, 1}, {42912, 17522179}, {42913, 1}, {42914, 17522435}, + {42915, 1}, {42916, 17522691}, {42917, 1}, {42918, 17522947}, + {42919, 1}, {42920, 17523203}, {42921, 1}, {42922, 16841475}, + {42923, 16959235}, {42924, 16961283}, {42925, 17523459}, {42926, 16961795}, + {42927, 1}, {42928, 17523715}, {42929, 17523971}, {42930, 16962307}, + {42931, 17524227}, {42932, 17524483}, {42933, 1}, {42934, 17524739}, + {42935, 1}, {42936, 17524995}, {42937, 1}, {42938, 17525251}, + {42939, 1}, {42940, 17525507}, {42941, 1}, {42942, 17525763}, + {42943, 1}, {42944, 17526019}, {42945, 1}, {42946, 17526275}, + {42947, 1}, {42948, 17526531}, {42949, 16964611}, {42950, 17526787}, + {42951, 17527043}, {42952, 1}, {42953, 17527299}, {42954, 1}, + {42955, 17527555}, {42956, 17527811}, {42957, 1}, {42958, 2}, + {42960, 17528067}, {42961, 1}, {42962, 2}, {42963, 1}, + {42964, 2}, {42965, 1}, {42966, 17528323}, {42967, 1}, + {42968, 17528579}, {42969, 1}, {42970, 17528835}, {42971, 1}, + {42972, 17529091}, {42973, 2}, {42994, 16777731}, {42995, 16778499}, + {42996, 16781315}, {42997, 17529347}, {42998, 1}, {43000, 16802051}, + {43001, 16808195}, {43002, 1}, {43053, 2}, {43056, 1}, + {43066, 2}, {43072, 1}, {43128, 2}, {43136, 1}, + {43206, 2}, {43214, 1}, {43226, 2}, {43232, 1}, + {43348, 2}, {43359, 1}, {43389, 2}, {43392, 1}, + {43470, 2}, {43471, 1}, {43482, 2}, {43486, 1}, + {43519, 2}, {43520, 1}, {43575, 2}, {43584, 1}, + {43598, 2}, {43600, 1}, {43610, 2}, {43612, 1}, + {43715, 2}, {43739, 1}, {43767, 2}, {43777, 1}, + {43783, 2}, {43785, 1}, {43791, 2}, {43793, 1}, + {43799, 2}, {43808, 1}, {43815, 2}, {43816, 1}, + {43823, 2}, {43824, 1}, {43868, 17508867}, {43869, 17529603}, + {43870, 17135363}, {43871, 17529859}, {43872, 1}, {43881, 17530115}, + {43882, 1}, {43884, 2}, {43888, 17530371}, {43889, 17530627}, + {43890, 17530883}, {43891, 17531139}, {43892, 17531395}, {43893, 17531651}, + {43894, 17531907}, {43895, 17532163}, {43896, 17532419}, {43897, 17532675}, + {43898, 17532931}, {43899, 17533187}, {43900, 17533443}, {43901, 17533699}, + {43902, 17533955}, {43903, 17534211}, {43904, 17534467}, {43905, 17534723}, + {43906, 17534979}, {43907, 17535235}, {43908, 17535491}, {43909, 17535747}, + {43910, 17536003}, {43911, 17536259}, {43912, 17536515}, {43913, 17536771}, + {43914, 17537027}, {43915, 17537283}, {43916, 17537539}, {43917, 17537795}, + {43918, 17538051}, {43919, 17538307}, {43920, 17538563}, {43921, 17538819}, + {43922, 17539075}, {43923, 17539331}, {43924, 17539587}, {43925, 17539843}, + {43926, 17540099}, {43927, 17540355}, {43928, 17540611}, {43929, 17540867}, + {43930, 17541123}, {43931, 17541379}, {43932, 17541635}, {43933, 17541891}, + {43934, 17542147}, {43935, 17542403}, {43936, 17542659}, {43937, 17542915}, + {43938, 17543171}, {43939, 17543427}, {43940, 17543683}, {43941, 17543939}, + {43942, 17544195}, {43943, 17544451}, {43944, 17544707}, {43945, 17544963}, + {43946, 17545219}, {43947, 17545475}, {43948, 17545731}, {43949, 17545987}, + {43950, 17546243}, {43951, 17546499}, {43952, 17546755}, {43953, 17547011}, + {43954, 17547267}, {43955, 17547523}, {43956, 17547779}, {43957, 17548035}, + {43958, 17548291}, {43959, 17548547}, {43960, 17548803}, {43961, 17549059}, + {43962, 17549315}, {43963, 17549571}, {43964, 17549827}, {43965, 17550083}, + {43966, 17550339}, {43967, 17550595}, {43968, 1}, {44014, 2}, + {44016, 1}, {44026, 2}, {44032, 1}, {55204, 2}, + {55216, 1}, {55239, 2}, {55243, 1}, {55292, 2}, + {63744, 17550851}, {63745, 17551107}, {63746, 17192707}, {63747, 17551363}, + {63748, 17551619}, {63749, 17551875}, {63750, 17552131}, {63751, 17206531}, + {63753, 17552387}, {63754, 17194755}, {63755, 17552643}, {63756, 17552899}, + {63757, 17553155}, {63758, 17553411}, {63759, 17553667}, {63760, 17553923}, + {63761, 17554179}, {63762, 17554435}, {63763, 17554691}, {63764, 17554947}, + {63765, 17555203}, {63766, 17555459}, {63767, 17555715}, {63768, 17555971}, + {63769, 17556227}, {63770, 17556483}, {63771, 17556739}, {63772, 17556995}, + {63773, 17557251}, {63774, 17557507}, {63775, 17557763}, {63776, 17558019}, + {63777, 17558275}, {63778, 17558531}, {63779, 17558787}, {63780, 17559043}, + {63781, 17559299}, {63782, 17559555}, {63783, 17559811}, {63784, 17560067}, + {63785, 17560323}, {63786, 17560579}, {63787, 17560835}, {63788, 17561091}, + {63789, 17561347}, {63790, 17561603}, {63791, 17561859}, {63792, 17562115}, + {63793, 17562371}, {63794, 17562627}, {63795, 17562883}, {63796, 17184003}, + {63797, 17563139}, {63798, 17563395}, {63799, 17563651}, {63800, 17563907}, + {63801, 17564163}, {63802, 17564419}, {63803, 17564675}, {63804, 17564931}, + {63805, 17565187}, {63806, 17565443}, {63807, 17565699}, {63808, 17202691}, + {63809, 17565955}, {63810, 17566211}, {63811, 17566467}, {63812, 17566723}, + {63813, 17566979}, {63814, 17567235}, {63815, 17567491}, {63816, 17567747}, + {63817, 17568003}, {63818, 17568259}, {63819, 17568515}, {63820, 17568771}, + {63821, 17569027}, {63822, 17569283}, {63823, 17569539}, {63824, 17569795}, + {63825, 17570051}, {63826, 17570307}, {63827, 17570563}, {63828, 17570819}, + {63829, 17571075}, {63830, 17571331}, {63831, 17571587}, {63832, 17571843}, + {63833, 17572099}, {63834, 17572355}, {63835, 17572611}, {63836, 17554947}, + {63837, 17572867}, {63838, 17573123}, {63839, 17573379}, {63840, 17573635}, + {63841, 17573891}, {63842, 17574147}, {63843, 17574403}, {63844, 17574659}, + {63845, 17574915}, {63846, 17575171}, {63847, 17575427}, {63848, 17575683}, + {63849, 17575939}, {63850, 17576195}, {63851, 17576451}, {63852, 17576707}, + {63853, 17576963}, {63854, 17577219}, {63855, 17577475}, {63856, 17577731}, + {63857, 17193219}, {63858, 17577987}, {63859, 17578243}, {63860, 17578499}, + {63861, 17578755}, {63862, 17579011}, {63863, 17579267}, {63864, 17579523}, + {63865, 17579779}, {63866, 17580035}, {63867, 17580291}, {63868, 17580547}, + {63869, 17580803}, {63870, 17581059}, {63871, 17581315}, {63872, 17581571}, + {63873, 17161731}, {63874, 17581827}, {63875, 17582083}, {63876, 17582339}, + {63877, 17582595}, {63878, 17582851}, {63879, 17583107}, {63880, 17583363}, + {63881, 17583619}, {63882, 17156867}, {63883, 17583875}, {63884, 17584131}, + {63885, 17584387}, {63886, 17584643}, {63887, 17584899}, {63888, 17585155}, + {63889, 17585411}, {63890, 17585667}, {63891, 17585923}, {63892, 17586179}, + {63893, 17586435}, {63894, 17586691}, {63895, 17586947}, {63896, 17587203}, + {63897, 17587459}, {63898, 17587715}, {63899, 17587971}, {63900, 17588227}, + {63901, 17588483}, {63902, 17588739}, {63903, 17588995}, {63904, 17589251}, + {63905, 17577475}, {63906, 17589507}, {63907, 17589763}, {63908, 17590019}, + {63909, 17590275}, {63910, 17590531}, {63911, 17590787}, {63912, 17327619}, + {63913, 17591043}, {63914, 17573379}, {63915, 17591299}, {63916, 17591555}, + {63917, 17591811}, {63918, 17592067}, {63919, 17592323}, {63920, 17592579}, + {63921, 17592835}, {63922, 17593091}, {63923, 17593347}, {63924, 17593603}, + {63925, 17593859}, {63926, 17594115}, {63927, 17594371}, {63928, 17594627}, + {63929, 17594883}, {63930, 17595139}, {63931, 17595395}, {63932, 17595651}, + {63933, 17595907}, {63934, 17596163}, {63935, 17554947}, {63936, 17596419}, + {63937, 17596675}, {63938, 17596931}, {63939, 17597187}, {63940, 17206275}, + {63941, 17597443}, {63942, 17597699}, {63943, 17597955}, {63944, 17598211}, + {63945, 17598467}, {63946, 17598723}, {63947, 17598979}, {63948, 17599235}, + {63949, 17599491}, {63950, 17599747}, {63951, 17600003}, {63952, 17600259}, + {63953, 17264899}, {63954, 17600515}, {63955, 17600771}, {63956, 17601027}, + {63957, 17601283}, {63958, 17601539}, {63959, 17601795}, {63960, 17602051}, + {63961, 17602307}, {63962, 17602563}, {63963, 17573891}, {63964, 17602819}, + {63965, 17603075}, {63966, 17603331}, {63967, 17603587}, {63968, 17603843}, + {63969, 17604099}, {63970, 17604355}, {63971, 17604611}, {63972, 17604867}, + {63973, 17605123}, {63974, 17605379}, {63975, 17605635}, {63976, 17605891}, + {63977, 17194499}, {63978, 17606147}, {63979, 17606403}, {63980, 17606659}, + {63981, 17606915}, {63982, 17607171}, {63983, 17607427}, {63984, 17607683}, + {63985, 17607939}, {63986, 17608195}, {63987, 17608451}, {63988, 17608707}, + {63989, 17608963}, {63990, 17609219}, {63991, 17181955}, {63992, 17609475}, + {63993, 17609731}, {63994, 17609987}, {63995, 17610243}, {63996, 17610499}, + {63997, 17610755}, {63998, 17611011}, {63999, 17611267}, {64000, 17611523}, + {64001, 17611779}, {64002, 17612035}, {64003, 17612291}, {64004, 17612547}, + {64005, 17612803}, {64006, 17613059}, {64007, 17613315}, {64008, 17188867}, + {64009, 17613571}, {64010, 17189635}, {64011, 17613827}, {64012, 17614083}, + {64013, 17614339}, {64014, 1}, {64016, 17614595}, {64017, 1}, + {64018, 17614851}, {64019, 1}, {64021, 17615107}, {64022, 17615363}, + {64023, 17615619}, {64024, 17615875}, {64025, 17616131}, {64026, 17616387}, + {64027, 17616643}, {64028, 17616899}, {64029, 17617155}, {64030, 17183747}, + {64031, 1}, {64032, 17617411}, {64033, 1}, {64034, 17617667}, + {64035, 1}, {64037, 17617923}, {64038, 17618179}, {64039, 1}, + {64042, 17618435}, {64043, 17618691}, {64044, 17618947}, {64045, 17619203}, + {64046, 17619459}, {64047, 17619715}, {64048, 17619971}, {64049, 17620227}, + {64050, 17620483}, {64051, 17620739}, {64052, 17620995}, {64053, 17621251}, + {64054, 17621507}, {64055, 17621763}, {64056, 17622019}, {64057, 17622275}, + {64058, 17622531}, {64059, 17622787}, {64060, 17163523}, {64061, 17623043}, + {64062, 17623299}, {64063, 17623555}, {64064, 17623811}, {64065, 17624067}, + {64066, 17624323}, {64067, 17624579}, {64068, 17624835}, {64069, 17625091}, + {64070, 17625347}, {64071, 17625603}, {64072, 17625859}, {64073, 17626115}, + {64074, 17626371}, {64075, 17626627}, {64076, 17275651}, {64077, 17626883}, + {64078, 17627139}, {64079, 17627395}, {64080, 17627651}, {64081, 17278723}, + {64082, 17627907}, {64083, 17628163}, {64084, 17628419}, {64085, 17628675}, + {64086, 17628931}, {64087, 17586691}, {64088, 17629187}, {64089, 17629443}, + {64090, 17629699}, {64091, 17629955}, {64092, 17630211}, {64093, 17630467}, + {64095, 17630723}, {64096, 17630979}, {64097, 17631235}, {64098, 17631491}, + {64099, 17631747}, {64100, 17632003}, {64101, 17632259}, {64102, 17632515}, + {64103, 17617923}, {64104, 17632771}, {64105, 17633027}, {64106, 17633283}, + {64107, 17633539}, {64108, 17633795}, {64109, 17634051}, {64110, 2}, + {64112, 17634307}, {64113, 17634563}, {64114, 17634819}, {64115, 17635075}, + {64116, 17635331}, {64117, 17635587}, {64118, 17635843}, {64119, 17636099}, + {64120, 17621507}, {64121, 17636355}, {64122, 17636611}, {64123, 17636867}, + {64124, 17614595}, {64125, 17637123}, {64126, 17637379}, {64127, 17637635}, + {64128, 17637891}, {64129, 17638147}, {64130, 17638403}, {64131, 17638659}, + {64132, 17638915}, {64133, 17639171}, {64134, 17639427}, {64135, 17639683}, + {64136, 17639939}, {64137, 17623555}, {64138, 17640195}, {64139, 17623811}, + {64140, 17640451}, {64141, 17640707}, {64142, 17640963}, {64143, 17641219}, + {64144, 17641475}, {64145, 17614851}, {64146, 17560323}, {64147, 17641731}, + {64148, 17641987}, {64149, 17171971}, {64150, 17577731}, {64151, 17598723}, + {64152, 17642243}, {64153, 17642499}, {64154, 17625603}, {64155, 17642755}, + {64156, 17625859}, {64157, 17643011}, {64158, 17643267}, {64159, 17643523}, + {64160, 17615363}, {64161, 17643779}, {64162, 17644035}, {64163, 17644291}, + {64164, 17644547}, {64165, 17644803}, {64166, 17615619}, {64167, 17645059}, + {64168, 17645315}, {64169, 17645571}, {64170, 17645827}, {64171, 17646083}, + {64172, 17646339}, {64173, 17628931}, {64174, 17646595}, {64175, 17646851}, + {64176, 17586691}, {64177, 17647107}, {64178, 17629955}, {64179, 17647363}, + {64180, 17647619}, {64181, 17647875}, {64182, 17648131}, {64183, 17648387}, + {64184, 17631235}, {64185, 17648643}, {64186, 17617667}, {64187, 17648899}, + {64188, 17631491}, {64189, 17572867}, {64190, 17649155}, {64191, 17631747}, + {64192, 17649411}, {64193, 17632259}, {64194, 17649667}, {64195, 17649923}, + {64196, 17650179}, {64197, 17650435}, {64198, 17650691}, {64199, 17632771}, + {64200, 17616899}, {64201, 17650947}, {64202, 17633027}, {64203, 17651203}, + {64204, 17633283}, {64205, 17651459}, {64206, 17206531}, {64207, 17651715}, + {64208, 17651971}, {64209, 17652227}, {64210, 17652483}, {64211, 17652739}, + {64212, 17652995}, {64213, 17653251}, {64214, 17653507}, {64215, 17653763}, + {64216, 17654019}, {64217, 17654275}, {64218, 2}, {64256, 34431747}, + {64257, 34432259}, {64258, 34432771}, {64259, 51209219}, {64260, 51210499}, + {64261, 33559043}, {64263, 2}, {64275, 34434051}, {64276, 34434563}, + {64277, 34435075}, {64278, 34435587}, {64279, 34436099}, {64280, 2}, + {64285, 34436611}, {64286, 1}, {64287, 34437123}, {64288, 17660419}, + {64289, 17054467}, {64290, 17055235}, {64291, 17660675}, {64292, 17660931}, + {64293, 17661187}, {64294, 17661443}, {64295, 17661699}, {64296, 17661955}, + {64297, 17047043}, {64298, 34439427}, {64299, 34439939}, {64300, 51217667}, + {64301, 51218435}, {64302, 34441987}, {64303, 34442499}, {64304, 34443011}, + {64305, 34443523}, {64306, 34444035}, {64307, 34444547}, {64308, 34445059}, + {64309, 34445571}, {64310, 34446083}, {64311, 2}, {64312, 34446595}, + {64313, 34447107}, {64314, 34447619}, {64315, 34448131}, {64316, 34448643}, + {64317, 2}, {64318, 34449155}, {64319, 2}, {64320, 34449667}, + {64321, 34450179}, {64322, 2}, {64323, 34450691}, {64324, 34451203}, + {64325, 2}, {64326, 34451715}, {64327, 34452227}, {64328, 34452739}, + {64329, 34440451}, {64330, 34453251}, {64331, 34453763}, {64332, 34454275}, + {64333, 34454787}, {64334, 34455299}, {64335, 34455811}, {64336, 17679107}, + {64338, 17679363}, {64342, 17679619}, {64346, 17679875}, {64350, 17680131}, + {64354, 17680387}, {64358, 17680643}, {64362, 17680899}, {64366, 17681155}, + {64370, 17681411}, {64374, 17681667}, {64378, 17681923}, {64382, 17682179}, + {64386, 17682435}, {64388, 17682691}, {64390, 17682947}, {64392, 17683203}, + {64394, 17683459}, {64396, 17683715}, {64398, 17683971}, {64402, 17684227}, + {64406, 17684483}, {64410, 17684739}, {64414, 17684995}, {64416, 17685251}, + {64420, 17685507}, {64422, 17685763}, {64426, 17686019}, {64430, 17686275}, + {64432, 17686531}, {64434, 1}, {64451, 2}, {64467, 17686787}, + {64471, 16911619}, {64473, 17687043}, {64475, 17687299}, {64477, 33688835}, + {64478, 17687555}, {64480, 17687811}, {64482, 17688067}, {64484, 17688323}, + {64488, 17688579}, {64490, 34466051}, {64492, 34466563}, {64494, 34467075}, + {64496, 34467587}, {64498, 34468099}, {64500, 34468611}, {64502, 34469123}, + {64505, 34469635}, {64508, 17692931}, {64512, 34470403}, {64513, 34470915}, + {64514, 34471427}, {64515, 34469635}, {64516, 34471939}, {64517, 34472451}, + {64518, 34472963}, {64519, 34473475}, {64520, 34473987}, {64521, 34474499}, + {64522, 34475011}, {64523, 34475523}, {64524, 34476035}, {64525, 34476547}, + {64526, 34477059}, {64527, 34477571}, {64528, 34478083}, {64529, 34478595}, + {64530, 34479107}, {64531, 34479619}, {64532, 34480131}, {64533, 34480643}, + {64534, 34481155}, {64535, 34480899}, {64536, 34481667}, {64537, 34482179}, + {64538, 34482691}, {64539, 34483203}, {64540, 34483715}, {64541, 34484227}, + {64542, 34484739}, {64543, 34485251}, {64544, 34485763}, {64545, 34486275}, + {64546, 34486787}, {64547, 34487299}, {64548, 34487811}, {64549, 34488323}, + {64550, 34488835}, {64551, 34489347}, {64552, 34489859}, {64553, 34490371}, + {64554, 34490883}, {64555, 34491395}, {64556, 34491907}, {64557, 34492419}, + {64558, 34492931}, {64559, 34493443}, {64560, 34493955}, {64561, 34494467}, + {64562, 34494979}, {64563, 34495491}, {64564, 34496003}, {64565, 34496515}, + {64566, 34497027}, {64567, 34497539}, {64568, 34498051}, {64569, 34498563}, + {64570, 34499075}, {64571, 34499587}, {64572, 34500099}, {64573, 34500611}, + {64574, 34501123}, {64575, 34501635}, {64576, 34502147}, {64577, 34502659}, + {64578, 34503171}, {64579, 34503683}, {64580, 34504195}, {64581, 34504707}, + {64582, 34481411}, {64583, 34481923}, {64584, 34505219}, {64585, 34505731}, + {64586, 34506243}, {64587, 34506755}, {64588, 34507267}, {64589, 34507779}, + {64590, 34508291}, {64591, 34508803}, {64592, 34509315}, {64593, 34509827}, + {64594, 34510339}, {64595, 34510851}, {64596, 34511363}, {64597, 34480387}, + {64598, 34511875}, {64599, 34512387}, {64600, 34504451}, {64601, 34512899}, + {64602, 34511619}, {64603, 34513411}, {64604, 34513923}, {64605, 34514435}, + {64606, 51292163}, {64607, 51292931}, {64608, 51293699}, {64609, 51294467}, + {64610, 51295235}, {64611, 51296003}, {64612, 34519555}, {64613, 34520067}, + {64614, 34471427}, {64615, 34520579}, {64616, 34469635}, {64617, 34471939}, + {64618, 34521091}, {64619, 34521603}, {64620, 34473987}, {64621, 34522115}, + {64622, 34474499}, {64623, 34475011}, {64624, 34522627}, {64625, 34523139}, + {64626, 34477059}, {64627, 34523651}, {64628, 34477571}, {64629, 34478083}, + {64630, 34524163}, {64631, 34524675}, {64632, 34479107}, {64633, 34525187}, + {64634, 34479619}, {64635, 34480131}, {64636, 34494467}, {64637, 34494979}, + {64638, 34496515}, {64639, 34497027}, {64640, 34497539}, {64641, 34499587}, + {64642, 34500099}, {64643, 34500611}, {64644, 34501123}, {64645, 34503171}, + {64646, 34503683}, {64647, 34504195}, {64648, 34525699}, {64649, 34505219}, + {64650, 34526211}, {64651, 34526723}, {64652, 34508291}, {64653, 34527235}, + {64654, 34508803}, {64655, 34509315}, {64656, 34514435}, {64657, 34527747}, + {64658, 34528259}, {64659, 34504451}, {64660, 34506499}, {64661, 34512899}, + {64662, 34511619}, {64663, 34470403}, {64664, 34470915}, {64665, 34528771}, + {64666, 34471427}, {64667, 34529283}, {64668, 34472451}, {64669, 34472963}, + {64670, 34473475}, {64671, 34473987}, {64672, 34529795}, {64673, 34475523}, + {64674, 34476035}, {64675, 34476547}, {64676, 34477059}, {64677, 34530307}, + {64678, 34479107}, {64679, 34480643}, {64680, 34481155}, {64681, 34480899}, + {64682, 34481667}, {64683, 34482179}, {64684, 34483203}, {64685, 34483715}, + {64686, 34484227}, {64687, 34484739}, {64688, 34485251}, {64689, 34485763}, + {64690, 34530819}, {64691, 34486275}, {64692, 34486787}, {64693, 34487299}, + {64694, 34487811}, {64695, 34488323}, {64696, 34488835}, {64697, 34489859}, + {64698, 34490371}, {64699, 34490883}, {64700, 34491395}, {64701, 34491907}, + {64702, 34492419}, {64703, 34492931}, {64704, 34493443}, {64705, 34493955}, + {64706, 34495491}, {64707, 34496003}, {64708, 34498051}, {64709, 34498563}, + {64710, 34499075}, {64711, 34499587}, {64712, 34500099}, {64713, 34501635}, + {64714, 34502147}, {64715, 34502659}, {64716, 34503171}, {64717, 34531331}, + {64718, 34504707}, {64719, 34481411}, {64720, 34481923}, {64721, 34505219}, + {64722, 34506755}, {64723, 34507267}, {64724, 34507779}, {64725, 34508291}, + {64726, 34531843}, {64727, 34509827}, {64728, 34510339}, {64729, 34532355}, + {64730, 34480387}, {64731, 34511875}, {64732, 34512387}, {64733, 34504451}, + {64734, 34509571}, {64735, 34471427}, {64736, 34529283}, {64737, 34473987}, + {64738, 34529795}, {64739, 34477059}, {64740, 34530307}, {64741, 34479107}, + {64742, 34532867}, {64743, 34485251}, {64744, 34533379}, {64745, 34533891}, + {64746, 34534403}, {64747, 34499587}, {64748, 34500099}, {64749, 34503171}, + {64750, 34508291}, {64751, 34531843}, {64752, 34504451}, {64753, 34509571}, + {64754, 51312131}, {64755, 51312899}, {64756, 51313667}, {64757, 34537219}, + {64758, 34537731}, {64759, 34538243}, {64760, 34538755}, {64761, 34539267}, + {64762, 34539779}, {64763, 34540291}, {64764, 34540803}, {64765, 34541315}, + {64766, 34541827}, {64767, 34542339}, {64768, 34512131}, {64769, 34542851}, + {64770, 34543363}, {64771, 34543875}, {64772, 34512643}, {64773, 34544387}, + {64774, 34544899}, {64775, 34545411}, {64776, 34545923}, {64777, 34546435}, + {64778, 34546947}, {64779, 34547459}, {64780, 34533891}, {64781, 34547971}, + {64782, 34548483}, {64783, 34548995}, {64784, 34549507}, {64785, 34537219}, + {64786, 34537731}, {64787, 34538243}, {64788, 34538755}, {64789, 34539267}, + {64790, 34539779}, {64791, 34540291}, {64792, 34540803}, {64793, 34541315}, + {64794, 34541827}, {64795, 34542339}, {64796, 34512131}, {64797, 34542851}, + {64798, 34543363}, {64799, 34543875}, {64800, 34512643}, {64801, 34544387}, + {64802, 34544899}, {64803, 34545411}, {64804, 34545923}, {64805, 34546435}, + {64806, 34546947}, {64807, 34547459}, {64808, 34533891}, {64809, 34547971}, + {64810, 34548483}, {64811, 34548995}, {64812, 34549507}, {64813, 34546435}, + {64814, 34546947}, {64815, 34547459}, {64816, 34533891}, {64817, 34533379}, + {64818, 34534403}, {64819, 34489347}, {64820, 34483715}, {64821, 34484227}, + {64822, 34484739}, {64823, 34546435}, {64824, 34546947}, {64825, 34547459}, + {64826, 34489347}, {64827, 34489859}, {64828, 34550019}, {64830, 1}, + {64848, 51327747}, {64849, 51328515}, {64851, 51329283}, {64852, 51330051}, + {64853, 51330819}, {64854, 51331587}, {64855, 51332355}, {64856, 51258371}, + {64858, 51333123}, {64859, 51333891}, {64860, 51334659}, {64861, 51335427}, + {64862, 51336195}, {64863, 51336963}, {64865, 51337731}, {64866, 51338499}, + {64868, 51339267}, {64870, 51340035}, {64871, 51340803}, {64873, 51341571}, + {64874, 51342339}, {64876, 51343107}, {64878, 51343875}, {64879, 51344643}, + {64881, 51345411}, {64883, 51346179}, {64884, 51346947}, {64885, 51347715}, + {64886, 51348483}, {64888, 51349251}, {64889, 51350019}, {64890, 51350787}, + {64891, 51351555}, {64892, 51352323}, {64894, 51353091}, {64895, 51353859}, + {64896, 51354627}, {64897, 51355395}, {64898, 51356163}, {64899, 51356931}, + {64901, 51357699}, {64903, 51358467}, {64905, 51359235}, {64906, 51258627}, + {64907, 51360003}, {64908, 51360771}, {64909, 51281923}, {64910, 51259139}, + {64911, 51361539}, {64912, 2}, {64914, 51362307}, {64915, 51363075}, + {64916, 51363843}, {64917, 51364611}, {64918, 51365379}, {64919, 51366147}, + {64921, 51366915}, {64922, 51367683}, {64923, 51368451}, {64924, 51369219}, + {64926, 51369987}, {64927, 51370755}, {64928, 51371523}, {64929, 51372291}, + {64930, 51373059}, {64931, 51373827}, {64932, 51374595}, {64933, 51375363}, + {64934, 51376131}, {64935, 51376899}, {64936, 51377667}, {64937, 51378435}, + {64938, 51379203}, {64939, 51379971}, {64940, 51380739}, {64941, 51381507}, + {64942, 51289091}, {64943, 51382275}, {64944, 51383043}, {64945, 51383811}, + {64946, 51384579}, {64947, 51385347}, {64948, 51353091}, {64949, 51354627}, + {64950, 51386115}, {64951, 51386883}, {64952, 51387651}, {64953, 51388419}, + {64954, 51389187}, {64955, 51389955}, {64956, 51389187}, {64957, 51387651}, + {64958, 51390723}, {64959, 51391491}, {64960, 51392259}, {64961, 51393027}, + {64962, 51393795}, {64963, 51389955}, {64964, 51347715}, {64965, 51340035}, + {64966, 51394563}, {64967, 51395331}, {64968, 2}, {64975, 1}, + {64976, 2}, {65008, 51396099}, {65009, 51396867}, {65010, 68174851}, + {65011, 68175875}, {65012, 68176899}, {65013, 68177923}, {65014, 68178947}, + {65015, 68179971}, {65016, 68180995}, {65017, 51404803}, {65018, 303063811}, + {65019, 135296259}, {65020, 68189443}, {65021, 1}, {65024, 0}, + {65040, 17858819}, {65041, 17859075}, {65042, 2}, {65043, 17121027}, + {65044, 16848643}, {65045, 17042947}, {65046, 17043971}, {65047, 17859331}, + {65048, 17859587}, {65049, 2}, {65056, 1}, {65072, 2}, + {65073, 17859843}, {65074, 17860099}, {65075, 17860355}, {65077, 17047811}, + {65078, 17048067}, {65079, 17860611}, {65080, 17860867}, {65081, 17861123}, + {65082, 17861379}, {65083, 17861635}, {65084, 17861891}, {65085, 17862147}, + {65086, 17862403}, {65087, 17077763}, {65088, 17078019}, {65089, 17862659}, + {65090, 17862915}, {65091, 17863171}, {65092, 17863427}, {65093, 1}, + {65095, 17863683}, {65096, 17863939}, {65097, 33820675}, {65101, 17860355}, + {65104, 17858819}, {65105, 17859075}, {65106, 2}, {65108, 16848643}, + {65109, 17121027}, {65110, 17043971}, {65111, 17042947}, {65112, 17859843}, + {65113, 17047811}, {65114, 17048067}, {65115, 17860611}, {65116, 17860867}, + {65117, 17861123}, {65118, 17861379}, {65119, 17864195}, {65120, 17864451}, + {65121, 17864707}, {65122, 17047043}, {65123, 17864963}, {65124, 17865219}, + {65125, 17865475}, {65126, 17047555}, {65127, 2}, {65128, 17865731}, + {65129, 17865987}, {65130, 17866243}, {65131, 17866499}, {65132, 2}, + {65136, 34643971}, {65137, 34644483}, {65138, 34514947}, {65139, 1}, + {65140, 34515715}, {65141, 2}, {65142, 34516483}, {65143, 34534915}, + {65144, 34517251}, {65145, 34535683}, {65146, 34518019}, {65147, 34536451}, + {65148, 34518787}, {65149, 34644995}, {65150, 34645507}, {65151, 34646019}, + {65152, 17869315}, {65153, 17869571}, {65155, 17869827}, {65157, 17870083}, + {65159, 17870339}, {65161, 17688835}, {65165, 16910595}, {65167, 17695235}, + {65171, 17870595}, {65173, 17698307}, {65177, 17701379}, {65181, 17693443}, + {65185, 17693955}, {65189, 17696515}, {65193, 17846019}, {65195, 17736195}, + {65197, 17736707}, {65199, 17743107}, {65201, 17706499}, {65205, 17756675}, + {65209, 17708547}, {65213, 17709571}, {65217, 17711619}, {65221, 17712643}, + {65225, 17713155}, {65229, 17714179}, {65233, 17715203}, {65237, 17718275}, + {65241, 17720323}, {65245, 17722627}, {65249, 17694467}, {65253, 17729539}, + {65257, 17732611}, {65261, 16911107}, {65263, 17688579}, {65265, 16912131}, + {65269, 34648067}, {65271, 34648579}, {65273, 34649091}, {65275, 34633987}, + {65277, 2}, {65279, 0}, {65280, 2}, {65281, 17042947}, + {65282, 17872387}, {65283, 17864195}, {65284, 17865987}, {65285, 17866243}, + {65286, 17864451}, {65287, 17872643}, {65288, 17047811}, {65289, 17048067}, + {65290, 17864707}, {65291, 17047043}, {65292, 17858819}, {65293, 17864963}, + {65294, 17207043}, {65295, 17048579}, {65296, 17045507}, {65297, 16786947}, + {65298, 16785155}, {65299, 16785411}, {65300, 16787715}, {65301, 17045763}, + {65302, 17046019}, {65303, 17046275}, {65304, 17046531}, {65305, 17046787}, + {65306, 17121027}, {65307, 16848643}, {65308, 17865219}, {65309, 17047555}, + {65310, 17865475}, {65311, 17043971}, {65312, 17866499}, {65313, 16777219}, + {65314, 16777475}, {65315, 16777731}, {65316, 16777987}, {65317, 16778243}, + {65318, 16778499}, {65319, 16778755}, {65320, 16779011}, {65321, 16779267}, + {65322, 16779523}, {65323, 16779779}, {65324, 16780035}, {65325, 16780291}, + {65326, 16780547}, {65327, 16780803}, {65328, 16781059}, {65329, 16781315}, + {65330, 16781571}, {65331, 16781827}, {65332, 16782083}, {65333, 16782339}, + {65334, 16782595}, {65335, 16782851}, {65336, 16783107}, {65337, 16783363}, + {65338, 16783619}, {65339, 17863683}, {65340, 17865731}, {65341, 17863939}, + {65342, 17872899}, {65343, 17860355}, {65344, 17037059}, {65345, 16777219}, + {65346, 16777475}, {65347, 16777731}, {65348, 16777987}, {65349, 16778243}, + {65350, 16778499}, {65351, 16778755}, {65352, 16779011}, {65353, 16779267}, + {65354, 16779523}, {65355, 16779779}, {65356, 16780035}, {65357, 16780291}, + {65358, 16780547}, {65359, 16780803}, {65360, 16781059}, {65361, 16781315}, + {65362, 16781571}, {65363, 16781827}, {65364, 16782083}, {65365, 16782339}, + {65366, 16782595}, {65367, 16782851}, {65368, 16783107}, {65369, 16783363}, + {65370, 16783619}, {65371, 17860611}, {65372, 17873155}, {65373, 17860867}, + {65374, 17873411}, {65375, 17873667}, {65376, 17873923}, {65377, 17207043}, + {65378, 17862659}, {65379, 17862915}, {65380, 17859075}, {65381, 17874179}, + {65382, 17327363}, {65383, 17329923}, {65384, 17372931}, {65385, 17874435}, + {65386, 17374467}, {65387, 17334019}, {65388, 17874691}, {65389, 17344259}, + {65390, 17390083}, {65391, 17339651}, {65392, 17328643}, {65393, 17316099}, + {65394, 17316355}, {65395, 17316611}, {65396, 17316867}, {65397, 17317123}, + {65398, 17317379}, {65399, 17317635}, {65400, 17317891}, {65401, 17318147}, + {65402, 17209603}, {65403, 17318403}, {65404, 17318659}, {65405, 17318915}, + {65406, 17319171}, {65407, 17319427}, {65408, 17319683}, {65409, 17319939}, + {65410, 17320195}, {65411, 17320451}, {65412, 17209859}, {65413, 17320707}, + {65414, 17320963}, {65415, 17321219}, {65416, 17321475}, {65417, 17321731}, + {65418, 17321987}, {65419, 17322243}, {65420, 17322499}, {65421, 17322755}, + {65422, 17323011}, {65423, 17323267}, {65424, 17323523}, {65425, 17323779}, + {65426, 17324035}, {65427, 17324291}, {65428, 17324547}, {65429, 17324803}, + {65430, 17325059}, {65431, 17325315}, {65432, 17325571}, {65433, 17325827}, + {65434, 17326083}, {65435, 17326339}, {65436, 17326595}, {65437, 17330435}, + {65438, 17208323}, {65439, 17208835}, {65440, 0}, {65441, 17210115}, + {65442, 17210371}, {65443, 17210627}, {65444, 17210883}, {65445, 17211139}, + {65446, 17211395}, {65447, 17211651}, {65448, 17211907}, {65449, 17212163}, + {65450, 17212419}, {65451, 17212675}, {65452, 17212931}, {65453, 17213187}, + {65454, 17213443}, {65455, 17213699}, {65456, 17213955}, {65457, 17214211}, + {65458, 17214467}, {65459, 17214723}, {65460, 17214979}, {65461, 17215235}, + {65462, 17215491}, {65463, 17215747}, {65464, 17216003}, {65465, 17216259}, + {65466, 17216515}, {65467, 17216771}, {65468, 17217027}, {65469, 17217283}, + {65470, 17217539}, {65471, 2}, {65474, 17217795}, {65475, 17218051}, + {65476, 17218307}, {65477, 17218563}, {65478, 17218819}, {65479, 17219075}, + {65480, 2}, {65482, 17219331}, {65483, 17219587}, {65484, 17219843}, + {65485, 17220099}, {65486, 17220355}, {65487, 17220611}, {65488, 2}, + {65490, 17220867}, {65491, 17221123}, {65492, 17221379}, {65493, 17221635}, + {65494, 17221891}, {65495, 17222147}, {65496, 2}, {65498, 17222403}, + {65499, 17222659}, {65500, 17222915}, {65501, 2}, {65504, 17874947}, + {65505, 17875203}, {65506, 17875459}, {65507, 33561859}, {65508, 17875715}, + {65509, 17875971}, {65510, 17876227}, {65511, 2}, {65512, 17876483}, + {65513, 17876739}, {65514, 17876995}, {65515, 17877251}, {65516, 17877507}, + {65517, 17877763}, {65518, 17878019}, {65519, 2}, {65536, 1}, + {65548, 2}, {65549, 1}, {65575, 2}, {65576, 1}, + {65595, 2}, {65596, 1}, {65598, 2}, {65599, 1}, + {65614, 2}, {65616, 1}, {65630, 2}, {65664, 1}, + {65787, 2}, {65792, 1}, {65795, 2}, {65799, 1}, + {65844, 2}, {65847, 1}, {65935, 2}, {65936, 1}, + {65949, 2}, {65952, 1}, {65953, 2}, {66000, 1}, + {66046, 2}, {66176, 1}, {66205, 2}, {66208, 1}, + {66257, 2}, {66272, 1}, {66300, 2}, {66304, 1}, + {66340, 2}, {66349, 1}, {66379, 2}, {66384, 1}, + {66427, 2}, {66432, 1}, {66462, 2}, {66463, 1}, + {66500, 2}, {66504, 1}, {66518, 2}, {66560, 17878275}, + {66561, 17878531}, {66562, 17878787}, {66563, 17879043}, {66564, 17879299}, + {66565, 17879555}, {66566, 17879811}, {66567, 17880067}, {66568, 17880323}, + {66569, 17880579}, {66570, 17880835}, {66571, 17881091}, {66572, 17881347}, + {66573, 17881603}, {66574, 17881859}, {66575, 17882115}, {66576, 17882371}, + {66577, 17882627}, {66578, 17882883}, {66579, 17883139}, {66580, 17883395}, + {66581, 17883651}, {66582, 17883907}, {66583, 17884163}, {66584, 17884419}, + {66585, 17884675}, {66586, 17884931}, {66587, 17885187}, {66588, 17885443}, + {66589, 17885699}, {66590, 17885955}, {66591, 17886211}, {66592, 17886467}, + {66593, 17886723}, {66594, 17886979}, {66595, 17887235}, {66596, 17887491}, + {66597, 17887747}, {66598, 17888003}, {66599, 17888259}, {66600, 1}, + {66718, 2}, {66720, 1}, {66730, 2}, {66736, 17888515}, + {66737, 17888771}, {66738, 17889027}, {66739, 17889283}, {66740, 17889539}, + {66741, 17889795}, {66742, 17890051}, {66743, 17890307}, {66744, 17890563}, + {66745, 17890819}, {66746, 17891075}, {66747, 17891331}, {66748, 17891587}, + {66749, 17891843}, {66750, 17892099}, {66751, 17892355}, {66752, 17892611}, + {66753, 17892867}, {66754, 17893123}, {66755, 17893379}, {66756, 17893635}, + {66757, 17893891}, {66758, 17894147}, {66759, 17894403}, {66760, 17894659}, + {66761, 17894915}, {66762, 17895171}, {66763, 17895427}, {66764, 17895683}, + {66765, 17895939}, {66766, 17896195}, {66767, 17896451}, {66768, 17896707}, + {66769, 17896963}, {66770, 17897219}, {66771, 17897475}, {66772, 2}, + {66776, 1}, {66812, 2}, {66816, 1}, {66856, 2}, + {66864, 1}, {66916, 2}, {66927, 1}, {66928, 17897731}, + {66929, 17897987}, {66930, 17898243}, {66931, 17898499}, {66932, 17898755}, + {66933, 17899011}, {66934, 17899267}, {66935, 17899523}, {66936, 17899779}, + {66937, 17900035}, {66938, 17900291}, {66939, 2}, {66940, 17900547}, + {66941, 17900803}, {66942, 17901059}, {66943, 17901315}, {66944, 17901571}, + {66945, 17901827}, {66946, 17902083}, {66947, 17902339}, {66948, 17902595}, + {66949, 17902851}, {66950, 17903107}, {66951, 17903363}, {66952, 17903619}, + {66953, 17903875}, {66954, 17904131}, {66955, 2}, {66956, 17904387}, + {66957, 17904643}, {66958, 17904899}, {66959, 17905155}, {66960, 17905411}, + {66961, 17905667}, {66962, 17905923}, {66963, 2}, {66964, 17906179}, + {66965, 17906435}, {66966, 2}, {66967, 1}, {66978, 2}, + {66979, 1}, {66994, 2}, {66995, 1}, {67002, 2}, + {67003, 1}, {67005, 2}, {67008, 1}, {67060, 2}, + {67072, 1}, {67383, 2}, {67392, 1}, {67414, 2}, + {67424, 1}, {67432, 2}, {67456, 1}, {67457, 17906691}, + {67458, 17906947}, {67459, 16791043}, {67460, 17907203}, {67461, 16814083}, + {67462, 2}, {67463, 17907459}, {67464, 17907715}, {67465, 17907971}, + {67466, 17908227}, {67467, 16815363}, {67468, 16815619}, {67469, 17908483}, + {67470, 17908739}, {67471, 17908995}, {67472, 17909251}, {67473, 17527555}, + {67474, 17909507}, {67475, 16817155}, {67476, 17909763}, {67477, 16802051}, + {67478, 17910019}, {67479, 17910275}, {67480, 17910531}, {67481, 17910787}, + {67482, 17911043}, {67483, 17523459}, {67484, 17911299}, {67485, 17911555}, + {67486, 17911811}, {67487, 17912067}, {67488, 17912323}, {67489, 17912579}, + {67490, 16795395}, {67491, 17912835}, {67492, 17913091}, {67493, 16781315}, + {67494, 17913347}, {67495, 17913603}, {67496, 17135875}, {67497, 17913859}, + {67498, 16819971}, {67499, 17914115}, {67500, 17914371}, {67501, 17914627}, + {67502, 17914883}, {67503, 16820995}, {67504, 17915139}, {67505, 2}, + {67506, 17915395}, {67507, 17915651}, {67508, 17915907}, {67509, 17916163}, + {67510, 17916419}, {67511, 17916675}, {67512, 17916931}, {67513, 17917187}, + {67514, 17917443}, {67515, 2}, {67584, 1}, {67590, 2}, + {67592, 1}, {67593, 2}, {67594, 1}, {67638, 2}, + {67639, 1}, {67641, 2}, {67644, 1}, {67645, 2}, + {67647, 1}, {67670, 2}, {67671, 1}, {67743, 2}, + {67751, 1}, {67760, 2}, {67808, 1}, {67827, 2}, + {67828, 1}, {67830, 2}, {67835, 1}, {67868, 2}, + {67871, 1}, {67898, 2}, {67903, 1}, {67904, 2}, + {67968, 1}, {68024, 2}, {68028, 1}, {68048, 2}, + {68050, 1}, {68100, 2}, {68101, 1}, {68103, 2}, + {68108, 1}, {68116, 2}, {68117, 1}, {68120, 2}, + {68121, 1}, {68150, 2}, {68152, 1}, {68155, 2}, + {68159, 1}, {68169, 2}, {68176, 1}, {68185, 2}, + {68192, 1}, {68256, 2}, {68288, 1}, {68327, 2}, + {68331, 1}, {68343, 2}, {68352, 1}, {68406, 2}, + {68409, 1}, {68438, 2}, {68440, 1}, {68467, 2}, + {68472, 1}, {68498, 2}, {68505, 1}, {68509, 2}, + {68521, 1}, {68528, 2}, {68608, 1}, {68681, 2}, + {68736, 17917699}, {68737, 17917955}, {68738, 17918211}, {68739, 17918467}, + {68740, 17918723}, {68741, 17918979}, {68742, 17919235}, {68743, 17919491}, + {68744, 17919747}, {68745, 17920003}, {68746, 17920259}, {68747, 17920515}, + {68748, 17920771}, {68749, 17921027}, {68750, 17921283}, {68751, 17921539}, + {68752, 17921795}, {68753, 17922051}, {68754, 17922307}, {68755, 17922563}, + {68756, 17922819}, {68757, 17923075}, {68758, 17923331}, {68759, 17923587}, + {68760, 17923843}, {68761, 17924099}, {68762, 17924355}, {68763, 17924611}, + {68764, 17924867}, {68765, 17925123}, {68766, 17925379}, {68767, 17925635}, + {68768, 17925891}, {68769, 17926147}, {68770, 17926403}, {68771, 17926659}, + {68772, 17926915}, {68773, 17927171}, {68774, 17927427}, {68775, 17927683}, + {68776, 17927939}, {68777, 17928195}, {68778, 17928451}, {68779, 17928707}, + {68780, 17928963}, {68781, 17929219}, {68782, 17929475}, {68783, 17929731}, + {68784, 17929987}, {68785, 17930243}, {68786, 17930499}, {68787, 2}, + {68800, 1}, {68851, 2}, {68858, 1}, {68904, 2}, + {68912, 1}, {68922, 2}, {68928, 1}, {68944, 17930755}, + {68945, 17931011}, {68946, 17931267}, {68947, 17931523}, {68948, 17931779}, + {68949, 17932035}, {68950, 17932291}, {68951, 17932547}, {68952, 17932803}, + {68953, 17933059}, {68954, 17933315}, {68955, 17933571}, {68956, 17933827}, + {68957, 17934083}, {68958, 17934339}, {68959, 17934595}, {68960, 17934851}, + {68961, 17935107}, {68962, 17935363}, {68963, 17935619}, {68964, 17935875}, + {68965, 17936131}, {68966, 2}, {68969, 1}, {68998, 2}, + {69006, 1}, {69008, 2}, {69216, 1}, {69247, 2}, + {69248, 1}, {69290, 2}, {69291, 1}, {69294, 2}, + {69296, 1}, {69298, 2}, {69314, 1}, {69317, 2}, + {69372, 1}, {69416, 2}, {69424, 1}, {69466, 2}, + {69488, 1}, {69514, 2}, {69552, 1}, {69580, 2}, + {69600, 1}, {69623, 2}, {69632, 1}, {69710, 2}, + {69714, 1}, {69750, 2}, {69759, 1}, {69821, 2}, + {69822, 1}, {69827, 2}, {69840, 1}, {69865, 2}, + {69872, 1}, {69882, 2}, {69888, 1}, {69941, 2}, + {69942, 1}, {69960, 2}, {69968, 1}, {70007, 2}, + {70016, 1}, {70112, 2}, {70113, 1}, {70133, 2}, + {70144, 1}, {70162, 2}, {70163, 1}, {70210, 2}, + {70272, 1}, {70279, 2}, {70280, 1}, {70281, 2}, + {70282, 1}, {70286, 2}, {70287, 1}, {70302, 2}, + {70303, 1}, {70314, 2}, {70320, 1}, {70379, 2}, + {70384, 1}, {70394, 2}, {70400, 1}, {70404, 2}, + {70405, 1}, {70413, 2}, {70415, 1}, {70417, 2}, + {70419, 1}, {70441, 2}, {70442, 1}, {70449, 2}, + {70450, 1}, {70452, 2}, {70453, 1}, {70458, 2}, + {70459, 1}, {70469, 2}, {70471, 1}, {70473, 2}, + {70475, 1}, {70478, 2}, {70480, 1}, {70481, 2}, + {70487, 1}, {70488, 2}, {70493, 1}, {70500, 2}, + {70502, 1}, {70509, 2}, {70512, 1}, {70517, 2}, + {70528, 1}, {70538, 2}, {70539, 1}, {70540, 2}, + {70542, 1}, {70543, 2}, {70544, 1}, {70582, 2}, + {70583, 1}, {70593, 2}, {70594, 1}, {70595, 2}, + {70597, 1}, {70598, 2}, {70599, 1}, {70603, 2}, + {70604, 1}, {70614, 2}, {70615, 1}, {70617, 2}, + {70625, 1}, {70627, 2}, {70656, 1}, {70748, 2}, + {70749, 1}, {70754, 2}, {70784, 1}, {70856, 2}, + {70864, 1}, {70874, 2}, {71040, 1}, {71094, 2}, + {71096, 1}, {71134, 2}, {71168, 1}, {71237, 2}, + {71248, 1}, {71258, 2}, {71264, 1}, {71277, 2}, + {71296, 1}, {71354, 2}, {71360, 1}, {71370, 2}, + {71376, 1}, {71396, 2}, {71424, 1}, {71451, 2}, + {71453, 1}, {71468, 2}, {71472, 1}, {71495, 2}, + {71680, 1}, {71740, 2}, {71840, 17936387}, {71841, 17936643}, + {71842, 17936899}, {71843, 17937155}, {71844, 17937411}, {71845, 17937667}, + {71846, 17937923}, {71847, 17938179}, {71848, 17938435}, {71849, 17938691}, + {71850, 17938947}, {71851, 17939203}, {71852, 17939459}, {71853, 17939715}, + {71854, 17939971}, {71855, 17940227}, {71856, 17940483}, {71857, 17940739}, + {71858, 17940995}, {71859, 17941251}, {71860, 17941507}, {71861, 17941763}, + {71862, 17942019}, {71863, 17942275}, {71864, 17942531}, {71865, 17942787}, + {71866, 17943043}, {71867, 17943299}, {71868, 17943555}, {71869, 17943811}, + {71870, 17944067}, {71871, 17944323}, {71872, 1}, {71923, 2}, + {71935, 1}, {71943, 2}, {71945, 1}, {71946, 2}, + {71948, 1}, {71956, 2}, {71957, 1}, {71959, 2}, + {71960, 1}, {71990, 2}, {71991, 1}, {71993, 2}, + {71995, 1}, {72007, 2}, {72016, 1}, {72026, 2}, + {72096, 1}, {72104, 2}, {72106, 1}, {72152, 2}, + {72154, 1}, {72165, 2}, {72192, 1}, {72264, 2}, + {72272, 1}, {72355, 2}, {72368, 1}, {72441, 2}, + {72448, 1}, {72458, 2}, {72640, 1}, {72674, 2}, + {72688, 1}, {72698, 2}, {72704, 1}, {72713, 2}, + {72714, 1}, {72759, 2}, {72760, 1}, {72774, 2}, + {72784, 1}, {72813, 2}, {72816, 1}, {72848, 2}, + {72850, 1}, {72872, 2}, {72873, 1}, {72887, 2}, + {72960, 1}, {72967, 2}, {72968, 1}, {72970, 2}, + {72971, 1}, {73015, 2}, {73018, 1}, {73019, 2}, + {73020, 1}, {73022, 2}, {73023, 1}, {73032, 2}, + {73040, 1}, {73050, 2}, {73056, 1}, {73062, 2}, + {73063, 1}, {73065, 2}, {73066, 1}, {73103, 2}, + {73104, 1}, {73106, 2}, {73107, 1}, {73113, 2}, + {73120, 1}, {73130, 2}, {73440, 1}, {73465, 2}, + {73472, 1}, {73489, 2}, {73490, 1}, {73531, 2}, + {73534, 1}, {73563, 2}, {73648, 1}, {73649, 2}, + {73664, 1}, {73714, 2}, {73727, 1}, {74650, 2}, + {74752, 1}, {74863, 2}, {74864, 1}, {74869, 2}, + {74880, 1}, {75076, 2}, {77712, 1}, {77811, 2}, + {77824, 1}, {78896, 2}, {78912, 1}, {78934, 2}, + {78944, 1}, {82939, 2}, {82944, 1}, {83527, 2}, + {90368, 1}, {90426, 2}, {92160, 1}, {92729, 2}, + {92736, 1}, {92767, 2}, {92768, 1}, {92778, 2}, + {92782, 1}, {92863, 2}, {92864, 1}, {92874, 2}, + {92880, 1}, {92910, 2}, {92912, 1}, {92918, 2}, + {92928, 1}, {92998, 2}, {93008, 1}, {93018, 2}, + {93019, 1}, {93026, 2}, {93027, 1}, {93048, 2}, + {93053, 1}, {93072, 2}, {93504, 1}, {93562, 2}, + {93760, 17944579}, {93761, 17944835}, {93762, 17945091}, {93763, 17945347}, + {93764, 17945603}, {93765, 17945859}, {93766, 17946115}, {93767, 17946371}, + {93768, 17946627}, {93769, 17946883}, {93770, 17947139}, {93771, 17947395}, + {93772, 17947651}, {93773, 17947907}, {93774, 17948163}, {93775, 17948419}, + {93776, 17948675}, {93777, 17948931}, {93778, 17949187}, {93779, 17949443}, + {93780, 17949699}, {93781, 17949955}, {93782, 17950211}, {93783, 17950467}, + {93784, 17950723}, {93785, 17950979}, {93786, 17951235}, {93787, 17951491}, + {93788, 17951747}, {93789, 17952003}, {93790, 17952259}, {93791, 17952515}, + {93792, 1}, {93851, 2}, {93952, 1}, {94027, 2}, + {94031, 1}, {94088, 2}, {94095, 1}, {94112, 2}, + {94176, 1}, {94181, 2}, {94192, 1}, {94194, 2}, + {94208, 1}, {100344, 2}, {100352, 1}, {101590, 2}, + {101631, 1}, {101641, 2}, {110576, 1}, {110580, 2}, + {110581, 1}, {110588, 2}, {110589, 1}, {110591, 2}, + {110592, 1}, {110883, 2}, {110898, 1}, {110899, 2}, + {110928, 1}, {110931, 2}, {110933, 1}, {110934, 2}, + {110948, 1}, {110952, 2}, {110960, 1}, {111356, 2}, + {113664, 1}, {113771, 2}, {113776, 1}, {113789, 2}, + {113792, 1}, {113801, 2}, {113808, 1}, {113818, 2}, + {113820, 1}, {113824, 0}, {113828, 2}, {117760, 1}, + {117974, 16777219}, {117975, 16777475}, {117976, 16777731}, {117977, 16777987}, + {117978, 16778243}, {117979, 16778499}, {117980, 16778755}, {117981, 16779011}, + {117982, 16779267}, {117983, 16779523}, {117984, 16779779}, {117985, 16780035}, + {117986, 16780291}, {117987, 16780547}, {117988, 16780803}, {117989, 16781059}, + {117990, 16781315}, {117991, 16781571}, {117992, 16781827}, {117993, 16782083}, + {117994, 16782339}, {117995, 16782595}, {117996, 16782851}, {117997, 16783107}, + {117998, 16783363}, {117999, 16783619}, {118000, 17045507}, {118001, 16786947}, + {118002, 16785155}, {118003, 16785411}, {118004, 16787715}, {118005, 17045763}, + {118006, 17046019}, {118007, 17046275}, {118008, 17046531}, {118009, 17046787}, + {118010, 2}, {118016, 1}, {118452, 2}, {118528, 1}, + {118574, 2}, {118576, 1}, {118599, 2}, {118608, 1}, + {118724, 2}, {118784, 1}, {119030, 2}, {119040, 1}, + {119079, 2}, {119081, 1}, {119134, 34729987}, {119135, 34730499}, + {119136, 51508227}, {119137, 51508995}, {119138, 51509763}, {119139, 51510531}, + {119140, 51511299}, {119141, 1}, {119155, 0}, {119163, 1}, + {119227, 34734851}, {119228, 34735363}, {119229, 51513091}, {119230, 51513859}, + {119231, 51514627}, {119232, 51515395}, {119233, 1}, {119275, 2}, + {119296, 1}, {119366, 2}, {119488, 1}, {119508, 2}, + {119520, 1}, {119540, 2}, {119552, 1}, {119639, 2}, + {119648, 1}, {119673, 2}, {119808, 16777219}, {119809, 16777475}, + {119810, 16777731}, {119811, 16777987}, {119812, 16778243}, {119813, 16778499}, + {119814, 16778755}, {119815, 16779011}, {119816, 16779267}, {119817, 16779523}, + {119818, 16779779}, {119819, 16780035}, {119820, 16780291}, {119821, 16780547}, + {119822, 16780803}, {119823, 16781059}, {119824, 16781315}, {119825, 16781571}, + {119826, 16781827}, {119827, 16782083}, {119828, 16782339}, {119829, 16782595}, + {119830, 16782851}, {119831, 16783107}, {119832, 16783363}, {119833, 16783619}, + {119834, 16777219}, {119835, 16777475}, {119836, 16777731}, {119837, 16777987}, + {119838, 16778243}, {119839, 16778499}, {119840, 16778755}, {119841, 16779011}, + {119842, 16779267}, {119843, 16779523}, {119844, 16779779}, {119845, 16780035}, + {119846, 16780291}, {119847, 16780547}, {119848, 16780803}, {119849, 16781059}, + {119850, 16781315}, {119851, 16781571}, {119852, 16781827}, {119853, 16782083}, + {119854, 16782339}, {119855, 16782595}, {119856, 16782851}, {119857, 16783107}, + {119858, 16783363}, {119859, 16783619}, {119860, 16777219}, {119861, 16777475}, + {119862, 16777731}, {119863, 16777987}, {119864, 16778243}, {119865, 16778499}, + {119866, 16778755}, {119867, 16779011}, {119868, 16779267}, {119869, 16779523}, + {119870, 16779779}, {119871, 16780035}, {119872, 16780291}, {119873, 16780547}, + {119874, 16780803}, {119875, 16781059}, {119876, 16781315}, {119877, 16781571}, + {119878, 16781827}, {119879, 16782083}, {119880, 16782339}, {119881, 16782595}, + {119882, 16782851}, {119883, 16783107}, {119884, 16783363}, {119885, 16783619}, + {119886, 16777219}, {119887, 16777475}, {119888, 16777731}, {119889, 16777987}, + {119890, 16778243}, {119891, 16778499}, {119892, 16778755}, {119893, 2}, + {119894, 16779267}, {119895, 16779523}, {119896, 16779779}, {119897, 16780035}, + {119898, 16780291}, {119899, 16780547}, {119900, 16780803}, {119901, 16781059}, + {119902, 16781315}, {119903, 16781571}, {119904, 16781827}, {119905, 16782083}, + {119906, 16782339}, {119907, 16782595}, {119908, 16782851}, {119909, 16783107}, + {119910, 16783363}, {119911, 16783619}, {119912, 16777219}, {119913, 16777475}, + {119914, 16777731}, {119915, 16777987}, {119916, 16778243}, {119917, 16778499}, + {119918, 16778755}, {119919, 16779011}, {119920, 16779267}, {119921, 16779523}, + {119922, 16779779}, {119923, 16780035}, {119924, 16780291}, {119925, 16780547}, + {119926, 16780803}, {119927, 16781059}, {119928, 16781315}, {119929, 16781571}, + {119930, 16781827}, {119931, 16782083}, {119932, 16782339}, {119933, 16782595}, + {119934, 16782851}, {119935, 16783107}, {119936, 16783363}, {119937, 16783619}, + {119938, 16777219}, {119939, 16777475}, {119940, 16777731}, {119941, 16777987}, + {119942, 16778243}, {119943, 16778499}, {119944, 16778755}, {119945, 16779011}, + {119946, 16779267}, {119947, 16779523}, {119948, 16779779}, {119949, 16780035}, + {119950, 16780291}, {119951, 16780547}, {119952, 16780803}, {119953, 16781059}, + {119954, 16781315}, {119955, 16781571}, {119956, 16781827}, {119957, 16782083}, + {119958, 16782339}, {119959, 16782595}, {119960, 16782851}, {119961, 16783107}, + {119962, 16783363}, {119963, 16783619}, {119964, 16777219}, {119965, 2}, + {119966, 16777731}, {119967, 16777987}, {119968, 2}, {119970, 16778755}, + {119971, 2}, {119973, 16779523}, {119974, 16779779}, {119975, 2}, + {119977, 16780547}, {119978, 16780803}, {119979, 16781059}, {119980, 16781315}, + {119981, 2}, {119982, 16781827}, {119983, 16782083}, {119984, 16782339}, + {119985, 16782595}, {119986, 16782851}, {119987, 16783107}, {119988, 16783363}, + {119989, 16783619}, {119990, 16777219}, {119991, 16777475}, {119992, 16777731}, + {119993, 16777987}, {119994, 2}, {119995, 16778499}, {119996, 2}, + {119997, 16779011}, {119998, 16779267}, {119999, 16779523}, {120000, 16779779}, + {120001, 16780035}, {120002, 16780291}, {120003, 16780547}, {120004, 2}, + {120005, 16781059}, {120006, 16781315}, {120007, 16781571}, {120008, 16781827}, + {120009, 16782083}, {120010, 16782339}, {120011, 16782595}, {120012, 16782851}, + {120013, 16783107}, {120014, 16783363}, {120015, 16783619}, {120016, 16777219}, + {120017, 16777475}, {120018, 16777731}, {120019, 16777987}, {120020, 16778243}, + {120021, 16778499}, {120022, 16778755}, {120023, 16779011}, {120024, 16779267}, + {120025, 16779523}, {120026, 16779779}, {120027, 16780035}, {120028, 16780291}, + {120029, 16780547}, {120030, 16780803}, {120031, 16781059}, {120032, 16781315}, + {120033, 16781571}, {120034, 16781827}, {120035, 16782083}, {120036, 16782339}, + {120037, 16782595}, {120038, 16782851}, {120039, 16783107}, {120040, 16783363}, + {120041, 16783619}, {120042, 16777219}, {120043, 16777475}, {120044, 16777731}, + {120045, 16777987}, {120046, 16778243}, {120047, 16778499}, {120048, 16778755}, + {120049, 16779011}, {120050, 16779267}, {120051, 16779523}, {120052, 16779779}, + {120053, 16780035}, {120054, 16780291}, {120055, 16780547}, {120056, 16780803}, + {120057, 16781059}, {120058, 16781315}, {120059, 16781571}, {120060, 16781827}, + {120061, 16782083}, {120062, 16782339}, {120063, 16782595}, {120064, 16782851}, + {120065, 16783107}, {120066, 16783363}, {120067, 16783619}, {120068, 16777219}, + {120069, 16777475}, {120070, 2}, {120071, 16777987}, {120072, 16778243}, + {120073, 16778499}, {120074, 16778755}, {120075, 2}, {120077, 16779523}, + {120078, 16779779}, {120079, 16780035}, {120080, 16780291}, {120081, 16780547}, + {120082, 16780803}, {120083, 16781059}, {120084, 16781315}, {120085, 2}, + {120086, 16781827}, {120087, 16782083}, {120088, 16782339}, {120089, 16782595}, + {120090, 16782851}, {120091, 16783107}, {120092, 16783363}, {120093, 2}, + {120094, 16777219}, {120095, 16777475}, {120096, 16777731}, {120097, 16777987}, + {120098, 16778243}, {120099, 16778499}, {120100, 16778755}, {120101, 16779011}, + {120102, 16779267}, {120103, 16779523}, {120104, 16779779}, {120105, 16780035}, + {120106, 16780291}, {120107, 16780547}, {120108, 16780803}, {120109, 16781059}, + {120110, 16781315}, {120111, 16781571}, {120112, 16781827}, {120113, 16782083}, + {120114, 16782339}, {120115, 16782595}, {120116, 16782851}, {120117, 16783107}, + {120118, 16783363}, {120119, 16783619}, {120120, 16777219}, {120121, 16777475}, + {120122, 2}, {120123, 16777987}, {120124, 16778243}, {120125, 16778499}, + {120126, 16778755}, {120127, 2}, {120128, 16779267}, {120129, 16779523}, + {120130, 16779779}, {120131, 16780035}, {120132, 16780291}, {120133, 2}, + {120134, 16780803}, {120135, 2}, {120138, 16781827}, {120139, 16782083}, + {120140, 16782339}, {120141, 16782595}, {120142, 16782851}, {120143, 16783107}, + {120144, 16783363}, {120145, 2}, {120146, 16777219}, {120147, 16777475}, + {120148, 16777731}, {120149, 16777987}, {120150, 16778243}, {120151, 16778499}, + {120152, 16778755}, {120153, 16779011}, {120154, 16779267}, {120155, 16779523}, + {120156, 16779779}, {120157, 16780035}, {120158, 16780291}, {120159, 16780547}, + {120160, 16780803}, {120161, 16781059}, {120162, 16781315}, {120163, 16781571}, + {120164, 16781827}, {120165, 16782083}, {120166, 16782339}, {120167, 16782595}, + {120168, 16782851}, {120169, 16783107}, {120170, 16783363}, {120171, 16783619}, + {120172, 16777219}, {120173, 16777475}, {120174, 16777731}, {120175, 16777987}, + {120176, 16778243}, {120177, 16778499}, {120178, 16778755}, {120179, 16779011}, + {120180, 16779267}, {120181, 16779523}, {120182, 16779779}, {120183, 16780035}, + {120184, 16780291}, {120185, 16780547}, {120186, 16780803}, {120187, 16781059}, + {120188, 16781315}, {120189, 16781571}, {120190, 16781827}, {120191, 16782083}, + {120192, 16782339}, {120193, 16782595}, {120194, 16782851}, {120195, 16783107}, + {120196, 16783363}, {120197, 16783619}, {120198, 16777219}, {120199, 16777475}, + {120200, 16777731}, {120201, 16777987}, {120202, 16778243}, {120203, 16778499}, + {120204, 16778755}, {120205, 16779011}, {120206, 16779267}, {120207, 16779523}, + {120208, 16779779}, {120209, 16780035}, {120210, 16780291}, {120211, 16780547}, + {120212, 16780803}, {120213, 16781059}, {120214, 16781315}, {120215, 16781571}, + {120216, 16781827}, {120217, 16782083}, {120218, 16782339}, {120219, 16782595}, + {120220, 16782851}, {120221, 16783107}, {120222, 16783363}, {120223, 16783619}, + {120224, 16777219}, {120225, 16777475}, {120226, 16777731}, {120227, 16777987}, + {120228, 16778243}, {120229, 16778499}, {120230, 16778755}, {120231, 16779011}, + {120232, 16779267}, {120233, 16779523}, {120234, 16779779}, {120235, 16780035}, + {120236, 16780291}, {120237, 16780547}, {120238, 16780803}, {120239, 16781059}, + {120240, 16781315}, {120241, 16781571}, {120242, 16781827}, {120243, 16782083}, + {120244, 16782339}, {120245, 16782595}, {120246, 16782851}, {120247, 16783107}, + {120248, 16783363}, {120249, 16783619}, {120250, 16777219}, {120251, 16777475}, + {120252, 16777731}, {120253, 16777987}, {120254, 16778243}, {120255, 16778499}, + {120256, 16778755}, {120257, 16779011}, {120258, 16779267}, {120259, 16779523}, + {120260, 16779779}, {120261, 16780035}, {120262, 16780291}, {120263, 16780547}, + {120264, 16780803}, {120265, 16781059}, {120266, 16781315}, {120267, 16781571}, + {120268, 16781827}, {120269, 16782083}, {120270, 16782339}, {120271, 16782595}, + {120272, 16782851}, {120273, 16783107}, {120274, 16783363}, {120275, 16783619}, + {120276, 16777219}, {120277, 16777475}, {120278, 16777731}, {120279, 16777987}, + {120280, 16778243}, {120281, 16778499}, {120282, 16778755}, {120283, 16779011}, + {120284, 16779267}, {120285, 16779523}, {120286, 16779779}, {120287, 16780035}, + {120288, 16780291}, {120289, 16780547}, {120290, 16780803}, {120291, 16781059}, + {120292, 16781315}, {120293, 16781571}, {120294, 16781827}, {120295, 16782083}, + {120296, 16782339}, {120297, 16782595}, {120298, 16782851}, {120299, 16783107}, + {120300, 16783363}, {120301, 16783619}, {120302, 16777219}, {120303, 16777475}, + {120304, 16777731}, {120305, 16777987}, {120306, 16778243}, {120307, 16778499}, + {120308, 16778755}, {120309, 16779011}, {120310, 16779267}, {120311, 16779523}, + {120312, 16779779}, {120313, 16780035}, {120314, 16780291}, {120315, 16780547}, + {120316, 16780803}, {120317, 16781059}, {120318, 16781315}, {120319, 16781571}, + {120320, 16781827}, {120321, 16782083}, {120322, 16782339}, {120323, 16782595}, + {120324, 16782851}, {120325, 16783107}, {120326, 16783363}, {120327, 16783619}, + {120328, 16777219}, {120329, 16777475}, {120330, 16777731}, {120331, 16777987}, + {120332, 16778243}, {120333, 16778499}, {120334, 16778755}, {120335, 16779011}, + {120336, 16779267}, {120337, 16779523}, {120338, 16779779}, {120339, 16780035}, + {120340, 16780291}, {120341, 16780547}, {120342, 16780803}, {120343, 16781059}, + {120344, 16781315}, {120345, 16781571}, {120346, 16781827}, {120347, 16782083}, + {120348, 16782339}, {120349, 16782595}, {120350, 16782851}, {120351, 16783107}, + {120352, 16783363}, {120353, 16783619}, {120354, 16777219}, {120355, 16777475}, + {120356, 16777731}, {120357, 16777987}, {120358, 16778243}, {120359, 16778499}, + {120360, 16778755}, {120361, 16779011}, {120362, 16779267}, {120363, 16779523}, + {120364, 16779779}, {120365, 16780035}, {120366, 16780291}, {120367, 16780547}, + {120368, 16780803}, {120369, 16781059}, {120370, 16781315}, {120371, 16781571}, + {120372, 16781827}, {120373, 16782083}, {120374, 16782339}, {120375, 16782595}, + {120376, 16782851}, {120377, 16783107}, {120378, 16783363}, {120379, 16783619}, + {120380, 16777219}, {120381, 16777475}, {120382, 16777731}, {120383, 16777987}, + {120384, 16778243}, {120385, 16778499}, {120386, 16778755}, {120387, 16779011}, + {120388, 16779267}, {120389, 16779523}, {120390, 16779779}, {120391, 16780035}, + {120392, 16780291}, {120393, 16780547}, {120394, 16780803}, {120395, 16781059}, + {120396, 16781315}, {120397, 16781571}, {120398, 16781827}, {120399, 16782083}, + {120400, 16782339}, {120401, 16782595}, {120402, 16782851}, {120403, 16783107}, + {120404, 16783363}, {120405, 16783619}, {120406, 16777219}, {120407, 16777475}, + {120408, 16777731}, {120409, 16777987}, {120410, 16778243}, {120411, 16778499}, + {120412, 16778755}, {120413, 16779011}, {120414, 16779267}, {120415, 16779523}, + {120416, 16779779}, {120417, 16780035}, {120418, 16780291}, {120419, 16780547}, + {120420, 16780803}, {120421, 16781059}, {120422, 16781315}, {120423, 16781571}, + {120424, 16781827}, {120425, 16782083}, {120426, 16782339}, {120427, 16782595}, + {120428, 16782851}, {120429, 16783107}, {120430, 16783363}, {120431, 16783619}, + {120432, 16777219}, {120433, 16777475}, {120434, 16777731}, {120435, 16777987}, + {120436, 16778243}, {120437, 16778499}, {120438, 16778755}, {120439, 16779011}, + {120440, 16779267}, {120441, 16779523}, {120442, 16779779}, {120443, 16780035}, + {120444, 16780291}, {120445, 16780547}, {120446, 16780803}, {120447, 16781059}, + {120448, 16781315}, {120449, 16781571}, {120450, 16781827}, {120451, 16782083}, + {120452, 16782339}, {120453, 16782595}, {120454, 16782851}, {120455, 16783107}, + {120456, 16783363}, {120457, 16783619}, {120458, 16777219}, {120459, 16777475}, + {120460, 16777731}, {120461, 16777987}, {120462, 16778243}, {120463, 16778499}, + {120464, 16778755}, {120465, 16779011}, {120466, 16779267}, {120467, 16779523}, + {120468, 16779779}, {120469, 16780035}, {120470, 16780291}, {120471, 16780547}, + {120472, 16780803}, {120473, 16781059}, {120474, 16781315}, {120475, 16781571}, + {120476, 16781827}, {120477, 16782083}, {120478, 16782339}, {120479, 16782595}, + {120480, 16782851}, {120481, 16783107}, {120482, 16783363}, {120483, 16783619}, + {120484, 17961731}, {120485, 17961987}, {120486, 2}, {120488, 16851715}, + {120489, 16851971}, {120490, 16852227}, {120491, 16852483}, {120492, 16852739}, + {120493, 16852995}, {120494, 16853251}, {120495, 16853507}, {120496, 16846851}, + {120497, 16853763}, {120498, 16854019}, {120499, 16786179}, {120500, 16854275}, + {120501, 16854531}, {120502, 16854787}, {120503, 16855043}, {120504, 16855299}, + {120505, 16853507}, {120506, 16855555}, {120507, 16855811}, {120508, 16856067}, + {120509, 16856323}, {120510, 16856579}, {120511, 16856835}, {120512, 16857091}, + {120513, 17962243}, {120514, 16851715}, {120515, 16851971}, {120516, 16852227}, + {120517, 16852483}, {120518, 16852739}, {120519, 16852995}, {120520, 16853251}, + {120521, 16853507}, {120522, 16846851}, {120523, 16853763}, {120524, 16854019}, + {120525, 16786179}, {120526, 16854275}, {120527, 16854531}, {120528, 16854787}, + {120529, 16855043}, {120530, 16855299}, {120531, 16855555}, {120533, 16855811}, + {120534, 16856067}, {120535, 16856323}, {120536, 16856579}, {120537, 16856835}, + {120538, 16857091}, {120539, 17962499}, {120540, 16852739}, {120541, 16853507}, + {120542, 16853763}, {120543, 16856323}, {120544, 16855299}, {120545, 16855043}, + {120546, 16851715}, {120547, 16851971}, {120548, 16852227}, {120549, 16852483}, + {120550, 16852739}, {120551, 16852995}, {120552, 16853251}, {120553, 16853507}, + {120554, 16846851}, {120555, 16853763}, {120556, 16854019}, {120557, 16786179}, + {120558, 16854275}, {120559, 16854531}, {120560, 16854787}, {120561, 16855043}, + {120562, 16855299}, {120563, 16853507}, {120564, 16855555}, {120565, 16855811}, + {120566, 16856067}, {120567, 16856323}, {120568, 16856579}, {120569, 16856835}, + {120570, 16857091}, {120571, 17962243}, {120572, 16851715}, {120573, 16851971}, + {120574, 16852227}, {120575, 16852483}, {120576, 16852739}, {120577, 16852995}, + {120578, 16853251}, {120579, 16853507}, {120580, 16846851}, {120581, 16853763}, + {120582, 16854019}, {120583, 16786179}, {120584, 16854275}, {120585, 16854531}, + {120586, 16854787}, {120587, 16855043}, {120588, 16855299}, {120589, 16855555}, + {120591, 16855811}, {120592, 16856067}, {120593, 16856323}, {120594, 16856579}, + {120595, 16856835}, {120596, 16857091}, {120597, 17962499}, {120598, 16852739}, + {120599, 16853507}, {120600, 16853763}, {120601, 16856323}, {120602, 16855299}, + {120603, 16855043}, {120604, 16851715}, {120605, 16851971}, {120606, 16852227}, + {120607, 16852483}, {120608, 16852739}, {120609, 16852995}, {120610, 16853251}, + {120611, 16853507}, {120612, 16846851}, {120613, 16853763}, {120614, 16854019}, + {120615, 16786179}, {120616, 16854275}, {120617, 16854531}, {120618, 16854787}, + {120619, 16855043}, {120620, 16855299}, {120621, 16853507}, {120622, 16855555}, + {120623, 16855811}, {120624, 16856067}, {120625, 16856323}, {120626, 16856579}, + {120627, 16856835}, {120628, 16857091}, {120629, 17962243}, {120630, 16851715}, + {120631, 16851971}, {120632, 16852227}, {120633, 16852483}, {120634, 16852739}, + {120635, 16852995}, {120636, 16853251}, {120637, 16853507}, {120638, 16846851}, + {120639, 16853763}, {120640, 16854019}, {120641, 16786179}, {120642, 16854275}, + {120643, 16854531}, {120644, 16854787}, {120645, 16855043}, {120646, 16855299}, + {120647, 16855555}, {120649, 16855811}, {120650, 16856067}, {120651, 16856323}, + {120652, 16856579}, {120653, 16856835}, {120654, 16857091}, {120655, 17962499}, + {120656, 16852739}, {120657, 16853507}, {120658, 16853763}, {120659, 16856323}, + {120660, 16855299}, {120661, 16855043}, {120662, 16851715}, {120663, 16851971}, + {120664, 16852227}, {120665, 16852483}, {120666, 16852739}, {120667, 16852995}, + {120668, 16853251}, {120669, 16853507}, {120670, 16846851}, {120671, 16853763}, + {120672, 16854019}, {120673, 16786179}, {120674, 16854275}, {120675, 16854531}, + {120676, 16854787}, {120677, 16855043}, {120678, 16855299}, {120679, 16853507}, + {120680, 16855555}, {120681, 16855811}, {120682, 16856067}, {120683, 16856323}, + {120684, 16856579}, {120685, 16856835}, {120686, 16857091}, {120687, 17962243}, + {120688, 16851715}, {120689, 16851971}, {120690, 16852227}, {120691, 16852483}, + {120692, 16852739}, {120693, 16852995}, {120694, 16853251}, {120695, 16853507}, + {120696, 16846851}, {120697, 16853763}, {120698, 16854019}, {120699, 16786179}, + {120700, 16854275}, {120701, 16854531}, {120702, 16854787}, {120703, 16855043}, + {120704, 16855299}, {120705, 16855555}, {120707, 16855811}, {120708, 16856067}, + {120709, 16856323}, {120710, 16856579}, {120711, 16856835}, {120712, 16857091}, + {120713, 17962499}, {120714, 16852739}, {120715, 16853507}, {120716, 16853763}, + {120717, 16856323}, {120718, 16855299}, {120719, 16855043}, {120720, 16851715}, + {120721, 16851971}, {120722, 16852227}, {120723, 16852483}, {120724, 16852739}, + {120725, 16852995}, {120726, 16853251}, {120727, 16853507}, {120728, 16846851}, + {120729, 16853763}, {120730, 16854019}, {120731, 16786179}, {120732, 16854275}, + {120733, 16854531}, {120734, 16854787}, {120735, 16855043}, {120736, 16855299}, + {120737, 16853507}, {120738, 16855555}, {120739, 16855811}, {120740, 16856067}, + {120741, 16856323}, {120742, 16856579}, {120743, 16856835}, {120744, 16857091}, + {120745, 17962243}, {120746, 16851715}, {120747, 16851971}, {120748, 16852227}, + {120749, 16852483}, {120750, 16852739}, {120751, 16852995}, {120752, 16853251}, + {120753, 16853507}, {120754, 16846851}, {120755, 16853763}, {120756, 16854019}, + {120757, 16786179}, {120758, 16854275}, {120759, 16854531}, {120760, 16854787}, + {120761, 16855043}, {120762, 16855299}, {120763, 16855555}, {120765, 16855811}, + {120766, 16856067}, {120767, 16856323}, {120768, 16856579}, {120769, 16856835}, + {120770, 16857091}, {120771, 17962499}, {120772, 16852739}, {120773, 16853507}, + {120774, 16853763}, {120775, 16856323}, {120776, 16855299}, {120777, 16855043}, + {120778, 16858627}, {120780, 2}, {120782, 17045507}, {120783, 16786947}, + {120784, 16785155}, {120785, 16785411}, {120786, 16787715}, {120787, 17045763}, + {120788, 17046019}, {120789, 17046275}, {120790, 17046531}, {120791, 17046787}, + {120792, 17045507}, {120793, 16786947}, {120794, 16785155}, {120795, 16785411}, + {120796, 16787715}, {120797, 17045763}, {120798, 17046019}, {120799, 17046275}, + {120800, 17046531}, {120801, 17046787}, {120802, 17045507}, {120803, 16786947}, + {120804, 16785155}, {120805, 16785411}, {120806, 16787715}, {120807, 17045763}, + {120808, 17046019}, {120809, 17046275}, {120810, 17046531}, {120811, 17046787}, + {120812, 17045507}, {120813, 16786947}, {120814, 16785155}, {120815, 16785411}, + {120816, 16787715}, {120817, 17045763}, {120818, 17046019}, {120819, 17046275}, + {120820, 17046531}, {120821, 17046787}, {120822, 17045507}, {120823, 16786947}, + {120824, 16785155}, {120825, 16785411}, {120826, 16787715}, {120827, 17045763}, + {120828, 17046019}, {120829, 17046275}, {120830, 17046531}, {120831, 17046787}, + {120832, 1}, {121484, 2}, {121499, 1}, {121504, 2}, + {121505, 1}, {121520, 2}, {122624, 1}, {122655, 2}, + {122661, 1}, {122667, 2}, {122880, 1}, {122887, 2}, + {122888, 1}, {122905, 2}, {122907, 1}, {122914, 2}, + {122915, 1}, {122917, 2}, {122918, 1}, {122923, 2}, + {122928, 16866563}, {122929, 16866819}, {122930, 16867075}, {122931, 16867331}, + {122932, 16867587}, {122933, 16867843}, {122934, 16868099}, {122935, 16868355}, + {122936, 16868611}, {122937, 16869123}, {122938, 16869379}, {122939, 16869635}, + {122940, 16870147}, {122941, 16870403}, {122942, 16870659}, {122943, 16870915}, + {122944, 16871171}, {122945, 16871427}, {122946, 16871683}, {122947, 16871939}, + {122948, 16872195}, {122949, 16872451}, {122950, 16872707}, {122951, 16873475}, + {122952, 16873987}, {122953, 16874243}, {122954, 17505795}, {122955, 16889091}, + {122956, 16864003}, {122957, 16864515}, {122958, 16891139}, {122959, 16883715}, + {122960, 16886019}, {122961, 16866563}, {122962, 16866819}, {122963, 16867075}, + {122964, 16867331}, {122965, 16867587}, {122966, 16867843}, {122967, 16868099}, + {122968, 16868355}, {122969, 16868611}, {122970, 16869123}, {122971, 16869379}, + {122972, 16870147}, {122973, 16870403}, {122974, 16870915}, {122975, 16871427}, + {122976, 16871683}, {122977, 16871939}, {122978, 16872195}, {122979, 16872451}, + {122980, 16872707}, {122981, 16873219}, {122982, 16873475}, {122983, 16879875}, + {122984, 16864003}, {122985, 16863747}, {122986, 16866307}, {122987, 16883203}, + {122988, 17500931}, {122989, 16883971}, {122990, 2}, {123023, 1}, + {123024, 2}, {123136, 1}, {123181, 2}, {123184, 1}, + {123198, 2}, {123200, 1}, {123210, 2}, {123214, 1}, + {123216, 2}, {123536, 1}, {123567, 2}, {123584, 1}, + {123642, 2}, {123647, 1}, {123648, 2}, {124112, 1}, + {124154, 2}, {124368, 1}, {124411, 2}, {124415, 1}, + {124416, 2}, {124896, 1}, {124903, 2}, {124904, 1}, + {124908, 2}, {124909, 1}, {124911, 2}, {124912, 1}, + {124927, 2}, {124928, 1}, {125125, 2}, {125127, 1}, + {125143, 2}, {125184, 17962755}, {125185, 17963011}, {125186, 17963267}, + {125187, 17963523}, {125188, 17963779}, {125189, 17964035}, {125190, 17964291}, + {125191, 17964547}, {125192, 17964803}, {125193, 17965059}, {125194, 17965315}, + {125195, 17965571}, {125196, 17965827}, {125197, 17966083}, {125198, 17966339}, + {125199, 17966595}, {125200, 17966851}, {125201, 17967107}, {125202, 17967363}, + {125203, 17967619}, {125204, 17967875}, {125205, 17968131}, {125206, 17968387}, + {125207, 17968643}, {125208, 17968899}, {125209, 17969155}, {125210, 17969411}, + {125211, 17969667}, {125212, 17969923}, {125213, 17970179}, {125214, 17970435}, + {125215, 17970691}, {125216, 17970947}, {125217, 17971203}, {125218, 1}, + {125260, 2}, {125264, 1}, {125274, 2}, {125278, 1}, + {125280, 2}, {126065, 1}, {126133, 2}, {126209, 1}, + {126270, 2}, {126464, 16910595}, {126465, 17695235}, {126466, 17693443}, + {126467, 17846019}, {126468, 2}, {126469, 16911107}, {126470, 17743107}, + {126471, 17693955}, {126472, 17711619}, {126473, 16912131}, {126474, 17720323}, + {126475, 17722627}, {126476, 17694467}, {126477, 17729539}, {126478, 17706499}, + {126479, 17713155}, {126480, 17715203}, {126481, 17708547}, {126482, 17718275}, + {126483, 17736707}, {126484, 17756675}, {126485, 17698307}, {126486, 17701379}, + {126487, 17696515}, {126488, 17736195}, {126489, 17709571}, {126490, 17712643}, + {126491, 17714179}, {126492, 17971459}, {126493, 17684995}, {126494, 17971715}, + {126495, 17971971}, {126496, 2}, {126497, 17695235}, {126498, 17693443}, + {126499, 2}, {126500, 17732611}, {126501, 2}, {126503, 17693955}, + {126504, 2}, {126505, 16912131}, {126506, 17720323}, {126507, 17722627}, + {126508, 17694467}, {126509, 17729539}, {126510, 17706499}, {126511, 17713155}, + {126512, 17715203}, {126513, 17708547}, {126514, 17718275}, {126515, 2}, + {126516, 17756675}, {126517, 17698307}, {126518, 17701379}, {126519, 17696515}, + {126520, 2}, {126521, 17709571}, {126522, 2}, {126523, 17714179}, + {126524, 2}, {126530, 17693443}, {126531, 2}, {126535, 17693955}, + {126536, 2}, {126537, 16912131}, {126538, 2}, {126539, 17722627}, + {126540, 2}, {126541, 17729539}, {126542, 17706499}, {126543, 17713155}, + {126544, 2}, {126545, 17708547}, {126546, 17718275}, {126547, 2}, + {126548, 17756675}, {126549, 2}, {126551, 17696515}, {126552, 2}, + {126553, 17709571}, {126554, 2}, {126555, 17714179}, {126556, 2}, + {126557, 17684995}, {126558, 2}, {126559, 17971971}, {126560, 2}, + {126561, 17695235}, {126562, 17693443}, {126563, 2}, {126564, 17732611}, + {126565, 2}, {126567, 17693955}, {126568, 17711619}, {126569, 16912131}, + {126570, 17720323}, {126571, 2}, {126572, 17694467}, {126573, 17729539}, + {126574, 17706499}, {126575, 17713155}, {126576, 17715203}, {126577, 17708547}, + {126578, 17718275}, {126579, 2}, {126580, 17756675}, {126581, 17698307}, + {126582, 17701379}, {126583, 17696515}, {126584, 2}, {126585, 17709571}, + {126586, 17712643}, {126587, 17714179}, {126588, 17971459}, {126589, 2}, + {126590, 17971715}, {126591, 2}, {126592, 16910595}, {126593, 17695235}, + {126594, 17693443}, {126595, 17846019}, {126596, 17732611}, {126597, 16911107}, + {126598, 17743107}, {126599, 17693955}, {126600, 17711619}, {126601, 16912131}, + {126602, 2}, {126603, 17722627}, {126604, 17694467}, {126605, 17729539}, + {126606, 17706499}, {126607, 17713155}, {126608, 17715203}, {126609, 17708547}, + {126610, 17718275}, {126611, 17736707}, {126612, 17756675}, {126613, 17698307}, + {126614, 17701379}, {126615, 17696515}, {126616, 17736195}, {126617, 17709571}, + {126618, 17712643}, {126619, 17714179}, {126620, 2}, {126625, 17695235}, + {126626, 17693443}, {126627, 17846019}, {126628, 2}, {126629, 16911107}, + {126630, 17743107}, {126631, 17693955}, {126632, 17711619}, {126633, 16912131}, + {126634, 2}, {126635, 17722627}, {126636, 17694467}, {126637, 17729539}, + {126638, 17706499}, {126639, 17713155}, {126640, 17715203}, {126641, 17708547}, + {126642, 17718275}, {126643, 17736707}, {126644, 17756675}, {126645, 17698307}, + {126646, 17701379}, {126647, 17696515}, {126648, 17736195}, {126649, 17709571}, + {126650, 17712643}, {126651, 17714179}, {126652, 2}, {126704, 1}, + {126706, 2}, {126976, 1}, {127020, 2}, {127024, 1}, + {127124, 2}, {127136, 1}, {127151, 2}, {127153, 1}, + {127168, 2}, {127169, 1}, {127184, 2}, {127185, 1}, + {127222, 2}, {127233, 34749443}, {127234, 34749955}, {127235, 34750467}, + {127236, 34750979}, {127237, 34751491}, {127238, 34752003}, {127239, 34752515}, + {127240, 34753027}, {127241, 34753539}, {127242, 34754051}, {127243, 1}, + {127248, 50655491}, {127249, 50656259}, {127250, 50657027}, {127251, 50657795}, + {127252, 50658563}, {127253, 50659331}, {127254, 50660099}, {127255, 50660867}, + {127256, 50661635}, {127257, 50662403}, {127258, 50663171}, {127259, 50663939}, + {127260, 50664707}, {127261, 50665475}, {127262, 50666243}, {127263, 50667011}, + {127264, 50667779}, {127265, 50668547}, {127266, 50669315}, {127267, 50670083}, + {127268, 50670851}, {127269, 50671619}, {127270, 50672387}, {127271, 50673155}, + {127272, 50673923}, {127273, 50674691}, {127274, 51531779}, {127275, 16777731}, + {127276, 16781571}, {127277, 33554947}, {127278, 34755331}, {127279, 1}, + {127280, 16777219}, {127281, 16777475}, {127282, 16777731}, {127283, 16777987}, + {127284, 16778243}, {127285, 16778499}, {127286, 16778755}, {127287, 16779011}, + {127288, 16779267}, {127289, 16779523}, {127290, 16779779}, {127291, 16780035}, + {127292, 16780291}, {127293, 16780547}, {127294, 16780803}, {127295, 16781059}, + {127296, 16781315}, {127297, 16781571}, {127298, 16781827}, {127299, 16782083}, + {127300, 16782339}, {127301, 16782595}, {127302, 16782851}, {127303, 16783107}, + {127304, 16783363}, {127305, 16783619}, {127306, 34755843}, {127307, 34237187}, + {127308, 34756355}, {127309, 34756867}, {127310, 51534595}, {127311, 34758147}, + {127312, 1}, {127338, 34220035}, {127339, 34200067}, {127340, 34758659}, + {127341, 1}, {127376, 34759171}, {127377, 1}, {127406, 2}, + {127462, 1}, {127488, 34759683}, {127489, 34760195}, {127490, 17318403}, + {127491, 2}, {127504, 17168387}, {127505, 17983491}, {127506, 17983747}, + {127507, 17362179}, {127508, 17153795}, {127509, 17984003}, {127510, 17984259}, + {127511, 17235971}, {127512, 17984515}, {127513, 17984771}, {127514, 17985027}, + {127515, 17596163}, {127516, 17985283}, {127517, 17985539}, {127518, 17985795}, + {127519, 17986051}, {127520, 17986307}, {127521, 17986563}, {127522, 17177603}, + {127523, 17986819}, {127524, 17987075}, {127525, 17987331}, {127526, 17987587}, + {127527, 17987843}, {127528, 17988099}, {127529, 17152259}, {127530, 17233923}, + {127531, 17988355}, {127532, 17299203}, {127533, 17234691}, {127534, 17299459}, + {127535, 17988611}, {127536, 17191939}, {127537, 17988867}, {127538, 17989123}, + {127539, 17989379}, {127540, 17989635}, {127541, 17989891}, {127542, 17274883}, + {127543, 17170947}, {127544, 17990147}, {127545, 17990403}, {127546, 17990659}, + {127547, 17990915}, {127548, 2}, {127552, 51545603}, {127553, 51546371}, + {127554, 51547139}, {127555, 51547907}, {127556, 51548675}, {127557, 51549443}, + {127558, 51550211}, {127559, 51550979}, {127560, 51551747}, {127561, 2}, + {127568, 17998083}, {127569, 17998339}, {127570, 2}, {127584, 1}, + {127590, 2}, {127744, 1}, {128728, 2}, {128732, 1}, + {128749, 2}, {128752, 1}, {128765, 2}, {128768, 1}, + {128887, 2}, {128891, 1}, {128986, 2}, {128992, 1}, + {129004, 2}, {129008, 1}, {129009, 2}, {129024, 1}, + {129036, 2}, {129040, 1}, {129096, 2}, {129104, 1}, + {129114, 2}, {129120, 1}, {129160, 2}, {129168, 1}, + {129198, 2}, {129200, 1}, {129212, 2}, {129216, 1}, + {129218, 2}, {129280, 1}, {129620, 2}, {129632, 1}, + {129646, 2}, {129648, 1}, {129661, 2}, {129664, 1}, + {129674, 2}, {129679, 1}, {129735, 2}, {129742, 1}, + {129757, 2}, {129759, 1}, {129770, 2}, {129776, 1}, + {129785, 2}, {129792, 1}, {129939, 2}, {129940, 1}, + {130032, 17045507}, {130033, 16786947}, {130034, 16785155}, {130035, 16785411}, + {130036, 16787715}, {130037, 17045763}, {130038, 17046019}, {130039, 17046275}, + {130040, 17046531}, {130041, 17046787}, {130042, 2}, {131072, 1}, {173792, 2}, {173824, 1}, {177978, 2}, {177984, 1}, {178206, 2}, {178208, 1}, {183970, 2}, {183984, 1}, - {191457, 2}, {191472, 1}, {192094, 2}, {194560, 17981699}, - {194561, 17981955}, {194562, 17982211}, {194563, 17982467}, {194564, 17982723}, - {194565, 17608195}, {194566, 17982979}, {194567, 17983235}, {194568, 17983491}, - {194569, 17983747}, {194570, 17608451}, {194571, 17984003}, {194572, 17984259}, - {194573, 17984515}, {194574, 17608707}, {194575, 17984771}, {194576, 17985027}, - {194577, 17985283}, {194578, 17985539}, {194579, 17985795}, {194580, 17986051}, - {194581, 17968899}, {194582, 17986307}, {194583, 17986563}, {194584, 17986819}, - {194585, 17987075}, {194586, 17987331}, {194587, 17622787}, {194588, 17987587}, - {194589, 17145603}, {194590, 17987843}, {194591, 17988099}, {194592, 17988355}, - {194593, 17988611}, {194594, 17973507}, {194595, 17988867}, {194596, 17989123}, - {194597, 17624067}, {194598, 17608963}, {194599, 17609219}, {194600, 17624323}, - {194601, 17989379}, {194602, 17989635}, {194603, 17562627}, {194604, 17989891}, - {194605, 17609475}, {194606, 17990147}, {194607, 17990403}, {194608, 17990659}, - {194609, 17990915}, {194612, 17991171}, {194613, 17991427}, {194614, 17991683}, - {194615, 17991939}, {194616, 17992195}, {194617, 17992451}, {194618, 17992707}, - {194619, 17992963}, {194620, 17993219}, {194621, 17993475}, {194622, 17993731}, - {194623, 17993987}, {194624, 17994243}, {194625, 17994499}, {194626, 17994755}, - {194627, 17995011}, {194628, 17995267}, {194629, 17995523}, {194631, 17624835}, - {194632, 17995779}, {194633, 17996035}, {194634, 17996291}, {194635, 17996547}, - {194636, 17609987}, {194637, 17996803}, {194638, 17997059}, {194639, 17997315}, - {194640, 17599747}, {194641, 17997571}, {194642, 17997827}, {194643, 17998083}, - {194644, 17998339}, {194645, 17998595}, {194646, 17998851}, {194647, 17999107}, - {194648, 17999363}, {194649, 17999619}, {194650, 17999875}, {194651, 18000131}, - {194652, 18000387}, {194653, 17967107}, {194654, 18000643}, {194655, 18000899}, - {194656, 18001155}, {194657, 18001411}, {194658, 18001667}, {194659, 18001923}, - {194660, 18002179}, {194661, 18002435}, {194662, 18002691}, {194663, 18002947}, - {194664, 2}, {194665, 18003203}, {194666, 18003459}, {194668, 18003715}, - {194669, 18003971}, {194670, 18004227}, {194671, 17561603}, {194672, 18004483}, - {194673, 18004739}, {194674, 18004995}, {194675, 18005251}, {194676, 2}, - {194677, 17152259}, {194678, 18005507}, {194679, 18005763}, {194680, 17152771}, - {194681, 18006019}, {194682, 18006275}, {194683, 18006531}, {194684, 18006787}, - {194685, 18007043}, {194686, 18007299}, {194687, 18007555}, {194688, 18007811}, - {194689, 18008067}, {194690, 18008323}, {194691, 18008579}, {194692, 18008835}, - {194693, 18009091}, {194694, 18009347}, {194695, 18009603}, {194696, 18009859}, - {194697, 18010115}, {194698, 18010371}, {194699, 18010627}, {194700, 18010883}, - {194701, 18011139}, {194702, 17548291}, {194703, 18011395}, {194704, 17155331}, - {194705, 18011651}, {194707, 18011907}, {194708, 18012163}, {194710, 18012419}, - {194711, 18012675}, {194712, 18012931}, {194713, 18013187}, {194714, 18013443}, - {194715, 18013699}, {194716, 18013955}, {194717, 18014211}, {194718, 18014467}, - {194719, 18014723}, {194720, 18014979}, {194721, 18015235}, {194722, 18015491}, - {194723, 17611267}, {194724, 18015747}, {194725, 18016003}, {194726, 18016259}, - {194727, 18016515}, {194728, 17627907}, {194729, 18016515}, {194730, 18016771}, - {194731, 17611779}, {194732, 18017027}, {194733, 18017283}, {194734, 18017539}, - {194735, 18017795}, {194736, 17612035}, {194737, 17541379}, {194738, 17414659}, - {194739, 18018051}, {194740, 18018307}, {194741, 18018563}, {194742, 18018819}, - {194743, 18019075}, {194744, 18019331}, {194745, 18019587}, {194746, 18019843}, - {194747, 18020099}, {194748, 18020355}, {194749, 18020611}, {194750, 18020867}, - {194751, 18021123}, {194752, 18021379}, {194753, 18021635}, {194754, 18021891}, - {194755, 18022147}, {194756, 18022403}, {194757, 18022659}, {194758, 18022915}, - {194759, 18023171}, {194760, 17612291}, {194761, 18023427}, {194762, 18023683}, - {194763, 18023939}, {194764, 18024195}, {194765, 18024451}, {194766, 18024707}, - {194767, 17612803}, {194768, 18024963}, {194769, 18025219}, {194770, 18025475}, - {194771, 18025731}, {194772, 18025987}, {194773, 18026243}, {194774, 18026499}, - {194775, 18026755}, {194776, 17548547}, {194777, 17629955}, {194778, 18027011}, - {194779, 18027267}, {194780, 18027523}, {194781, 18027779}, {194782, 18028035}, - {194783, 18028291}, {194784, 18028547}, {194785, 18028803}, {194786, 17613059}, - {194787, 18029059}, {194788, 18029315}, {194789, 18029571}, {194790, 18029827}, - {194791, 17640707}, {194792, 18030083}, {194793, 18030339}, {194794, 18030595}, - {194795, 18030851}, {194796, 18031107}, {194797, 18031363}, {194798, 18031619}, - {194799, 18031875}, {194800, 18032131}, {194801, 18032387}, {194802, 18032643}, - {194803, 18032899}, {194804, 18033155}, {194805, 17565955}, {194806, 18033411}, - {194807, 18033667}, {194808, 18033923}, {194809, 18034179}, {194810, 18034435}, - {194811, 18034691}, {194812, 18034947}, {194813, 18035203}, {194814, 18035459}, - {194815, 18035715}, {194816, 18035971}, {194817, 17613315}, {194818, 17586947}, - {194819, 18036227}, {194820, 18036483}, {194821, 18036739}, {194822, 18036995}, - {194823, 18037251}, {194824, 18037507}, {194825, 18037763}, {194826, 18038019}, - {194827, 17630723}, {194828, 18038275}, {194829, 18038531}, {194830, 18038787}, - {194831, 18039043}, {194832, 18039299}, {194833, 18039555}, {194834, 18039811}, - {194835, 18040067}, {194836, 17630979}, {194837, 18040323}, {194838, 18040579}, - {194839, 18040835}, {194840, 18041091}, {194841, 18041347}, {194842, 18041603}, - {194843, 18041859}, {194844, 18042115}, {194845, 18042371}, {194846, 18042627}, - {194847, 2}, {194848, 18042883}, {194849, 17631491}, {194850, 18043139}, - {194851, 18043395}, {194852, 18043651}, {194853, 18043907}, {194854, 18044163}, - {194855, 18044419}, {194856, 18044675}, {194857, 18044931}, {194858, 18045187}, - {194859, 18045443}, {194860, 18045699}, {194862, 18045955}, {194863, 18046211}, - {194864, 17632003}, {194865, 18046467}, {194866, 18046723}, {194867, 18046979}, - {194868, 18047235}, {194869, 18047491}, {194870, 18047747}, {194871, 18048003}, - {194872, 17562371}, {194873, 18048259}, {194874, 18048515}, {194875, 18048771}, - {194876, 18049027}, {194877, 18049283}, {194878, 18049539}, {194879, 18049795}, - {194880, 17633539}, {194881, 18050051}, {194882, 18050307}, {194883, 18050563}, - {194884, 18050819}, {194885, 18051075}, {194886, 18051331}, {194888, 17633795}, - {194889, 17641219}, {194890, 18051587}, {194891, 18051843}, {194892, 18052099}, - {194893, 18052355}, {194894, 18052611}, {194895, 17552899}, {194896, 17634307}, - {194897, 18052867}, {194898, 18053123}, {194899, 17615875}, {194900, 18053379}, - {194901, 18053635}, {194902, 17604867}, {194903, 18053891}, {194904, 18054147}, - {194905, 17616643}, {194906, 18054403}, {194907, 18054659}, {194908, 18054915}, - {194909, 18055171}, {194911, 2}, {194912, 18055427}, {194913, 18055683}, - {194914, 18055939}, {194915, 18056195}, {194916, 18056451}, {194917, 18056707}, - {194918, 18056963}, {194919, 18057219}, {194920, 18057475}, {194921, 18057731}, - {194922, 18057987}, {194923, 18058243}, {194924, 18058499}, {194925, 18058755}, - {194926, 18059011}, {194927, 18059267}, {194928, 18059523}, {194929, 18059779}, - {194930, 18060035}, {194931, 18060291}, {194932, 18060547}, {194933, 18060803}, - {194934, 18061059}, {194935, 18061315}, {194936, 18061571}, {194937, 18061827}, - {194938, 17618179}, {194939, 18062083}, {194940, 18062339}, {194941, 18062595}, - {194942, 18062851}, {194943, 18063107}, {194944, 18063363}, {194945, 18063619}, - {194946, 18063875}, {194947, 18064131}, {194948, 18064387}, {194949, 18064643}, - {194950, 18064899}, {194951, 18065155}, {194952, 18065411}, {194953, 18065667}, - {194954, 18065923}, {194955, 18011907}, {194956, 18066179}, {194957, 18066435}, - {194958, 18066691}, {194959, 18066947}, {194960, 18067203}, {194961, 18067459}, - {194962, 18067715}, {194963, 18067971}, {194964, 18068227}, {194965, 18068483}, - {194966, 18068739}, {194967, 18068995}, {194968, 17566723}, {194969, 18069251}, - {194970, 18069507}, {194971, 18069763}, {194972, 18070019}, {194973, 18070275}, - {194974, 18070531}, {194975, 17618947}, {194976, 18070787}, {194977, 18071043}, - {194978, 18071299}, {194979, 18071555}, {194980, 18071811}, {194981, 18072067}, - {194982, 18072323}, {194983, 18072579}, {194984, 18072835}, {194985, 18073091}, - {194986, 18073347}, {194987, 18073603}, {194988, 18073859}, {194989, 18074115}, - {194990, 18074371}, {194991, 18074627}, {194992, 18074883}, {194993, 18075139}, - {194994, 18075395}, {194995, 18075651}, {194996, 17551619}, {194997, 18075907}, - {194998, 18076163}, {194999, 18076419}, {195000, 18076675}, {195001, 18076931}, - {195002, 18077187}, {195003, 17636099}, {195004, 18077443}, {195005, 18077699}, - {195006, 18077955}, {195007, 2}, {195008, 18078211}, {195009, 18078467}, - {195010, 18078723}, {195011, 18078979}, {195012, 17178371}, {195013, 18079235}, - {195014, 18079491}, {195015, 18079747}, {195016, 18080003}, {195017, 18080259}, - {195018, 18080515}, {195019, 18080771}, {195020, 18081027}, {195021, 18081283}, - {195022, 18081539}, {195023, 18081795}, {195024, 17637379}, {195025, 17637635}, - {195026, 17180163}, {195027, 18082051}, {195028, 18082307}, {195029, 18082563}, - {195030, 18082819}, {195031, 18083075}, {195032, 18083331}, {195033, 18083587}, - {195034, 18083843}, {195035, 18084099}, {195036, 18084355}, {195037, 18084611}, - {195038, 18084867}, {195039, 17637891}, {195040, 18085123}, {195041, 18085379}, - {195042, 18085635}, {195043, 18085891}, {195044, 18086147}, {195045, 18086403}, - {195046, 18086659}, {195047, 18086915}, {195048, 18087171}, {195049, 18087427}, - {195050, 18087683}, {195051, 18087939}, {195052, 18088195}, {195053, 18088451}, - {195054, 18088707}, {195055, 18088963}, {195056, 18089219}, {195057, 18089475}, - {195058, 18089731}, {195059, 18089987}, {195060, 18090243}, {195061, 18090499}, - {195062, 18090755}, {195063, 18091011}, {195064, 18091267}, {195065, 18091523}, - {195066, 18091779}, {195067, 18092035}, {195068, 18092291}, {195069, 18092547}, - {195070, 17639427}, {195072, 18092803}, {195073, 18093059}, {195074, 18093315}, - {195075, 18093571}, {195076, 18093827}, {195077, 18094083}, {195078, 18094339}, - {195079, 18094595}, {195080, 18094851}, {195081, 18095107}, {195082, 17639683}, - {195083, 18095363}, {195084, 18095619}, {195085, 18095875}, {195086, 18096131}, - {195087, 18096387}, {195088, 18096643}, {195089, 18096899}, {195090, 18097155}, - {195091, 18097411}, {195092, 18097667}, {195093, 17192451}, {195094, 18097923}, - {195095, 17193475}, {195096, 18098179}, {195097, 18098435}, {195098, 18098691}, - {195099, 18098947}, {195100, 17194755}, {195101, 18099203}, {195102, 2}, + {191457, 2}, {191472, 1}, {192094, 2}, {194560, 17998595}, + {194561, 17998851}, {194562, 17999107}, {194563, 17999363}, {194564, 17999619}, + {194565, 17619971}, {194566, 17999875}, {194567, 18000131}, {194568, 18000387}, + {194569, 18000643}, {194570, 17620227}, {194571, 18000899}, {194572, 18001155}, + {194573, 18001411}, {194574, 17620483}, {194575, 18001667}, {194576, 18001923}, + {194577, 18002179}, {194578, 18002435}, {194579, 18002691}, {194580, 18002947}, + {194581, 17985795}, {194582, 18003203}, {194583, 18003459}, {194584, 18003715}, + {194585, 18003971}, {194586, 18004227}, {194587, 17634563}, {194588, 18004483}, + {194589, 17156355}, {194590, 18004739}, {194591, 18004995}, {194592, 18005251}, + {194593, 18005507}, {194594, 17990403}, {194595, 18005763}, {194596, 18006019}, + {194597, 17635843}, {194598, 17620739}, {194599, 17620995}, {194600, 17636099}, + {194601, 18006275}, {194602, 18006531}, {194603, 17574403}, {194604, 18006787}, + {194605, 17621251}, {194606, 18007043}, {194607, 18007299}, {194608, 18007555}, + {194609, 18007811}, {194612, 18008067}, {194613, 18008323}, {194614, 18008579}, + {194615, 18008835}, {194616, 18009091}, {194617, 18009347}, {194618, 18009603}, + {194619, 18009859}, {194620, 18010115}, {194621, 18010371}, {194622, 18010627}, + {194623, 18010883}, {194624, 18011139}, {194625, 18011395}, {194626, 18011651}, + {194627, 18011907}, {194628, 18012163}, {194629, 18012419}, {194631, 17636611}, + {194632, 18012675}, {194633, 18012931}, {194634, 18013187}, {194635, 18013443}, + {194636, 17621763}, {194637, 18013699}, {194638, 18013955}, {194639, 18014211}, + {194640, 17611523}, {194641, 18014467}, {194642, 18014723}, {194643, 18014979}, + {194644, 18015235}, {194645, 18015491}, {194646, 18015747}, {194647, 18016003}, + {194648, 18016259}, {194649, 18016515}, {194650, 18016771}, {194651, 18017027}, + {194652, 18017283}, {194653, 17984003}, {194654, 18017539}, {194655, 18017795}, + {194656, 18018051}, {194657, 18018307}, {194658, 18018563}, {194659, 18018819}, + {194660, 18019075}, {194661, 18019331}, {194662, 18019587}, {194663, 18019843}, + {194664, 18020099}, {194665, 18020355}, {194666, 18020611}, {194668, 18020867}, + {194669, 18021123}, {194670, 18021379}, {194671, 17573379}, {194672, 18021635}, + {194673, 18021891}, {194674, 18022147}, {194675, 18022403}, {194676, 18022659}, + {194677, 17163011}, {194678, 18022915}, {194679, 18023171}, {194680, 17163523}, + {194681, 18023427}, {194682, 18023683}, {194683, 18023939}, {194684, 18024195}, + {194685, 18024451}, {194686, 18024707}, {194687, 18024963}, {194688, 18025219}, + {194689, 18025475}, {194690, 18025731}, {194691, 18025987}, {194692, 18026243}, + {194693, 18026499}, {194694, 18026755}, {194695, 18027011}, {194696, 18027267}, + {194697, 18027523}, {194698, 18027779}, {194699, 18028035}, {194700, 18028291}, + {194701, 18028547}, {194702, 17560067}, {194703, 18028803}, {194704, 17166083}, + {194705, 18029059}, {194707, 18029315}, {194708, 18029571}, {194710, 18029827}, + {194711, 18030083}, {194712, 18030339}, {194713, 18030595}, {194714, 18030851}, + {194715, 18031107}, {194716, 18031363}, {194717, 18031619}, {194718, 18031875}, + {194719, 18032131}, {194720, 18032387}, {194721, 18032643}, {194722, 18032899}, + {194723, 17623043}, {194724, 18033155}, {194725, 18033411}, {194726, 18033667}, + {194727, 18033923}, {194728, 17639683}, {194729, 18033923}, {194730, 18034179}, + {194731, 17623555}, {194732, 18034435}, {194733, 18034691}, {194734, 18034947}, + {194735, 18035203}, {194736, 17623811}, {194737, 17553155}, {194738, 17425411}, + {194739, 18035459}, {194740, 18035715}, {194741, 18035971}, {194742, 18036227}, + {194743, 18036483}, {194744, 18036739}, {194745, 18036995}, {194746, 18037251}, + {194747, 18037507}, {194748, 18037763}, {194749, 18038019}, {194750, 18038275}, + {194751, 18038531}, {194752, 18038787}, {194753, 18039043}, {194754, 18039299}, + {194755, 18039555}, {194756, 18039811}, {194757, 18040067}, {194758, 18040323}, + {194759, 18040579}, {194760, 17624067}, {194761, 18040835}, {194762, 18041091}, + {194763, 18041347}, {194764, 18041603}, {194765, 18041859}, {194766, 18042115}, + {194767, 17624579}, {194768, 18042371}, {194769, 18042627}, {194770, 18042883}, + {194771, 18043139}, {194772, 18043395}, {194773, 18043651}, {194774, 18043907}, + {194775, 18044163}, {194776, 17560323}, {194777, 17641731}, {194778, 18044419}, + {194779, 18044675}, {194780, 18044931}, {194781, 18045187}, {194782, 18045443}, + {194783, 18045699}, {194784, 18045955}, {194785, 18046211}, {194786, 17624835}, + {194787, 18046467}, {194788, 18046723}, {194789, 18046979}, {194790, 18047235}, + {194791, 17652483}, {194792, 18047491}, {194793, 18047747}, {194794, 18048003}, + {194795, 18048259}, {194796, 18048515}, {194797, 18048771}, {194798, 18049027}, + {194799, 18049283}, {194800, 18049539}, {194801, 18049795}, {194802, 18050051}, + {194803, 18050307}, {194804, 18050563}, {194805, 17577731}, {194806, 18050819}, + {194807, 18051075}, {194808, 18051331}, {194809, 18051587}, {194810, 18051843}, + {194811, 18052099}, {194812, 18052355}, {194813, 18052611}, {194814, 18052867}, + {194815, 18053123}, {194816, 18053379}, {194817, 17625091}, {194818, 17598723}, + {194819, 18053635}, {194820, 18053891}, {194821, 18054147}, {194822, 18054403}, + {194823, 18054659}, {194824, 18054915}, {194825, 18055171}, {194826, 18055427}, + {194827, 17642499}, {194828, 18055683}, {194829, 18055939}, {194830, 18056195}, + {194831, 18056451}, {194832, 18056707}, {194833, 18056963}, {194834, 18057219}, + {194835, 18057475}, {194836, 17642755}, {194837, 18057731}, {194838, 18057987}, + {194839, 18058243}, {194840, 18058499}, {194841, 18058755}, {194842, 18059011}, + {194843, 18059267}, {194844, 18059523}, {194845, 18059779}, {194846, 18060035}, + {194847, 18060291}, {194848, 18060547}, {194849, 17643267}, {194850, 18060803}, + {194851, 18061059}, {194852, 18061315}, {194853, 18061571}, {194854, 18061827}, + {194855, 18062083}, {194856, 18062339}, {194857, 18062595}, {194858, 18062851}, + {194859, 18063107}, {194860, 18063363}, {194862, 18063619}, {194863, 18063875}, + {194864, 17643779}, {194865, 18064131}, {194866, 18064387}, {194867, 18064643}, + {194868, 18064899}, {194869, 18065155}, {194870, 18065411}, {194871, 18065667}, + {194872, 17574147}, {194873, 18065923}, {194874, 18066179}, {194875, 18066435}, + {194876, 18066691}, {194877, 18066947}, {194878, 18067203}, {194879, 18067459}, + {194880, 17645315}, {194881, 18067715}, {194882, 18067971}, {194883, 18068227}, + {194884, 18068483}, {194885, 18068739}, {194886, 18068995}, {194888, 17645571}, + {194889, 17652995}, {194890, 18069251}, {194891, 18069507}, {194892, 18069763}, + {194893, 18070019}, {194894, 18070275}, {194895, 17564675}, {194896, 17646083}, + {194897, 18070531}, {194898, 18070787}, {194899, 17627651}, {194900, 18071043}, + {194901, 18071299}, {194902, 17616643}, {194903, 18071555}, {194904, 18071811}, + {194905, 17628419}, {194906, 18072067}, {194907, 18072323}, {194908, 18072579}, + {194909, 18072835}, {194911, 18073091}, {194912, 18073347}, {194913, 18073603}, + {194914, 18073859}, {194915, 18074115}, {194916, 18074371}, {194917, 18074627}, + {194918, 18074883}, {194919, 18075139}, {194920, 18075395}, {194921, 18075651}, + {194922, 18075907}, {194923, 18076163}, {194924, 18076419}, {194925, 18076675}, + {194926, 18076931}, {194927, 18077187}, {194928, 18077443}, {194929, 18077699}, + {194930, 18077955}, {194931, 18078211}, {194932, 18078467}, {194933, 18078723}, + {194934, 18078979}, {194935, 18079235}, {194936, 18079491}, {194937, 18079747}, + {194938, 17629955}, {194939, 18080003}, {194940, 18080259}, {194941, 18080515}, + {194942, 18080771}, {194943, 18081027}, {194944, 18081283}, {194945, 18081539}, + {194946, 18081795}, {194947, 18082051}, {194948, 18082307}, {194949, 18082563}, + {194950, 18082819}, {194951, 18083075}, {194952, 18083331}, {194953, 18083587}, + {194954, 18083843}, {194955, 18029315}, {194956, 18084099}, {194957, 18084355}, + {194958, 18084611}, {194959, 18084867}, {194960, 18085123}, {194961, 18085379}, + {194962, 18085635}, {194963, 18085891}, {194964, 18086147}, {194965, 18086403}, + {194966, 18086659}, {194967, 18086915}, {194968, 17578499}, {194969, 18087171}, + {194970, 18087427}, {194971, 18087683}, {194972, 18087939}, {194973, 18088195}, + {194974, 18088451}, {194975, 17630723}, {194976, 18088707}, {194977, 18088963}, + {194978, 18089219}, {194979, 18089475}, {194980, 18089731}, {194981, 18089987}, + {194982, 18090243}, {194983, 18090499}, {194984, 18090755}, {194985, 18091011}, + {194986, 18091267}, {194987, 18091523}, {194988, 18091779}, {194989, 18092035}, + {194990, 18092291}, {194991, 18092547}, {194992, 18092803}, {194993, 18093059}, + {194994, 18093315}, {194995, 18093571}, {194996, 17563395}, {194997, 18093827}, + {194998, 18094083}, {194999, 18094339}, {195000, 18094595}, {195001, 18094851}, + {195002, 18095107}, {195003, 17647875}, {195004, 18095363}, {195005, 18095619}, + {195006, 18095875}, {195007, 18096131}, {195008, 18096387}, {195009, 18096643}, + {195010, 18096899}, {195011, 18097155}, {195012, 17189123}, {195013, 18097411}, + {195014, 18097667}, {195015, 18097923}, {195016, 18098179}, {195017, 18098435}, + {195018, 18098691}, {195019, 18098947}, {195020, 18099203}, {195021, 18099459}, + {195022, 18099715}, {195023, 18099971}, {195024, 17649155}, {195025, 17649411}, + {195026, 17190915}, {195027, 18100227}, {195028, 18100483}, {195029, 18100739}, + {195030, 18100995}, {195031, 18101251}, {195032, 18101507}, {195033, 18101763}, + {195034, 18102019}, {195035, 18102275}, {195036, 18102531}, {195037, 18102787}, + {195038, 18103043}, {195039, 17649667}, {195040, 18103299}, {195041, 18103555}, + {195042, 18103811}, {195043, 18104067}, {195044, 18104323}, {195045, 18104579}, + {195046, 18104835}, {195047, 18105091}, {195048, 18105347}, {195049, 18105603}, + {195050, 18105859}, {195051, 18106115}, {195052, 18106371}, {195053, 18106627}, + {195054, 18106883}, {195055, 18107139}, {195056, 18107395}, {195057, 18107651}, + {195058, 18107907}, {195059, 18108163}, {195060, 18108419}, {195061, 18108675}, + {195062, 18108931}, {195063, 18109187}, {195064, 18109443}, {195065, 18109699}, + {195066, 18109955}, {195067, 18110211}, {195068, 18110467}, {195069, 18110723}, + {195070, 17651203}, {195072, 18110979}, {195073, 18111235}, {195074, 18111491}, + {195075, 18111747}, {195076, 18112003}, {195077, 18112259}, {195078, 18112515}, + {195079, 18112771}, {195080, 18113027}, {195081, 18113283}, {195082, 17651459}, + {195083, 18113539}, {195084, 18113795}, {195085, 18114051}, {195086, 18114307}, + {195087, 18114563}, {195088, 18114819}, {195089, 18115075}, {195090, 18115331}, + {195091, 18115587}, {195092, 18115843}, {195093, 17203203}, {195094, 18116099}, + {195095, 17204227}, {195096, 18116355}, {195097, 18116611}, {195098, 18116867}, + {195099, 18117123}, {195100, 17205507}, {195101, 18117379}, {195102, 2}, {196608, 1}, {201547, 2}, {201552, 1}, {205744, 2}, {917760, 0}, {918000, 2} }; @@ -2753,30 +2796,6 @@ uint32_t find_range_index(uint32_t key) { return low == 0 ? 0 : low - 1; } -bool ascii_has_upper_case(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; - - uint64_t runner{0}; - - for (; i + 7 < length; i += 8) { - uint64_t word{}; - memcpy(&word, input + i, sizeof(word)); - runner |= (((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80); - } - if (i < length) { - uint64_t word{}; - memcpy(&word, input + i, length - i); - runner |= (((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80); - } - return runner != 0; -} - void ascii_map(char* input, size_t length) { auto broadcast = [](uint8_t v) -> uint64_t { return 0x101010101010101ull * v; @@ -7915,11 +7934,11 @@ void compose(std::u32string& input) { if (composition[1] != composition[0] && previous_ccc < ccc) { // Try finding a composition. - uint16_t left = composition[0]; - uint16_t right = composition[1]; + int left = composition[0]; + int right = composition[1]; while (left + 2 < right) { // mean without overflow - uint16_t middle = left + (((right - left) >> 1) & ~1); + int middle = left + (((right - left) >> 1) & ~1); if (composition_data[middle] <= input[input_count + 1]) { left = middle; } @@ -8002,6 +8021,10 @@ static constexpr int32_t adapt(int32_t d, int32_t n, bool firsttime) { } bool punycode_to_utf32(std::string_view input, std::u32string &out) { + // See https://github.com/whatwg/url/issues/803 + if (input.starts_with("xn--")) { + return false; + } int32_t written_out{0}; out.reserve(out.size() + input.size()); uint32_t n = initial_n; @@ -8058,11 +8081,13 @@ bool punycode_to_utf32(std::string_view input, std::u32string &out) { written_out++; ++i; } - return true; } bool verify_punycode(std::string_view input) { + if (input.starts_with("xn--")) { + return false; + } size_t written_out{0}; uint32_t n = initial_n; int32_t i = 0; @@ -8969,7 +8994,7 @@ inline static direction find_direction(uint32_t code_point) noexcept { inline static size_t find_last_not_of_nsm( const std::u32string_view label) noexcept { - for (int i = label.size() - 1; i >= 0; i--) + for (int i = static_cast(label.size() - 1); i >= 0; i--) if (find_direction(label[i]) != direction::NSM) return i; return std::u32string_view::npos; @@ -9519,6 +9544,7 @@ bool is_label_valid(const std::u32string_view label) { #include #include +#include namespace ada::idna { @@ -9561,8 +9587,7 @@ inline bool is_forbidden_domain_code_point(const char c) noexcept { } bool contains_forbidden_domain_code_point(std::string_view view) { - return ( - std::any_of(view.begin(), view.end(), is_forbidden_domain_code_point)); + return std::ranges::any_of(view, is_forbidden_domain_code_point); } // We return "" on error. @@ -9596,6 +9621,12 @@ static std::string from_ascii_to_ascii(std::string_view ut8_string) { if (!is_ok) { return error; } + // If the input is just ASCII, it should not have been encoded + // as punycode. + // https://github.com/whatwg/url/issues/760 + if (is_ascii(tmp_buffer)) { + return error; + } std::u32string post_map = ada::idna::map(tmp_buffer); if (tmp_buffer != post_map) { return error; @@ -9668,6 +9699,12 @@ std::string to_ascii(std::string_view ut8_string) { if (!is_ok) { return error; } + // If the input is just ASCII, it should not have been encoded + // as punycode. + // https://github.com/whatwg/url/issues/760 + if (is_ascii(tmp_buffer)) { + return error; + } std::u32string post_map = ada::idna::map(tmp_buffer); if (tmp_buffer != post_map) { return error; @@ -9773,7 +9810,7 @@ std::string to_unicode(std::string_view input) { #include /* begin file src/id_tables.cpp */ -// IDNA 15.1.0 +// IDNA 16.0.0 // clang-format off #ifndef ADA_IDNA_IDENTIFIER_TABLES_H @@ -9782,7 +9819,7 @@ std::string to_unicode(std::string_view input) { namespace ada::idna { -const uint32_t id_continue[1344][2] = +const uint32_t id_continue[1393][2] = { {48, 57}, {65, 90}, {95, 95}, {97, 122}, {170, 170}, {181, 181}, {183, 183}, {186, 186}, @@ -9807,7 +9844,7 @@ const uint32_t id_continue[1344][2] = {2048, 2069}, {2070, 2073}, {2074, 2074}, {2075, 2083}, {2084, 2084}, {2085, 2087}, {2088, 2088}, {2089, 2093}, {2112, 2136}, {2137, 2139}, {2144, 2154}, {2160, 2183}, - {2185, 2190}, {2200, 2207}, {2208, 2248}, {2249, 2249}, + {2185, 2190}, {2199, 2207}, {2208, 2248}, {2249, 2249}, {2250, 2273}, {2275, 2306}, {2307, 2307}, {2308, 2361}, {2362, 2362}, {2363, 2363}, {2364, 2364}, {2365, 2365}, {2366, 2368}, {2369, 2376}, {2377, 2380}, {2381, 2381}, @@ -9915,7 +9952,7 @@ const uint32_t id_continue[1344][2] = {7149, 7149}, {7150, 7150}, {7151, 7153}, {7154, 7155}, {7168, 7203}, {7204, 7211}, {7212, 7219}, {7220, 7221}, {7222, 7223}, {7232, 7241}, {7245, 7247}, {7248, 7257}, - {7258, 7287}, {7288, 7293}, {7296, 7304}, {7312, 7354}, + {7258, 7287}, {7288, 7293}, {7296, 7306}, {7312, 7354}, {7357, 7359}, {7376, 7378}, {7380, 7392}, {7393, 7393}, {7394, 7400}, {7401, 7404}, {7405, 7405}, {7406, 7411}, {7412, 7412}, {7413, 7414}, {7415, 7415}, {7416, 7417}, @@ -9951,8 +9988,8 @@ const uint32_t id_continue[1344][2] = {42623, 42623}, {42624, 42651}, {42652, 42653}, {42654, 42655}, {42656, 42725}, {42726, 42735}, {42736, 42737}, {42775, 42783}, {42786, 42863}, {42864, 42864}, {42865, 42887}, {42888, 42888}, - {42891, 42894}, {42895, 42895}, {42896, 42954}, {42960, 42961}, - {42963, 42963}, {42965, 42969}, {42994, 42996}, {42997, 42998}, + {42891, 42894}, {42895, 42895}, {42896, 42957}, {42960, 42961}, + {42963, 42963}, {42965, 42972}, {42994, 42996}, {42997, 42998}, {42999, 42999}, {43000, 43001}, {43002, 43002}, {43003, 43009}, {43010, 43010}, {43011, 43013}, {43014, 43014}, {43015, 43018}, {43019, 43019}, {43020, 43042}, {43043, 43044}, {43045, 43046}, @@ -9999,43 +10036,50 @@ const uint32_t id_continue[1344][2] = {66640, 66717}, {66720, 66729}, {66736, 66771}, {66776, 66811}, {66816, 66855}, {66864, 66915}, {66928, 66938}, {66940, 66954}, {66956, 66962}, {66964, 66965}, {66967, 66977}, {66979, 66993}, - {66995, 67001}, {67003, 67004}, {67072, 67382}, {67392, 67413}, - {67424, 67431}, {67456, 67461}, {67463, 67504}, {67506, 67514}, - {67584, 67589}, {67592, 67592}, {67594, 67637}, {67639, 67640}, - {67644, 67644}, {67647, 67669}, {67680, 67702}, {67712, 67742}, - {67808, 67826}, {67828, 67829}, {67840, 67861}, {67872, 67897}, - {67968, 68023}, {68030, 68031}, {68096, 68096}, {68097, 68099}, - {68101, 68102}, {68108, 68111}, {68112, 68115}, {68117, 68119}, - {68121, 68149}, {68152, 68154}, {68159, 68159}, {68192, 68220}, - {68224, 68252}, {68288, 68295}, {68297, 68324}, {68325, 68326}, - {68352, 68405}, {68416, 68437}, {68448, 68466}, {68480, 68497}, - {68608, 68680}, {68736, 68786}, {68800, 68850}, {68864, 68899}, - {68900, 68903}, {68912, 68921}, {69248, 69289}, {69291, 69292}, - {69296, 69297}, {69373, 69375}, {69376, 69404}, {69415, 69415}, - {69424, 69445}, {69446, 69456}, {69488, 69505}, {69506, 69509}, - {69552, 69572}, {69600, 69622}, {69632, 69632}, {69633, 69633}, - {69634, 69634}, {69635, 69687}, {69688, 69702}, {69734, 69743}, - {69744, 69744}, {69745, 69746}, {69747, 69748}, {69749, 69749}, - {69759, 69761}, {69762, 69762}, {69763, 69807}, {69808, 69810}, - {69811, 69814}, {69815, 69816}, {69817, 69818}, {69826, 69826}, - {69840, 69864}, {69872, 69881}, {69888, 69890}, {69891, 69926}, - {69927, 69931}, {69932, 69932}, {69933, 69940}, {69942, 69951}, - {69956, 69956}, {69957, 69958}, {69959, 69959}, {69968, 70002}, - {70003, 70003}, {70006, 70006}, {70016, 70017}, {70018, 70018}, - {70019, 70066}, {70067, 70069}, {70070, 70078}, {70079, 70080}, - {70081, 70084}, {70089, 70092}, {70094, 70094}, {70095, 70095}, - {70096, 70105}, {70106, 70106}, {70108, 70108}, {70144, 70161}, - {70163, 70187}, {70188, 70190}, {70191, 70193}, {70194, 70195}, - {70196, 70196}, {70197, 70197}, {70198, 70199}, {70206, 70206}, - {70207, 70208}, {70209, 70209}, {70272, 70278}, {70280, 70280}, - {70282, 70285}, {70287, 70301}, {70303, 70312}, {70320, 70366}, - {70367, 70367}, {70368, 70370}, {70371, 70378}, {70384, 70393}, - {70400, 70401}, {70402, 70403}, {70405, 70412}, {70415, 70416}, - {70419, 70440}, {70442, 70448}, {70450, 70451}, {70453, 70457}, - {70459, 70460}, {70461, 70461}, {70462, 70463}, {70464, 70464}, - {70465, 70468}, {70471, 70472}, {70475, 70477}, {70480, 70480}, - {70487, 70487}, {70493, 70497}, {70498, 70499}, {70502, 70508}, - {70512, 70516}, {70656, 70708}, {70709, 70711}, {70712, 70719}, + {66995, 67001}, {67003, 67004}, {67008, 67059}, {67072, 67382}, + {67392, 67413}, {67424, 67431}, {67456, 67461}, {67463, 67504}, + {67506, 67514}, {67584, 67589}, {67592, 67592}, {67594, 67637}, + {67639, 67640}, {67644, 67644}, {67647, 67669}, {67680, 67702}, + {67712, 67742}, {67808, 67826}, {67828, 67829}, {67840, 67861}, + {67872, 67897}, {67968, 68023}, {68030, 68031}, {68096, 68096}, + {68097, 68099}, {68101, 68102}, {68108, 68111}, {68112, 68115}, + {68117, 68119}, {68121, 68149}, {68152, 68154}, {68159, 68159}, + {68192, 68220}, {68224, 68252}, {68288, 68295}, {68297, 68324}, + {68325, 68326}, {68352, 68405}, {68416, 68437}, {68448, 68466}, + {68480, 68497}, {68608, 68680}, {68736, 68786}, {68800, 68850}, + {68864, 68899}, {68900, 68903}, {68912, 68921}, {68928, 68937}, + {68938, 68941}, {68942, 68942}, {68943, 68943}, {68944, 68965}, + {68969, 68973}, {68975, 68975}, {68976, 68997}, {69248, 69289}, + {69291, 69292}, {69296, 69297}, {69314, 69316}, {69372, 69375}, + {69376, 69404}, {69415, 69415}, {69424, 69445}, {69446, 69456}, + {69488, 69505}, {69506, 69509}, {69552, 69572}, {69600, 69622}, + {69632, 69632}, {69633, 69633}, {69634, 69634}, {69635, 69687}, + {69688, 69702}, {69734, 69743}, {69744, 69744}, {69745, 69746}, + {69747, 69748}, {69749, 69749}, {69759, 69761}, {69762, 69762}, + {69763, 69807}, {69808, 69810}, {69811, 69814}, {69815, 69816}, + {69817, 69818}, {69826, 69826}, {69840, 69864}, {69872, 69881}, + {69888, 69890}, {69891, 69926}, {69927, 69931}, {69932, 69932}, + {69933, 69940}, {69942, 69951}, {69956, 69956}, {69957, 69958}, + {69959, 69959}, {69968, 70002}, {70003, 70003}, {70006, 70006}, + {70016, 70017}, {70018, 70018}, {70019, 70066}, {70067, 70069}, + {70070, 70078}, {70079, 70080}, {70081, 70084}, {70089, 70092}, + {70094, 70094}, {70095, 70095}, {70096, 70105}, {70106, 70106}, + {70108, 70108}, {70144, 70161}, {70163, 70187}, {70188, 70190}, + {70191, 70193}, {70194, 70195}, {70196, 70196}, {70197, 70197}, + {70198, 70199}, {70206, 70206}, {70207, 70208}, {70209, 70209}, + {70272, 70278}, {70280, 70280}, {70282, 70285}, {70287, 70301}, + {70303, 70312}, {70320, 70366}, {70367, 70367}, {70368, 70370}, + {70371, 70378}, {70384, 70393}, {70400, 70401}, {70402, 70403}, + {70405, 70412}, {70415, 70416}, {70419, 70440}, {70442, 70448}, + {70450, 70451}, {70453, 70457}, {70459, 70460}, {70461, 70461}, + {70462, 70463}, {70464, 70464}, {70465, 70468}, {70471, 70472}, + {70475, 70477}, {70480, 70480}, {70487, 70487}, {70493, 70497}, + {70498, 70499}, {70502, 70508}, {70512, 70516}, {70528, 70537}, + {70539, 70539}, {70542, 70542}, {70544, 70581}, {70583, 70583}, + {70584, 70586}, {70587, 70592}, {70594, 70594}, {70597, 70597}, + {70599, 70602}, {70604, 70605}, {70606, 70606}, {70607, 70607}, + {70608, 70608}, {70609, 70609}, {70610, 70610}, {70611, 70611}, + {70625, 70626}, {70656, 70708}, {70709, 70711}, {70712, 70719}, {70720, 70721}, {70722, 70724}, {70725, 70725}, {70726, 70726}, {70727, 70730}, {70736, 70745}, {70750, 70750}, {70751, 70753}, {70784, 70831}, {70832, 70834}, {70835, 70840}, {70841, 70841}, @@ -10048,80 +10092,86 @@ const uint32_t id_continue[1344][2] = {71236, 71236}, {71248, 71257}, {71296, 71338}, {71339, 71339}, {71340, 71340}, {71341, 71341}, {71342, 71343}, {71344, 71349}, {71350, 71350}, {71351, 71351}, {71352, 71352}, {71360, 71369}, - {71424, 71450}, {71453, 71455}, {71456, 71457}, {71458, 71461}, - {71462, 71462}, {71463, 71467}, {71472, 71481}, {71488, 71494}, - {71680, 71723}, {71724, 71726}, {71727, 71735}, {71736, 71736}, - {71737, 71738}, {71840, 71903}, {71904, 71913}, {71935, 71942}, - {71945, 71945}, {71948, 71955}, {71957, 71958}, {71960, 71983}, - {71984, 71989}, {71991, 71992}, {71995, 71996}, {71997, 71997}, - {71998, 71998}, {71999, 71999}, {72000, 72000}, {72001, 72001}, - {72002, 72002}, {72003, 72003}, {72016, 72025}, {72096, 72103}, - {72106, 72144}, {72145, 72147}, {72148, 72151}, {72154, 72155}, - {72156, 72159}, {72160, 72160}, {72161, 72161}, {72163, 72163}, - {72164, 72164}, {72192, 72192}, {72193, 72202}, {72203, 72242}, - {72243, 72248}, {72249, 72249}, {72250, 72250}, {72251, 72254}, - {72263, 72263}, {72272, 72272}, {72273, 72278}, {72279, 72280}, - {72281, 72283}, {72284, 72329}, {72330, 72342}, {72343, 72343}, - {72344, 72345}, {72349, 72349}, {72368, 72440}, {72704, 72712}, - {72714, 72750}, {72751, 72751}, {72752, 72758}, {72760, 72765}, - {72766, 72766}, {72767, 72767}, {72768, 72768}, {72784, 72793}, - {72818, 72847}, {72850, 72871}, {72873, 72873}, {72874, 72880}, - {72881, 72881}, {72882, 72883}, {72884, 72884}, {72885, 72886}, - {72960, 72966}, {72968, 72969}, {72971, 73008}, {73009, 73014}, - {73018, 73018}, {73020, 73021}, {73023, 73029}, {73030, 73030}, - {73031, 73031}, {73040, 73049}, {73056, 73061}, {73063, 73064}, - {73066, 73097}, {73098, 73102}, {73104, 73105}, {73107, 73108}, - {73109, 73109}, {73110, 73110}, {73111, 73111}, {73112, 73112}, - {73120, 73129}, {73440, 73458}, {73459, 73460}, {73461, 73462}, - {73472, 73473}, {73474, 73474}, {73475, 73475}, {73476, 73488}, - {73490, 73523}, {73524, 73525}, {73526, 73530}, {73534, 73535}, - {73536, 73536}, {73537, 73537}, {73538, 73538}, {73552, 73561}, - {73648, 73648}, {73728, 74649}, {74752, 74862}, {74880, 75075}, - {77712, 77808}, {77824, 78895}, {78912, 78912}, {78913, 78918}, - {78919, 78933}, {82944, 83526}, {92160, 92728}, {92736, 92766}, + {71376, 71395}, {71424, 71450}, {71453, 71453}, {71454, 71454}, + {71455, 71455}, {71456, 71457}, {71458, 71461}, {71462, 71462}, + {71463, 71467}, {71472, 71481}, {71488, 71494}, {71680, 71723}, + {71724, 71726}, {71727, 71735}, {71736, 71736}, {71737, 71738}, + {71840, 71903}, {71904, 71913}, {71935, 71942}, {71945, 71945}, + {71948, 71955}, {71957, 71958}, {71960, 71983}, {71984, 71989}, + {71991, 71992}, {71995, 71996}, {71997, 71997}, {71998, 71998}, + {71999, 71999}, {72000, 72000}, {72001, 72001}, {72002, 72002}, + {72003, 72003}, {72016, 72025}, {72096, 72103}, {72106, 72144}, + {72145, 72147}, {72148, 72151}, {72154, 72155}, {72156, 72159}, + {72160, 72160}, {72161, 72161}, {72163, 72163}, {72164, 72164}, + {72192, 72192}, {72193, 72202}, {72203, 72242}, {72243, 72248}, + {72249, 72249}, {72250, 72250}, {72251, 72254}, {72263, 72263}, + {72272, 72272}, {72273, 72278}, {72279, 72280}, {72281, 72283}, + {72284, 72329}, {72330, 72342}, {72343, 72343}, {72344, 72345}, + {72349, 72349}, {72368, 72440}, {72640, 72672}, {72688, 72697}, + {72704, 72712}, {72714, 72750}, {72751, 72751}, {72752, 72758}, + {72760, 72765}, {72766, 72766}, {72767, 72767}, {72768, 72768}, + {72784, 72793}, {72818, 72847}, {72850, 72871}, {72873, 72873}, + {72874, 72880}, {72881, 72881}, {72882, 72883}, {72884, 72884}, + {72885, 72886}, {72960, 72966}, {72968, 72969}, {72971, 73008}, + {73009, 73014}, {73018, 73018}, {73020, 73021}, {73023, 73029}, + {73030, 73030}, {73031, 73031}, {73040, 73049}, {73056, 73061}, + {73063, 73064}, {73066, 73097}, {73098, 73102}, {73104, 73105}, + {73107, 73108}, {73109, 73109}, {73110, 73110}, {73111, 73111}, + {73112, 73112}, {73120, 73129}, {73440, 73458}, {73459, 73460}, + {73461, 73462}, {73472, 73473}, {73474, 73474}, {73475, 73475}, + {73476, 73488}, {73490, 73523}, {73524, 73525}, {73526, 73530}, + {73534, 73535}, {73536, 73536}, {73537, 73537}, {73538, 73538}, + {73552, 73561}, {73562, 73562}, {73648, 73648}, {73728, 74649}, + {74752, 74862}, {74880, 75075}, {77712, 77808}, {77824, 78895}, + {78912, 78912}, {78913, 78918}, {78919, 78933}, {78944, 82938}, + {82944, 83526}, {90368, 90397}, {90398, 90409}, {90410, 90412}, + {90413, 90415}, {90416, 90425}, {92160, 92728}, {92736, 92766}, {92768, 92777}, {92784, 92862}, {92864, 92873}, {92880, 92909}, {92912, 92916}, {92928, 92975}, {92976, 92982}, {92992, 92995}, - {93008, 93017}, {93027, 93047}, {93053, 93071}, {93760, 93823}, + {93008, 93017}, {93027, 93047}, {93053, 93071}, {93504, 93506}, + {93507, 93546}, {93547, 93548}, {93552, 93561}, {93760, 93823}, {93952, 94026}, {94031, 94031}, {94032, 94032}, {94033, 94087}, {94095, 94098}, {94099, 94111}, {94176, 94177}, {94179, 94179}, {94180, 94180}, {94192, 94193}, {94208, 100343}, {100352, 101589}, - {101632, 101640}, {110576, 110579}, {110581, 110587}, {110589, 110590}, + {101631, 101640}, {110576, 110579}, {110581, 110587}, {110589, 110590}, {110592, 110882}, {110898, 110898}, {110928, 110930}, {110933, 110933}, {110948, 110951}, {110960, 111355}, {113664, 113770}, {113776, 113788}, - {113792, 113800}, {113808, 113817}, {113821, 113822}, {118528, 118573}, - {118576, 118598}, {119141, 119142}, {119143, 119145}, {119149, 119154}, - {119163, 119170}, {119173, 119179}, {119210, 119213}, {119362, 119364}, - {119808, 119892}, {119894, 119964}, {119966, 119967}, {119970, 119970}, - {119973, 119974}, {119977, 119980}, {119982, 119993}, {119995, 119995}, - {119997, 120003}, {120005, 120069}, {120071, 120074}, {120077, 120084}, - {120086, 120092}, {120094, 120121}, {120123, 120126}, {120128, 120132}, - {120134, 120134}, {120138, 120144}, {120146, 120485}, {120488, 120512}, - {120514, 120538}, {120540, 120570}, {120572, 120596}, {120598, 120628}, - {120630, 120654}, {120656, 120686}, {120688, 120712}, {120714, 120744}, - {120746, 120770}, {120772, 120779}, {120782, 120831}, {121344, 121398}, - {121403, 121452}, {121461, 121461}, {121476, 121476}, {121499, 121503}, - {121505, 121519}, {122624, 122633}, {122634, 122634}, {122635, 122654}, - {122661, 122666}, {122880, 122886}, {122888, 122904}, {122907, 122913}, - {122915, 122916}, {122918, 122922}, {122928, 122989}, {123023, 123023}, - {123136, 123180}, {123184, 123190}, {123191, 123197}, {123200, 123209}, - {123214, 123214}, {123536, 123565}, {123566, 123566}, {123584, 123627}, - {123628, 123631}, {123632, 123641}, {124112, 124138}, {124139, 124139}, - {124140, 124143}, {124144, 124153}, {124896, 124902}, {124904, 124907}, - {124909, 124910}, {124912, 124926}, {124928, 125124}, {125136, 125142}, - {125184, 125251}, {125252, 125258}, {125259, 125259}, {125264, 125273}, - {126464, 126467}, {126469, 126495}, {126497, 126498}, {126500, 126500}, - {126503, 126503}, {126505, 126514}, {126516, 126519}, {126521, 126521}, - {126523, 126523}, {126530, 126530}, {126535, 126535}, {126537, 126537}, - {126539, 126539}, {126541, 126543}, {126545, 126546}, {126548, 126548}, - {126551, 126551}, {126553, 126553}, {126555, 126555}, {126557, 126557}, - {126559, 126559}, {126561, 126562}, {126564, 126564}, {126567, 126570}, - {126572, 126578}, {126580, 126583}, {126585, 126588}, {126590, 126590}, - {126592, 126601}, {126603, 126619}, {126625, 126627}, {126629, 126633}, - {126635, 126651}, {130032, 130041}, {131072, 173791}, {173824, 177977}, - {177984, 178205}, {178208, 183969}, {183984, 191456}, {191472, 192093}, - {194560, 195101}, {196608, 201546}, {201552, 205743}, {917760, 917999} + {113792, 113800}, {113808, 113817}, {113821, 113822}, {118000, 118009}, + {118528, 118573}, {118576, 118598}, {119141, 119142}, {119143, 119145}, + {119149, 119154}, {119163, 119170}, {119173, 119179}, {119210, 119213}, + {119362, 119364}, {119808, 119892}, {119894, 119964}, {119966, 119967}, + {119970, 119970}, {119973, 119974}, {119977, 119980}, {119982, 119993}, + {119995, 119995}, {119997, 120003}, {120005, 120069}, {120071, 120074}, + {120077, 120084}, {120086, 120092}, {120094, 120121}, {120123, 120126}, + {120128, 120132}, {120134, 120134}, {120138, 120144}, {120146, 120485}, + {120488, 120512}, {120514, 120538}, {120540, 120570}, {120572, 120596}, + {120598, 120628}, {120630, 120654}, {120656, 120686}, {120688, 120712}, + {120714, 120744}, {120746, 120770}, {120772, 120779}, {120782, 120831}, + {121344, 121398}, {121403, 121452}, {121461, 121461}, {121476, 121476}, + {121499, 121503}, {121505, 121519}, {122624, 122633}, {122634, 122634}, + {122635, 122654}, {122661, 122666}, {122880, 122886}, {122888, 122904}, + {122907, 122913}, {122915, 122916}, {122918, 122922}, {122928, 122989}, + {123023, 123023}, {123136, 123180}, {123184, 123190}, {123191, 123197}, + {123200, 123209}, {123214, 123214}, {123536, 123565}, {123566, 123566}, + {123584, 123627}, {123628, 123631}, {123632, 123641}, {124112, 124138}, + {124139, 124139}, {124140, 124143}, {124144, 124153}, {124368, 124397}, + {124398, 124399}, {124400, 124400}, {124401, 124410}, {124896, 124902}, + {124904, 124907}, {124909, 124910}, {124912, 124926}, {124928, 125124}, + {125136, 125142}, {125184, 125251}, {125252, 125258}, {125259, 125259}, + {125264, 125273}, {126464, 126467}, {126469, 126495}, {126497, 126498}, + {126500, 126500}, {126503, 126503}, {126505, 126514}, {126516, 126519}, + {126521, 126521}, {126523, 126523}, {126530, 126530}, {126535, 126535}, + {126537, 126537}, {126539, 126539}, {126541, 126543}, {126545, 126546}, + {126548, 126548}, {126551, 126551}, {126553, 126553}, {126555, 126555}, + {126557, 126557}, {126559, 126559}, {126561, 126562}, {126564, 126564}, + {126567, 126570}, {126572, 126578}, {126580, 126583}, {126585, 126588}, + {126590, 126590}, {126592, 126601}, {126603, 126619}, {126625, 126627}, + {126629, 126633}, {126635, 126651}, {130032, 130041}, {131072, 173791}, + {173824, 177977}, {177984, 178205}, {178208, 183969}, {183984, 191456}, + {191472, 192093}, {194560, 195101}, {196608, 201546}, {201552, 205743}, + {917760, 917999} }; -const uint32_t id_start[740][2] = +const uint32_t id_start[763][2] = { {65, 90}, {97, 122}, {170, 170}, {181, 181}, {186, 186}, {192, 214}, {216, 246}, {248, 442}, @@ -10184,7 +10234,7 @@ const uint32_t id_start[740][2] = {6528, 6571}, {6576, 6601}, {6656, 6678}, {6688, 6740}, {6823, 6823}, {6917, 6963}, {6981, 6988}, {7043, 7072}, {7086, 7087}, {7098, 7141}, {7168, 7203}, {7245, 7247}, - {7258, 7287}, {7288, 7293}, {7296, 7304}, {7312, 7354}, + {7258, 7287}, {7288, 7293}, {7296, 7306}, {7312, 7354}, {7357, 7359}, {7401, 7404}, {7406, 7411}, {7413, 7414}, {7418, 7418}, {7424, 7467}, {7468, 7530}, {7531, 7543}, {7544, 7544}, {7545, 7578}, {7579, 7615}, {7680, 7957}, @@ -10213,8 +10263,8 @@ const uint32_t id_start[740][2] = {42538, 42539}, {42560, 42605}, {42606, 42606}, {42623, 42623}, {42624, 42651}, {42652, 42653}, {42656, 42725}, {42726, 42735}, {42775, 42783}, {42786, 42863}, {42864, 42864}, {42865, 42887}, - {42888, 42888}, {42891, 42894}, {42895, 42895}, {42896, 42954}, - {42960, 42961}, {42963, 42963}, {42965, 42969}, {42994, 42996}, + {42888, 42888}, {42891, 42894}, {42895, 42895}, {42896, 42957}, + {42960, 42961}, {42963, 42963}, {42965, 42972}, {42994, 42996}, {42997, 42998}, {42999, 42999}, {43000, 43001}, {43002, 43002}, {43003, 43009}, {43011, 43013}, {43015, 43018}, {43020, 43042}, {43072, 43123}, {43138, 43187}, {43250, 43255}, {43259, 43259}, @@ -10244,16 +10294,18 @@ const uint32_t id_start[740][2] = {66640, 66717}, {66736, 66771}, {66776, 66811}, {66816, 66855}, {66864, 66915}, {66928, 66938}, {66940, 66954}, {66956, 66962}, {66964, 66965}, {66967, 66977}, {66979, 66993}, {66995, 67001}, - {67003, 67004}, {67072, 67382}, {67392, 67413}, {67424, 67431}, - {67456, 67461}, {67463, 67504}, {67506, 67514}, {67584, 67589}, - {67592, 67592}, {67594, 67637}, {67639, 67640}, {67644, 67644}, - {67647, 67669}, {67680, 67702}, {67712, 67742}, {67808, 67826}, - {67828, 67829}, {67840, 67861}, {67872, 67897}, {67968, 68023}, - {68030, 68031}, {68096, 68096}, {68112, 68115}, {68117, 68119}, - {68121, 68149}, {68192, 68220}, {68224, 68252}, {68288, 68295}, - {68297, 68324}, {68352, 68405}, {68416, 68437}, {68448, 68466}, - {68480, 68497}, {68608, 68680}, {68736, 68786}, {68800, 68850}, - {68864, 68899}, {69248, 69289}, {69296, 69297}, {69376, 69404}, + {67003, 67004}, {67008, 67059}, {67072, 67382}, {67392, 67413}, + {67424, 67431}, {67456, 67461}, {67463, 67504}, {67506, 67514}, + {67584, 67589}, {67592, 67592}, {67594, 67637}, {67639, 67640}, + {67644, 67644}, {67647, 67669}, {67680, 67702}, {67712, 67742}, + {67808, 67826}, {67828, 67829}, {67840, 67861}, {67872, 67897}, + {67968, 68023}, {68030, 68031}, {68096, 68096}, {68112, 68115}, + {68117, 68119}, {68121, 68149}, {68192, 68220}, {68224, 68252}, + {68288, 68295}, {68297, 68324}, {68352, 68405}, {68416, 68437}, + {68448, 68466}, {68480, 68497}, {68608, 68680}, {68736, 68786}, + {68800, 68850}, {68864, 68899}, {68938, 68941}, {68942, 68942}, + {68943, 68943}, {68944, 68965}, {68975, 68975}, {68976, 68997}, + {69248, 69289}, {69296, 69297}, {69314, 69316}, {69376, 69404}, {69415, 69415}, {69424, 69445}, {69488, 69505}, {69552, 69572}, {69600, 69622}, {69635, 69687}, {69745, 69746}, {69749, 69749}, {69763, 69807}, {69840, 69864}, {69891, 69926}, {69956, 69956}, @@ -10263,111 +10315,68 @@ const uint32_t id_start[740][2] = {70282, 70285}, {70287, 70301}, {70303, 70312}, {70320, 70366}, {70405, 70412}, {70415, 70416}, {70419, 70440}, {70442, 70448}, {70450, 70451}, {70453, 70457}, {70461, 70461}, {70480, 70480}, - {70493, 70497}, {70656, 70708}, {70727, 70730}, {70751, 70753}, - {70784, 70831}, {70852, 70853}, {70855, 70855}, {71040, 71086}, - {71128, 71131}, {71168, 71215}, {71236, 71236}, {71296, 71338}, - {71352, 71352}, {71424, 71450}, {71488, 71494}, {71680, 71723}, - {71840, 71903}, {71935, 71942}, {71945, 71945}, {71948, 71955}, - {71957, 71958}, {71960, 71983}, {71999, 71999}, {72001, 72001}, - {72096, 72103}, {72106, 72144}, {72161, 72161}, {72163, 72163}, - {72192, 72192}, {72203, 72242}, {72250, 72250}, {72272, 72272}, - {72284, 72329}, {72349, 72349}, {72368, 72440}, {72704, 72712}, + {70493, 70497}, {70528, 70537}, {70539, 70539}, {70542, 70542}, + {70544, 70581}, {70583, 70583}, {70609, 70609}, {70611, 70611}, + {70656, 70708}, {70727, 70730}, {70751, 70753}, {70784, 70831}, + {70852, 70853}, {70855, 70855}, {71040, 71086}, {71128, 71131}, + {71168, 71215}, {71236, 71236}, {71296, 71338}, {71352, 71352}, + {71424, 71450}, {71488, 71494}, {71680, 71723}, {71840, 71903}, + {71935, 71942}, {71945, 71945}, {71948, 71955}, {71957, 71958}, + {71960, 71983}, {71999, 71999}, {72001, 72001}, {72096, 72103}, + {72106, 72144}, {72161, 72161}, {72163, 72163}, {72192, 72192}, + {72203, 72242}, {72250, 72250}, {72272, 72272}, {72284, 72329}, + {72349, 72349}, {72368, 72440}, {72640, 72672}, {72704, 72712}, {72714, 72750}, {72768, 72768}, {72818, 72847}, {72960, 72966}, {72968, 72969}, {72971, 73008}, {73030, 73030}, {73056, 73061}, {73063, 73064}, {73066, 73097}, {73112, 73112}, {73440, 73458}, {73474, 73474}, {73476, 73488}, {73490, 73523}, {73648, 73648}, {73728, 74649}, {74752, 74862}, {74880, 75075}, {77712, 77808}, - {77824, 78895}, {78913, 78918}, {82944, 83526}, {92160, 92728}, - {92736, 92766}, {92784, 92862}, {92880, 92909}, {92928, 92975}, - {92992, 92995}, {93027, 93047}, {93053, 93071}, {93760, 93823}, - {93952, 94026}, {94032, 94032}, {94099, 94111}, {94176, 94177}, - {94179, 94179}, {94208, 100343}, {100352, 101589}, {101632, 101640}, - {110576, 110579}, {110581, 110587}, {110589, 110590}, {110592, 110882}, - {110898, 110898}, {110928, 110930}, {110933, 110933}, {110948, 110951}, - {110960, 111355}, {113664, 113770}, {113776, 113788}, {113792, 113800}, - {113808, 113817}, {119808, 119892}, {119894, 119964}, {119966, 119967}, - {119970, 119970}, {119973, 119974}, {119977, 119980}, {119982, 119993}, - {119995, 119995}, {119997, 120003}, {120005, 120069}, {120071, 120074}, - {120077, 120084}, {120086, 120092}, {120094, 120121}, {120123, 120126}, - {120128, 120132}, {120134, 120134}, {120138, 120144}, {120146, 120485}, - {120488, 120512}, {120514, 120538}, {120540, 120570}, {120572, 120596}, - {120598, 120628}, {120630, 120654}, {120656, 120686}, {120688, 120712}, - {120714, 120744}, {120746, 120770}, {120772, 120779}, {122624, 122633}, - {122634, 122634}, {122635, 122654}, {122661, 122666}, {122928, 122989}, - {123136, 123180}, {123191, 123197}, {123214, 123214}, {123536, 123565}, - {123584, 123627}, {124112, 124138}, {124139, 124139}, {124896, 124902}, - {124904, 124907}, {124909, 124910}, {124912, 124926}, {124928, 125124}, - {125184, 125251}, {125259, 125259}, {126464, 126467}, {126469, 126495}, - {126497, 126498}, {126500, 126500}, {126503, 126503}, {126505, 126514}, - {126516, 126519}, {126521, 126521}, {126523, 126523}, {126530, 126530}, - {126535, 126535}, {126537, 126537}, {126539, 126539}, {126541, 126543}, - {126545, 126546}, {126548, 126548}, {126551, 126551}, {126553, 126553}, - {126555, 126555}, {126557, 126557}, {126559, 126559}, {126561, 126562}, - {126564, 126564}, {126567, 126570}, {126572, 126578}, {126580, 126583}, - {126585, 126588}, {126590, 126590}, {126592, 126601}, {126603, 126619}, - {126625, 126627}, {126629, 126633}, {126635, 126651}, {131072, 173791}, - {173824, 177977}, {177984, 178205}, {178208, 183969}, {183984, 191456}, - {191472, 192093}, {194560, 195101}, {196608, 201546}, {201552, 205743} + {77824, 78895}, {78913, 78918}, {78944, 82938}, {82944, 83526}, + {90368, 90397}, {92160, 92728}, {92736, 92766}, {92784, 92862}, + {92880, 92909}, {92928, 92975}, {92992, 92995}, {93027, 93047}, + {93053, 93071}, {93504, 93506}, {93507, 93546}, {93547, 93548}, + {93760, 93823}, {93952, 94026}, {94032, 94032}, {94099, 94111}, + {94176, 94177}, {94179, 94179}, {94208, 100343}, {100352, 101589}, + {101631, 101640}, {110576, 110579}, {110581, 110587}, {110589, 110590}, + {110592, 110882}, {110898, 110898}, {110928, 110930}, {110933, 110933}, + {110948, 110951}, {110960, 111355}, {113664, 113770}, {113776, 113788}, + {113792, 113800}, {113808, 113817}, {119808, 119892}, {119894, 119964}, + {119966, 119967}, {119970, 119970}, {119973, 119974}, {119977, 119980}, + {119982, 119993}, {119995, 119995}, {119997, 120003}, {120005, 120069}, + {120071, 120074}, {120077, 120084}, {120086, 120092}, {120094, 120121}, + {120123, 120126}, {120128, 120132}, {120134, 120134}, {120138, 120144}, + {120146, 120485}, {120488, 120512}, {120514, 120538}, {120540, 120570}, + {120572, 120596}, {120598, 120628}, {120630, 120654}, {120656, 120686}, + {120688, 120712}, {120714, 120744}, {120746, 120770}, {120772, 120779}, + {122624, 122633}, {122634, 122634}, {122635, 122654}, {122661, 122666}, + {122928, 122989}, {123136, 123180}, {123191, 123197}, {123214, 123214}, + {123536, 123565}, {123584, 123627}, {124112, 124138}, {124139, 124139}, + {124368, 124397}, {124400, 124400}, {124896, 124902}, {124904, 124907}, + {124909, 124910}, {124912, 124926}, {124928, 125124}, {125184, 125251}, + {125259, 125259}, {126464, 126467}, {126469, 126495}, {126497, 126498}, + {126500, 126500}, {126503, 126503}, {126505, 126514}, {126516, 126519}, + {126521, 126521}, {126523, 126523}, {126530, 126530}, {126535, 126535}, + {126537, 126537}, {126539, 126539}, {126541, 126543}, {126545, 126546}, + {126548, 126548}, {126551, 126551}, {126553, 126553}, {126555, 126555}, + {126557, 126557}, {126559, 126559}, {126561, 126562}, {126564, 126564}, + {126567, 126570}, {126572, 126578}, {126580, 126583}, {126585, 126588}, + {126590, 126590}, {126592, 126601}, {126603, 126619}, {126625, 126627}, + {126629, 126633}, {126635, 126651}, {131072, 173791}, {173824, 177977}, + {177984, 178205}, {178208, 183969}, {183984, 191456}, {191472, 192093}, + {194560, 195101}, {196608, 201546}, {201552, 205743} }; } // namespace ada::idna #endif // ADA_IDNA_IDENTIFIER_TABLES_H - /* end file src/id_tables.cpp */ namespace ada::idna { -// return 0xffffffff in case of error -// We do not fully validate the input -uint32_t get_first_code_point(std::string_view input) { - constexpr uint32_t error = 0xffffffff; - // Check if the input is empty - if (input.empty()) { - return error; - } - - uint32_t code_point = 0; - size_t number_bytes = 0; - unsigned char first_byte = input[0]; - - if ((first_byte & 0x80) == 0) { - // 1-byte character (ASCII) - return first_byte; - } else if ((first_byte & 0xE0) == 0xC0) { - // 2-byte character - code_point = first_byte & 0x1F; - number_bytes = 2; - } else if ((first_byte & 0xF0) == 0xE0) { - // 3-byte character - code_point = first_byte & 0x0F; - number_bytes = 3; - } else if ((first_byte & 0xF8) == 0xF0) { - // 4-byte character - code_point = first_byte & 0x07; - number_bytes = 4; - } else { - return error; - } - - // Decode the remaining bytes - for (size_t i = 1; i < number_bytes; ++i) { - if (i >= input.size()) { - return error; - } - unsigned char byte = input[i]; - if ((byte & 0xC0) != 0x80) { - return error; - } - code_point = (code_point << 6) | (byte & 0x3F); - } - return code_point; -} - -bool is_ascii_letter(char32_t c) { +constexpr bool is_ascii_letter(char32_t c) noexcept { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); } -bool is_ascii_letter_or_digit(char32_t c) { +constexpr bool is_ascii_letter_or_digit(char32_t c) noexcept { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'); } @@ -10389,16 +10398,13 @@ bool valid_name_code_point(char32_t code_point, bool first) { if (first) { auto iter = std::lower_bound( std::begin(ada::idna::id_start), std::end(ada::idna::id_start), - code_point, [](const uint32_t* range, uint32_t code_point) { - return range[1] < code_point; - }); + code_point, + [](const uint32_t* range, uint32_t cp) { return range[1] < cp; }); return iter != std::end(id_start) && code_point >= (*iter)[0]; } else { auto iter = std::lower_bound( std::begin(id_continue), std::end(id_continue), code_point, - [](const uint32_t* range, uint32_t code_point) { - return range[1] < code_point; - }); + [](const uint32_t* range, uint32_t cp) { return range[1] < cp; }); return iter != std::end(id_start) && code_point >= (*iter)[0]; } } @@ -15216,7 +15222,11 @@ inline void url_aggregator::consume_prepared_path(std::string_view input) { } } // 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 #include @@ -15225,7 +15235,7 @@ inline void url_aggregator::consume_prepared_path(std::string_view input) { namespace ada { tl::expected url_pattern_init::process( - url_pattern_init init, url_pattern_init::process_type type, + const url_pattern_init& init, url_pattern_init::process_type type, std::optional protocol, std::optional username, std::optional password, @@ -15275,7 +15285,7 @@ tl::expected url_pattern_init::process( 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. + // 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(); @@ -15286,7 +15296,7 @@ tl::expected url_pattern_init::process( // 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. + // 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( @@ -15297,7 +15307,7 @@ tl::expected url_pattern_init::process( // 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. + // 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( @@ -15306,7 +15316,7 @@ tl::expected url_pattern_init::process( // If init contains neither "protocol" nor "hostname", then: if (!init.protocol && !init.hostname) { - // Let baseHost be baseURL’s host. + // 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 @@ -15317,8 +15327,8 @@ tl::expected url_pattern_init::process( // 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. + // 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(); } @@ -15334,7 +15344,7 @@ tl::expected url_pattern_init::process( // "search", then: if (!init.protocol && !init.hostname && !init.port && !init.pathname && !init.search) { - // Let baseQuery be baseURL’s query. + // Let baseQuery be baseURL's query. // 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( @@ -15345,7 +15355,7 @@ tl::expected url_pattern_init::process( // "search", and "hash", then: if (!init.protocol && !init.hostname && !init.port && !init.pathname && !init.search && !init.hash) { - // Let baseFragment be baseURL’s fragment. + // Let baseFragment be baseURL's fragment. // 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( @@ -15583,8 +15593,11 @@ tl::expected url_pattern_init::process_hash( } } // 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 #include @@ -15616,13 +15629,13 @@ generate_regular_expression_and_name_list( // (?:) // Append "(?:" to the end of result. result.append("(?:"); - // Append the result of running escape a regexp string given part’s + // Append the result of running escape a regexp string given part's // value to the end of result. result.append(escape_regexp_string(part.value)); // Append ")" to the end of result. result.append(")"); // Append the result of running convert a modifier to a string given - // part’s modifier to the end of result. + // part's modifier to the end of result. result.append(convert_modifier_to_string(part.modifier)); } continue; @@ -15688,7 +15701,7 @@ generate_regular_expression_and_name_list( // value>))*))? // Append "(?:" to the end of result. result.append("(?:"); - // Append the result of running escape a regexp string given part’s prefix + // 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. @@ -15697,10 +15710,10 @@ generate_regular_expression_and_name_list( 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 + // 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 + // 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. @@ -15709,7 +15722,7 @@ generate_regular_expression_and_name_list( 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 + // 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. @@ -15729,7 +15742,7 @@ generate_regular_expression_and_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'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. @@ -15765,7 +15778,7 @@ 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 + // 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. @@ -15816,7 +15829,7 @@ tl::expected canonicalize_username( if (!url->set_username(input)) { return tl::unexpected(errors::type_error); } - // Return dummyURL’s username. + // Return dummyURL's username. return std::string(url->get_username()); } @@ -15834,7 +15847,7 @@ tl::expected canonicalize_password( if (!url->set_password(input)) { return tl::unexpected(errors::type_error); } - // Return dummyURL’s password. + // Return dummyURL's password. return std::string(url->get_password()); } @@ -15858,7 +15871,7 @@ tl::expected canonicalize_hostname( // 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 dummyURL's host, serialized, or empty string if it is null. return std::string(url->get_hostname()); } @@ -15886,13 +15899,13 @@ tl::expected canonicalize_port( return ""; } // Let dummyURL be a new URL record. - // If protocolValue was given, then set dummyURL’s scheme to protocolValue. + // If protocolValue was given, then set dummyURL's scheme to protocolValue. // Let parseResult be the result of running basic URL parser given portValue // with dummyURL as url and port state as state override. auto url = ada::parse("fake://dummy.test", nullptr); ADA_ASSERT_TRUE(url); if (url->set_port(port_value)) { - // Return dummyURL’s port, serialized, or empty string if it is null. + // Return dummyURL's port, serialized, or empty string if it is null. return std::string(url->get_port()); } // If parseResult is failure, then throw a TypeError. @@ -15915,7 +15928,7 @@ tl::expected canonicalize_port_with_protocol( protocol.remove_suffix(1); } // Let dummyURL be a new URL record. - // If protocolValue was given, then set dummyURL’s scheme to protocolValue. + // If protocolValue was given, then set dummyURL's scheme to protocolValue. // Let parseResult be the result of running basic URL parser given portValue // with dummyURL as url and port state as state override. auto url = ada::parse(std::string(protocol) + "://dummy.test", @@ -15924,7 +15937,7 @@ tl::expected canonicalize_port_with_protocol( // This is actually a bug with url parser where set_port() returns true for // "invalid80" port value. if (url && url->set_port(port_value) && url->has_port()) { - // Return dummyURL’s port, serialized, or empty string if it is null. + // Return dummyURL's port, serialized, or empty string if it is null. return std::string(url->get_port()); } // TODO: Remove this once the previous has_port() check is removed. @@ -15969,7 +15982,7 @@ tl::expected canonicalize_opaque_pathname( return ""; } // Let dummyURL be a new URL record. - // Set dummyURL’s path to the empty string. + // 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 = @@ -15987,7 +16000,7 @@ tl::expected canonicalize_search(std::string_view input) { return ""; } // Let dummyURL be a new URL record. - // Set dummyURL’s query to the empty string. + // Set dummyURL's query to the empty string. // Let parseResult be the result of running basic URL parser given value with // dummyURL as url and query state as state override. auto url = ada::parse("fake://dummy.test", nullptr); @@ -16006,13 +16019,13 @@ tl::expected canonicalize_hash(std::string_view input) { return ""; } // Let dummyURL be a new URL record. - // Set dummyURL’s fragment to the empty string. + // Set dummyURL's fragment to the empty string. // Let parseResult be the result of running basic URL parser given value with // dummyURL as url and fragment state as state override. auto url = ada::parse("fake://dummy.test", nullptr); ADA_ASSERT_TRUE(url.has_value()); url->set_hash(input); - // Return dummyURL’s fragment. + // Return dummyURL's fragment. if (url->has_hash()) { const auto hash = url->get_hash(); return std::string(hash.substr(1)); @@ -16024,16 +16037,16 @@ tl::expected, 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. + // 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'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 + // Run seek and get the next code point given tokenizer and tokenizer's // index. tokenizer.seek_and_get_next_code_point(tokenizer.index); - // If tokenizer’s code point is U+002A (*): + // 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". @@ -16043,7 +16056,7 @@ tl::expected, errors> tokenize(std::string_view input, continue; } - // If tokenizer’s code point is U+002B (+) or U+003F (?): + // 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". @@ -16052,13 +16065,13 @@ tl::expected, errors> tokenize(std::string_view input, continue; } - // If tokenizer’s code point is U+005C (\): + // 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'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. + // 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"); @@ -16067,12 +16080,12 @@ tl::expected, errors> tokenize(std::string_view input, continue; } - // Let escaped index be tokenizer’s next index. + // 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(); // Run add a token with default length given tokenizer, "escaped-char", - // tokenizer’s next index, and escaped index. + // 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, @@ -16081,7 +16094,7 @@ tl::expected, errors> tokenize(std::string_view input, continue; } - // If tokenizer’s code point is U+007B ({): + // 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". @@ -16090,7 +16103,7 @@ tl::expected, errors> tokenize(std::string_view input, continue; } - // If tokenizer’s code point is U+007D (}): + // 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". @@ -16099,13 +16112,13 @@ tl::expected, errors> tokenize(std::string_view input, continue; } - // If tokenizer’s code point is U+003A (:): + // If tokenizer's code point is U+003A (:): if (tokenizer.code_point == ':') { - // Let name position be tokenizer’s next index. + // 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; - // While name position is less than tokenizer’s input's code point length: + // 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. @@ -16114,7 +16127,7 @@ tl::expected, errors> tokenize(std::string_view input, // 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. + // 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), @@ -16122,14 +16135,14 @@ tl::expected, errors> tokenize(std::string_view input, " 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. + // Set name position to tokenizer's next index. name_position = tokenizer.next_index; } // 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. + // tokenizer's index. if (auto error = tokenizer.process_tokenizing_error(name_start, tokenizer.index)) { ada_log("process_tokenizing_error failed"); @@ -16146,18 +16159,18 @@ tl::expected, errors> tokenize(std::string_view input, continue; } - // If tokenizer’s code point is U+0028 ((): + // 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. + // 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 + // 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 @@ -16165,11 +16178,11 @@ tl::expected, errors> tokenize(std::string_view input, tokenizer.seek_and_get_next_code_point(regexp_position); // TODO: Optimization opportunity: The next 2 if statements can be - // merged. If the result of running is ASCII given tokenizer’s code + // 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. + // tokenizer's index. if (auto process_error = tokenizer.process_tokenizing_error( regexp_start, tokenizer.index)) { return tl::unexpected(*process_error); @@ -16179,11 +16192,11 @@ tl::expected, errors> tokenize(std::string_view input, break; } - // If regexp position equals regexp start and tokenizer’s code point is + // 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. + // tokenizer's index. if (auto process_error = tokenizer.process_tokenizing_error( regexp_start, tokenizer.index)) { return tl::unexpected(*process_error); @@ -16193,12 +16206,12 @@ tl::expected, errors> tokenize(std::string_view input, break; } - // If tokenizer’s code point is U+005C (\): + // 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 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. + // tokenizer's index. if (auto process_error = tokenizer.process_tokenizing_error( regexp_start, tokenizer.index)) { return tl::unexpected(*process_error); @@ -16209,11 +16222,11 @@ tl::expected, errors> tokenize(std::string_view input, } // Run get the next code point given tokenizer. tokenizer.get_next_code_point(); - // If the result of running is ASCII given tokenizer’s code point is + // 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. + // tokenizer's index. if (auto process_error = tokenizer.process_tokenizing_error( regexp_start, tokenizer.index); process_error.has_value()) { @@ -16223,31 +16236,31 @@ tl::expected, errors> tokenize(std::string_view input, error = true; break; } - // Set regexp position to tokenizer’s next index. + // Set regexp position to tokenizer's next index. regexp_position = tokenizer.next_index; continue; } - // If tokenizer’s code point is U+0029 ()): + // 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. + // 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 ((): + // 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 − + // 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. + // tokenizer's index. if (auto process_error = tokenizer.process_tokenizing_error( regexp_start, tokenizer.index)) { return tl::unexpected(*process_error); @@ -16256,14 +16269,14 @@ tl::expected, errors> tokenize(std::string_view input, error = true; break; } - // Let temporary position be tokenizer’s next index. + // 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’s code point is not U+003F (?): + // 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. + // tokenizer's index. if (auto process_error = tokenizer.process_tokenizing_error( regexp_start, tokenizer.index)) { return tl::unexpected(*process_error); @@ -16272,10 +16285,10 @@ tl::expected, errors> tokenize(std::string_view input, error = true; break; } - // Set tokenizer’s next index to temporary position. + // Set tokenizer's next index to temporary position. tokenizer.next_index = temporary_position; } - // Set regexp position to tokenizer’s next index. + // Set regexp position to tokenizer's next index. regexp_position = tokenizer.next_index; } @@ -16284,19 +16297,19 @@ tl::expected, errors> tokenize(std::string_view input, // If depth is not zero: if (depth != 0) { // Run process a tokenizing error given tokenizer, regexp start, and - // tokenizer’s index. + // 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. + // 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. + // tokenizer's index. if (auto process_error = tokenizer.process_tokenizing_error( regexp_start, tokenizer.index)) { ada_log("process_tokenizing_error failed"); @@ -16314,13 +16327,13 @@ tl::expected, errors> tokenize(std::string_view input, // "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. + // 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's token list. return tokenizer.token_list; } @@ -16341,7 +16354,7 @@ std::string escape_pattern_string(std::string_view input) { c == '}' || c == '(' || c == ')' || c == '\\'; }; - // While index is less than input’s length: + // While index is less than input's length: for (const auto& c : input) { if (should_escape(c)) { // then append U+005C (\) to the end of result. @@ -16407,7 +16420,7 @@ constexpr bool is_absolute_pathname( 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'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. @@ -16430,39 +16443,39 @@ std::string generate_pattern_string( // TODO: Optimization opportunity. Find a way to avoid making a copy here. std::optional previous_part = index == 0 ? std::nullopt : std::optional(part_list[index - 1]); - // Let next part be part list[index + 1] if index is less than index list’s + // Let next part be part list[index + 1] if index is less than index list's // size - 1, otherwise let it be null. std::optional next_part = index < part_list.size() - 1 ? std::optional(part_list[index + 1]) : std::nullopt; - // If part’s type is "fixed-text" then: + // 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'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 + // 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 + // 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. + // 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; + // 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 + // - 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() || @@ -16471,26 +16484,26 @@ std::string generate_pattern_string( // 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 + // - 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 + // - 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.has_value() && next_part->prefix.empty() && next_part->suffix.empty()) { - // If next part’s type is "fixed-text": + // 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 + // 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. + // 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]); } @@ -16498,10 +16511,10 @@ std::string generate_pattern_string( // If all of the following are true: // - needs grouping is false; and - // - part’s prefix is the empty string; 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. + // - 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.has_value() && previous_part->type == url_pattern_part_type::FIXED_TEXT && @@ -16511,7 +16524,7 @@ std::string generate_pattern_string( needs_grouping = true; } - // Assert: part’s name is not the empty string or null. + // 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. @@ -16519,7 +16532,7 @@ std::string generate_pattern_string( result.append("{"); } - // Append the result of running escape a pattern string given part’s prefix + // 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)); @@ -16527,21 +16540,21 @@ std::string generate_pattern_string( if (custom_name) { // Append ":" to the end of result. result.append(":"); - // Append part’s name to the end of result. + // Append part's name to the end of result. result.append(part.name); } - // If part’s type is "regexp" then: + // 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. + // 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 + // 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 @@ -16550,13 +16563,13 @@ std::string generate_pattern_string( // 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": + // 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 + // - 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 + // - part's prefix is not the empty string // - then append "*" to the end of result. if (!custom_name && (!previous_part.has_value() || @@ -16573,10 +16586,10 @@ std::string generate_pattern_string( } // If all of the following are true: - // - part’s type is "segment-wildcard"; and + // - 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 + // - 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 && @@ -16585,12 +16598,12 @@ std::string generate_pattern_string( result.append("\\"); } - // Append the result of running escape a pattern string given part’s suffix + // 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 + // 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)); } @@ -16598,8 +16611,12 @@ std::string generate_pattern_string( 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 { @@ -16607,7 +16624,7 @@ namespace ada::url_pattern_regex { std::optional 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". + // 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 @@ -16654,7 +16671,11 @@ bool std_regex_provider::regex_match(std::string_view input, #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 */ ada::result& get_instance(void* result) noexcept { diff --git a/ada_url/ada.h b/ada_url/ada.h index 1252d18..da4c919 100644 --- a/ada_url/ada.h +++ b/ada_url/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2025-02-26 20:29:12 -0500. Do not edit! */ +/* auto-generated on 2025-03-10 13:14:56 -0400. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -8,7 +8,7 @@ #define ADA_H /* begin file include/ada/ada_idna.h */ -/* auto-generated on 2024-12-18 09:44:34 -0500. Do not edit! */ +/* auto-generated on 2025-03-08 13:17:11 -0500. Do not edit! */ /* begin file include/idna.h */ #ifndef ADA_IDNA_H #define ADA_IDNA_H @@ -45,8 +45,6 @@ namespace ada::idna { // If the input is ascii, then the mapping is just -> lower case. void ascii_map(char* input, size_t length); -// check whether an ascii string needs mapping -bool ascii_has_upper_case(char* input, size_t length); // Map the characters according to IDNA, returning the empty string on error. std::u32string map(std::u32string_view input); @@ -160,7 +158,6 @@ std::string to_unicode(std::string_view input); namespace ada::idna { -// Access the first code point of the input string. // 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 @@ -168,7 +165,7 @@ namespace ada::idna { // 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 input, bool first); +bool valid_name_code_point(char32_t code_point, bool first); } // namespace ada::idna @@ -453,6 +450,10 @@ namespace ada { #endif #endif +#ifndef ADA_INCLUDE_URL_PATTERN +#define ADA_INCLUDE_URL_PATTERN 1 +#endif // ADA_INCLUDE_URL_PATTERN + #endif // ADA_COMMON_DEFS_H /* end file include/ada/common_defs.h */ #include @@ -876,7 +877,7 @@ constexpr uint8_t PATH_PERCENT_ENCODE[32] = { // 50 51 52 53 54 55 56 57 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 58 59 5A 5B 5C 5D 5E 5F - 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x40 | 0x00, // 60 61 62 63 64 65 66 67 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, // 68 69 6A 6B 6C 6D 6E 6F @@ -4113,6 +4114,8 @@ void swap(expected &lhs, #endif /* end file include/ada/expected.h */ + +#if ADA_INCLUDE_URL_PATTERN /* begin file include/ada/url_pattern_regex.h */ /** * @file url_search_params.h @@ -4232,7 +4235,7 @@ struct url_pattern_init { // All strings must be valid UTF-8. // @see https://urlpattern.spec.whatwg.org/#process-a-urlpatterninit static tl::expected process( - url_pattern_init init, process_type type, + const url_pattern_init& init, process_type type, std::optional protocol = std::nullopt, std::optional username = std::nullopt, std::optional password = std::nullopt, @@ -4312,6 +4315,7 @@ struct url_pattern_init { #endif // ADA_URL_PATTERN_INIT_H /* end file include/ada/url_pattern_init.h */ +#endif // ADA_INCLUDE_URL_PATTERN /** * @private @@ -4319,9 +4323,11 @@ struct url_pattern_init { namespace ada { struct url_aggregator; struct url; +#if ADA_INCLUDE_URL_PATTERN template class url_pattern; struct url_pattern_options; +#endif // ADA_INCLUDE_URL_PATTERN enum class errors : uint8_t; } // namespace ada @@ -4354,10 +4360,12 @@ extern template url_aggregator parse_url_impl( extern template url parse_url_impl(std::string_view user_input, const url* base_url); +#if ADA_INCLUDE_URL_PATTERN template tl::expected, errors> parse_url_pattern_impl( - std::variant input, + std::variant&& input, const std::string_view* base_url, const url_pattern_options* options); +#endif // ADA_INCLUDE_URL_PATTERN } // namespace ada::parser @@ -4370,6 +4378,7 @@ tl::expected, errors> parse_url_pattern_impl( #ifndef ADA_PARSER_INL_H #define ADA_PARSER_INL_H +#if ADA_INCLUDE_URL_PATTERN /* begin file include/ada/url_pattern.h */ /** * @file url_pattern.h @@ -5005,6 +5014,9 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u); #endif // ADA_URL_H /* end file include/ada/url.h */ +#if ADA_INCLUDE_URL_PATTERN +#endif // ADA_INCLUDE_URL_PATTERN + namespace ada { template @@ -5037,6 +5049,7 @@ extern template ada::result parse( bool can_parse(std::string_view input, const std::string_view* base_input = nullptr); +#if ADA_INCLUDE_URL_PATTERN /** * Implementation of the URL pattern parsing algorithm. * @see https://urlpattern.spec.whatwg.org @@ -5048,9 +5061,10 @@ bool can_parse(std::string_view input, */ template ada_warn_unused tl::expected, errors> -parse_url_pattern(std::variant input, +parse_url_pattern(std::variant&& input, const std::string_view* base_url = nullptr, const url_pattern_options* options = nullptr); +#endif // ADA_INCLUDE_URL_PATTERN /** * Computes a href string from a file path. The function assumes @@ -5108,17 +5122,17 @@ class url_pattern_part { public: url_pattern_part(url_pattern_part_type _type, std::string&& _value, url_pattern_part_modifier _modifier) - : type(_type), value(_value), modifier(_modifier) {} + : type(_type), value(std::move(_value)), modifier(_modifier) {} url_pattern_part(url_pattern_part_type _type, std::string&& _value, url_pattern_part_modifier _modifier, std::string&& _name, std::string&& _prefix, std::string&& _suffix) : type(_type), - value(_value), + value(std::move(_value)), modifier(_modifier), - name(_name), - prefix(_prefix), - suffix(_suffix) {} + name(std::move(_name)), + prefix(std::move(_prefix)), + suffix(std::move(_suffix)) {} // A part has an associated type, a string, which must be set upon creation. url_pattern_part_type type; // A part has an associated value, a string, which must be set upon creation. @@ -5212,7 +5226,7 @@ class url_pattern_component { bool new_has_regexp_groups) : regexp(std::move(new_regexp)), pattern(std::move(new_pattern)), - group_name_list(new_group_name_list), + group_name_list(std::move(new_group_name_list)), has_regexp_groups(new_has_regexp_groups) {} // @see https://urlpattern.spec.whatwg.org/#compile-a-component @@ -5348,7 +5362,7 @@ class url_pattern { template friend tl::expected, errors> parser::parse_url_pattern_impl( - std::variant input, + std::variant&& input, const std::string_view* base_url, const url_pattern_options* options); /** @@ -5758,15 +5772,17 @@ std::string generate_segment_wildcard_regexp( #endif /* end file include/ada/url_pattern_helpers.h */ +#endif // ADA_INCLUDE_URL_PATTERN #include #include #include namespace ada::parser { +#if ADA_INCLUDE_URL_PATTERN template tl::expected, errors> parse_url_pattern_impl( - std::variant input, + std::variant&& input, const std::string_view* base_url, const url_pattern_options* options) { // Let init be null. url_pattern_init init; @@ -5815,7 +5831,7 @@ tl::expected, errors> parse_url_pattern_impl( return tl::unexpected(processed_init.error()); } - // For each componentName of « "protocol", "username", "password", "hostname", + // For each componentName of "protocol", "username", "password", "hostname", // "port", "pathname", "search", "hash" If processedInit[componentName] does // not exist, then set processedInit[componentName] to "*". ADA_ASSERT_TRUE(processed_init.has_value()); @@ -5853,7 +5869,7 @@ tl::expected, errors> parse_url_pattern_impl( // Let urlPattern be a new URL pattern. url_pattern url_pattern_{}; - // Set urlPattern’s protocol component to the result of compiling a component + // Set urlPattern's protocol component to the result of compiling a component // given processedInit["protocol"], canonicalize a protocol, and default // options. auto protocol_component = url_pattern_component::compile( @@ -5867,7 +5883,7 @@ tl::expected, errors> parse_url_pattern_impl( } url_pattern_.protocol_component = std::move(*protocol_component); - // Set urlPattern’s username component to the result of compiling a component + // Set urlPattern's username component to the result of compiling a component // given processedInit["username"], canonicalize a username, and default // options. auto username_component = url_pattern_component::compile( @@ -5881,7 +5897,7 @@ tl::expected, errors> parse_url_pattern_impl( } url_pattern_.username_component = std::move(*username_component); - // Set urlPattern’s password component to the result of compiling a component + // Set urlPattern's password component to the result of compiling a component // given processedInit["password"], canonicalize a password, and default // options. auto password_component = url_pattern_component::compile( @@ -5898,12 +5914,12 @@ tl::expected, errors> parse_url_pattern_impl( // TODO: Optimization opportunity. The following if statement can be // simplified. // If the result running hostname pattern is an IPv6 address given - // processedInit["hostname"] is true, then set urlPattern’s hostname component + // processedInit["hostname"] is true, then set urlPattern's hostname component // to the result of compiling a component given processedInit["hostname"], // canonicalize an IPv6 hostname, and hostname options. if (url_pattern_helpers::is_ipv6_address(processed_init->hostname.value())) { ada_log("processed_init->hostname is ipv6 address"); - // then set urlPattern’s hostname component to the result of compiling a + // then set urlPattern's hostname component to the result of compiling a // component given processedInit["hostname"], canonicalize an IPv6 hostname, // and hostname options. auto hostname_component = url_pattern_component::compile( @@ -5917,7 +5933,7 @@ tl::expected, errors> parse_url_pattern_impl( } url_pattern_.hostname_component = std::move(*hostname_component); } else { - // Otherwise, set urlPattern’s hostname component to the result of compiling + // Otherwise, set urlPattern's hostname component to the result of compiling // a component given processedInit["hostname"], canonicalize a hostname, and // hostname options. auto hostname_component = url_pattern_component::compile( @@ -5932,7 +5948,7 @@ tl::expected, errors> parse_url_pattern_impl( url_pattern_.hostname_component = std::move(*hostname_component); } - // Set urlPattern’s port component to the result of compiling a component + // Set urlPattern's port component to the result of compiling a component // given processedInit["port"], canonicalize a port, and default options. auto port_component = url_pattern_component::compile( processed_init->port.value(), url_pattern_helpers::canonicalize_port, @@ -5953,7 +5969,7 @@ tl::expected, errors> parse_url_pattern_impl( // TODO: Optimization opportunity: Simplify this if statement. // If the result of running protocol component matches a special scheme given - // urlPattern’s protocol component is true, then: + // urlPattern's protocol component is true, then: if (url_pattern_helpers::protocol_component_matches_special_scheme< regex_provider>(url_pattern_.protocol_component)) { // Let pathCompileOptions be copy of the pathname options with the ignore @@ -5963,7 +5979,7 @@ tl::expected, errors> parse_url_pattern_impl( path_compile_options.ignore_case = options->ignore_case; } - // Set urlPattern’s pathname component to the result of compiling a + // Set urlPattern's pathname component to the result of compiling a // component given processedInit["pathname"], canonicalize a pathname, and // pathCompileOptions. auto pathname_component = url_pattern_component::compile( @@ -5976,7 +5992,7 @@ tl::expected, errors> parse_url_pattern_impl( } url_pattern_.pathname_component = std::move(*pathname_component); } else { - // Otherwise set urlPattern’s pathname component to the result of compiling + // Otherwise set urlPattern's pathname component to the result of compiling // a component given processedInit["pathname"], canonicalize an opaque // pathname, and compileOptions. auto pathname_component = url_pattern_component::compile( @@ -5990,7 +6006,7 @@ tl::expected, errors> parse_url_pattern_impl( url_pattern_.pathname_component = std::move(*pathname_component); } - // Set urlPattern’s search component to the result of compiling a component + // Set urlPattern's search component to the result of compiling a component // given processedInit["search"], canonicalize a search, and compileOptions. auto search_component = url_pattern_component::compile( processed_init->search.value(), url_pattern_helpers::canonicalize_search, @@ -6002,7 +6018,7 @@ tl::expected, errors> parse_url_pattern_impl( } url_pattern_.search_component = std::move(*search_component); - // Set urlPattern’s hash component to the result of compiling a component + // Set urlPattern's hash component to the result of compiling a component // given processedInit["hash"], canonicalize a hash, and compileOptions. auto hash_component = url_pattern_component::compile( processed_init->hash.value(), url_pattern_helpers::canonicalize_hash, @@ -6017,6 +6033,7 @@ tl::expected, errors> parse_url_pattern_impl( // Return urlPattern. return url_pattern_; } +#endif // ADA_INCLUDE_URL_PATTERN } // namespace ada::parser @@ -7121,12 +7138,15 @@ struct url_aggregator : url_base { std::string_view, const url_aggregator *); friend url_aggregator parser::parse_url_impl( std::string_view, const url_aggregator *); + +#if ADA_INCLUDE_URL_PATTERN // url_pattern methods template friend tl::expected, errors> - parse_url_pattern_impl(std::variant input, - const std::string_view *base_url, - const url_pattern_options *options); + parse_url_pattern_impl( + std::variant &&input, + const std::string_view *base_url, const url_pattern_options *options); +#endif // ADA_INCLUDE_URL_PATTERN std::string buffer{}; url_components components{}; @@ -8895,6 +8915,8 @@ url_search_params_entries_iter::next() { #endif // ADA_URL_SEARCH_PARAMS_INL_H /* end file include/ada/url_search_params-inl.h */ + +#if ADA_INCLUDE_URL_PATTERN /* begin file include/ada/url_pattern-inl.h */ /** * @file url_pattern-inl.h @@ -9074,7 +9096,7 @@ url_pattern_component::compile( } // For each part of part list: - // - If part’s type is "regexp", then set has regexp groups to true. + // - If part's type is "regexp", then set has regexp groups to true. const auto has_regexp = [](const auto& part) { return part.is_regexp(); }; const bool has_regexp_groups = std::ranges::any_of(*part_list, has_regexp); @@ -9221,24 +9243,24 @@ result> url_pattern::match( return std::nullopt; } - // Set protocol to url’s scheme. + // Set protocol to url's scheme. // IMPORTANT: Not documented on the URLPattern spec, but protocol suffix ':' // is removed. Similar work was done on workerd: // https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2038 protocol = url->get_protocol().substr(0, url->get_protocol().size() - 1); - // Set username to url’s username. + // Set username to url's username. username = url->get_username(); - // Set password to url’s password. + // Set password to url's password. password = url->get_password(); - // Set hostname to url’s host, serialized, or the empty string if the value + // Set hostname to url's host, serialized, or the empty string if the value // is null. hostname = url->get_hostname(); - // Set port to url’s port, serialized, or the empty string if the value is + // Set port to url's port, serialized, or the empty string if the value is // null. port = url->get_port(); // Set pathname to the result of URL path serializing url. pathname = url->get_pathname(); - // Set search to url’s query or the empty string if the value is null. + // Set search to url's query or the empty string if the value is null. // IMPORTANT: Not documented on the URLPattern spec, but search prefix '?' // is removed. Similar work was done on workerd: // https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2232 @@ -9246,7 +9268,7 @@ result> url_pattern::match( auto view = url->get_search(); search = view.starts_with("?") ? url->get_search().substr(1) : view; } - // Set hash to url’s fragment or the empty string if the value is null. + // Set hash to url's fragment or the empty string if the value is null. // IMPORTANT: Not documented on the URLPattern spec, but hash prefix '#' is // removed. Similar work was done on workerd: // https://github.com/cloudflare/workerd/blob/8620d14012513a6ce04d079e401d3becac3c67bd/src/workerd/jsg/url.c%2B%2B#L2242 @@ -9256,7 +9278,7 @@ result> url_pattern::match( } } - // Let protocolExecResult be RegExpBuiltinExec(urlPattern’s protocol + // Let protocolExecResult be RegExpBuiltinExec(urlPattern's protocol // component's regular expression, protocol). auto protocol_exec_result = regex_provider::regex_search(protocol, protocol_component.regexp); @@ -9265,7 +9287,7 @@ result> url_pattern::match( return std::nullopt; } - // Let usernameExecResult be RegExpBuiltinExec(urlPattern’s username + // Let usernameExecResult be RegExpBuiltinExec(urlPattern's username // component's regular expression, username). auto username_exec_result = regex_provider::regex_search(username, username_component.regexp); @@ -9274,7 +9296,7 @@ result> url_pattern::match( return std::nullopt; } - // Let passwordExecResult be RegExpBuiltinExec(urlPattern’s password + // Let passwordExecResult be RegExpBuiltinExec(urlPattern's password // component's regular expression, password). auto password_exec_result = regex_provider::regex_search(password, password_component.regexp); @@ -9283,7 +9305,7 @@ result> url_pattern::match( return std::nullopt; } - // Let hostnameExecResult be RegExpBuiltinExec(urlPattern’s hostname + // Let hostnameExecResult be RegExpBuiltinExec(urlPattern's hostname // component's regular expression, hostname). auto hostname_exec_result = regex_provider::regex_search(hostname, hostname_component.regexp); @@ -9292,7 +9314,7 @@ result> url_pattern::match( return std::nullopt; } - // Let portExecResult be RegExpBuiltinExec(urlPattern’s port component's + // Let portExecResult be RegExpBuiltinExec(urlPattern's port component's // regular expression, port). auto port_exec_result = regex_provider::regex_search(port, port_component.regexp); @@ -9301,7 +9323,7 @@ result> url_pattern::match( return std::nullopt; } - // Let pathnameExecResult be RegExpBuiltinExec(urlPattern’s pathname + // Let pathnameExecResult be RegExpBuiltinExec(urlPattern's pathname // component's regular expression, pathname). auto pathname_exec_result = regex_provider::regex_search(pathname, pathname_component.regexp); @@ -9310,7 +9332,7 @@ result> url_pattern::match( return std::nullopt; } - // Let searchExecResult be RegExpBuiltinExec(urlPattern’s search component's + // Let searchExecResult be RegExpBuiltinExec(urlPattern's search component's // regular expression, search). auto search_exec_result = regex_provider::regex_search(search, search_component.regexp); @@ -9319,7 +9341,7 @@ result> url_pattern::match( return std::nullopt; } - // Let hashExecResult be RegExpBuiltinExec(urlPattern’s hash component's + // Let hashExecResult be RegExpBuiltinExec(urlPattern's hash component's // regular expression, hash). auto hash_exec_result = regex_provider::regex_search(hash, hash_component.regexp); @@ -9333,42 +9355,42 @@ result> url_pattern::match( // Set result["inputs"] to inputs. result.inputs = std::move(inputs); // Set result["protocol"] to the result of creating a component match result - // given urlPattern’s protocol component, protocol, and protocolExecResult. + // given urlPattern's protocol component, protocol, and protocolExecResult. result.protocol = protocol_component.create_component_match_result( std::move(protocol), std::move(*protocol_exec_result)); // Set result["username"] to the result of creating a component match result - // given urlPattern’s username component, username, and usernameExecResult. + // given urlPattern's username component, username, and usernameExecResult. result.username = username_component.create_component_match_result( std::move(username), std::move(*username_exec_result)); // Set result["password"] to the result of creating a component match result - // given urlPattern’s password component, password, and passwordExecResult. + // given urlPattern's password component, password, and passwordExecResult. result.password = password_component.create_component_match_result( std::move(password), std::move(*password_exec_result)); // Set result["hostname"] to the result of creating a component match result - // given urlPattern’s hostname component, hostname, and hostnameExecResult. + // given urlPattern's hostname component, hostname, and hostnameExecResult. result.hostname = hostname_component.create_component_match_result( std::move(hostname), std::move(*hostname_exec_result)); // Set result["port"] to the result of creating a component match result given - // urlPattern’s port component, port, and portExecResult. + // urlPattern's port component, port, and portExecResult. result.port = port_component.create_component_match_result( std::move(port), std::move(*port_exec_result)); // Set result["pathname"] to the result of creating a component match result - // given urlPattern’s pathname component, pathname, and pathnameExecResult. + // given urlPattern's pathname component, pathname, and pathnameExecResult. result.pathname = pathname_component.create_component_match_result( std::move(pathname), std::move(*pathname_exec_result)); // Set result["search"] to the result of creating a component match result - // given urlPattern’s search component, search, and searchExecResult. + // given urlPattern's search component, search, and searchExecResult. result.search = search_component.create_component_match_result( std::move(search), std::move(*search_exec_result)); // Set result["hash"] to the result of creating a component match result given - // urlPattern’s hash component, hash, and hashExecResult. + // urlPattern's hash component, hash, and hashExecResult. result.hash = hash_component.create_component_match_result( std::move(hash), std::move(*hash_exec_result)); @@ -9423,28 +9445,28 @@ inline std::string to_string(token_type type) { template constexpr void constructor_string_parser::rewind() { - // Set parser’s token index to parser’s component start. + // Set parser's token index to parser's component start. token_index = component_start; - // Set parser’s token increment to 0. + // Set parser's token increment to 0. token_increment = 0; } template constexpr bool constructor_string_parser::is_hash_prefix() { // Return the result of running is a non-special pattern char given parser, - // parser’s token index and "#". + // parser's token index and "#". return is_non_special_pattern_char(token_index, '#'); } template constexpr bool constructor_string_parser::is_search_prefix() { - // If result of running is a non-special pattern char given parser, parser’s + // If result of running is a non-special pattern char given parser, parser's // token index and "?" is true, then return true. if (is_non_special_pattern_char(token_index, '?')) { return true; } - // If parser’s token list[parser’s token index]'s value is not "?", then + // If parser's token list[parser's token index]'s value is not "?", then // return false. if (token_list[token_index].value != "?") { return false; @@ -9452,17 +9474,17 @@ constexpr bool constructor_string_parser::is_search_prefix() { // If previous index is less than 0, then return true. if (token_index == 0) return true; - // Let previous index be parser’s token index − 1. + // Let previous index be parser's token index - 1. auto previous_index = token_index - 1; // Let previous token be the result of running get a safe token given parser // and previous index. auto previous_token = get_safe_token(previous_index); ADA_ASSERT_TRUE(previous_token); // If any of the following are true, then return false: - // - previous token’s type is "name". - // - previous token’s type is "regexp". - // - previous token’s type is "close". - // - previous token’s type is "asterisk". + // - previous token's type is "name". + // - previous token's type is "regexp". + // - previous token's type is "close". + // - previous token's type is "asterisk". return !(previous_token->type == token_type::NAME || previous_token->type == token_type::REGEXP || previous_token->type == token_type::CLOSE || @@ -9477,7 +9499,7 @@ constructor_string_parser::is_non_special_pattern_char( auto token = get_safe_token(index); ADA_ASSERT_TRUE(token); - // If token’s value is not value, then return false. + // If token's value is not value, then return false. // TODO: Remove this once we make sure get_safe_token returns a non-empty // string. if (!token->value.empty() && @@ -9486,9 +9508,9 @@ constructor_string_parser::is_non_special_pattern_char( } // If any of the following are true: - // - token’s type is "char"; - // - token’s type is "escaped-char"; or - // - token’s type is "invalid-char", + // - token's type is "char"; + // - token's type is "escaped-char"; or + // - token's type is "invalid-char", // - then return true. return token->type == token_type::CHAR || token->type == token_type::ESCAPED_CHAR || @@ -9498,17 +9520,17 @@ constructor_string_parser::is_non_special_pattern_char( template constexpr const token* constructor_string_parser::get_safe_token(size_t index) const { - // If index is less than parser’s token list's size, then return parser’s + // If index is less than parser's token list's size, then return parser's // token list[index]. if (index < token_list.size()) [[likely]] { return &token_list[index]; } - // Assert: parser’s token list's size is greater than or equal to 1. + // Assert: parser's token list's size is greater than or equal to 1. ADA_ASSERT_TRUE(!token_list.empty()); - // Let token be parser’s token list[last index]. - // Assert: token’s type is "end". + // Let token be parser's token list[last index]. + // Assert: token's type is "end". ADA_ASSERT_TRUE(token_list.back().type == token_type::END); // Return token. @@ -9518,7 +9540,7 @@ constructor_string_parser::get_safe_token(size_t index) const { template constexpr bool constructor_string_parser::is_group_open() const { - // If parser’s token list[parser’s token index]'s type is "open", then return + // If parser's token list[parser's token index]'s type is "open", then return // true. return token_list[token_index].type == token_type::OPEN; } @@ -9526,7 +9548,7 @@ constexpr bool constructor_string_parser::is_group_open() template constexpr bool constructor_string_parser::is_group_close() const { - // If parser’s token list[parser’s token index]'s type is "close", then return + // If parser's token list[parser's token index]'s type is "close", then return // true. return token_list[token_index].type == token_type::CLOSE; } @@ -9535,12 +9557,12 @@ template constexpr bool constructor_string_parser::next_is_authority_slashes() const { // If the result of running is a non-special pattern char given parser, - // parser’s token index + 1, and "/" is false, then return false. + // parser's token index + 1, and "/" is false, then return false. if (!is_non_special_pattern_char(token_index + 1, '/')) { return false; } // If the result of running is a non-special pattern char given parser, - // parser’s token index + 2, and "/" is false, then return false. + // parser's token index + 2, and "/" is false, then return false. if (!is_non_special_pattern_char(token_index + 2, '/')) { return false; } @@ -9551,15 +9573,15 @@ template constexpr bool constructor_string_parser::is_protocol_suffix() const { // Return the result of running is a non-special pattern char given parser, - // parser’s token index, and ":". + // parser's token index, and ":". return is_non_special_pattern_char(token_index, ':'); } template void constructor_string_parser::change_state(State new_state, size_t skip) { - // If parser’s state is not "init", not "authority", and not "done", then set - // parser’s result[parser’s state] to the result of running make a component + // If parser's state is not "init", not "authority", and not "done", then set + // parser's result[parser's state] to the result of running make a component // string given parser. if (state != State::INIT && state != State::AUTHORITY && state != State::DONE) { @@ -9603,11 +9625,11 @@ void constructor_string_parser::change_state(State new_state, } } - // If parser’s state is not "init" and new state is not "done", then: + // If parser's state is not "init" and new state is not "done", then: if (state != State::INIT && new_state != State::DONE) { - // If parser’s state is "protocol", "authority", "username", or "password"; - // new state is "port", "pathname", "search", or "hash"; and parser’s - // result["hostname"] does not exist, then set parser’s result["hostname"] + // If parser's state is "protocol", "authority", "username", or "password"; + // new state is "port", "pathname", "search", or "hash"; and parser's + // result["hostname"] does not exist, then set parser's result["hostname"] // to the empty string. if ((state == State::PROTOCOL || state == State::AUTHORITY || state == State::USERNAME || state == State::PASSWORD) && @@ -9617,8 +9639,8 @@ void constructor_string_parser::change_state(State new_state, result.hostname = ""; } - // If parser’s state is "protocol", "authority", "username", "password", - // "hostname", or "port"; new state is "search" or "hash"; and parser’s + // If parser's state is "protocol", "authority", "username", "password", + // "hostname", or "port"; new state is "search" or "hash"; and parser's // result["pathname"] does not exist, then: if ((state == State::PROTOCOL || state == State::AUTHORITY || state == State::USERNAME || state == State::PASSWORD || @@ -9628,14 +9650,14 @@ void constructor_string_parser::change_state(State new_state, if (protocol_matches_a_special_scheme_flag) { result.pathname = "/"; } else { - // Otherwise, set parser’s result["pathname"] to the empty string. + // Otherwise, set parser's result["pathname"] to the empty string. result.pathname = ""; } } - // If parser’s state is "protocol", "authority", "username", "password", - // "hostname", "port", or "pathname"; new state is "hash"; and parser’s - // result["search"] does not exist, then set parser’s result["search"] to + // If parser's state is "protocol", "authority", "username", "password", + // "hostname", "port", or "pathname"; new state is "hash"; and parser's + // result["search"] does not exist, then set parser's result["search"] to // the empty string. if ((state == State::PROTOCOL || state == State::AUTHORITY || state == State::USERNAME || state == State::PASSWORD || @@ -9645,32 +9667,32 @@ void constructor_string_parser::change_state(State new_state, result.search = ""; } - // Set parser’s state to new state. + // Set parser's state to new state. state = new_state; - // Increment parser’s token index by skip. + // Increment parser's token index by skip. token_index += skip; - // Set parser’s component start to parser’s token index. + // Set parser's component start to parser's token index. component_start = token_index; - // Set parser’s token increment to 0. + // Set parser's token increment to 0. token_increment = 0; } template std::string constructor_string_parser::make_component_string() { - // Assert: parser’s token index is less than parser’s token list's size. + // Assert: parser's token index is less than parser's token list's size. ADA_ASSERT_TRUE(token_index < token_list.size()); - // Let token be parser’s token list[parser’s token index]. - // Let end index be token’s index. + // Let token be parser's token list[parser's token index]. + // Let end index be token's index. const auto end_index = token_list[token_index].index; // Let component start token be the result of running get a safe token given - // parser and parser’s component start. + // parser and parser's component start. const auto component_start_token = get_safe_token(component_start); ADA_ASSERT_TRUE(component_start_token); - // Let component start input index be component start token’s index. + // Let component start input index be component start token's index. const auto component_start_input_index = component_start_token->index; // Return the code point substring from component start input index to end - // index within parser’s input. + // index within parser's input. return input.substr(component_start_input_index, end_index - component_start_input_index); } @@ -9679,7 +9701,7 @@ template constexpr bool constructor_string_parser::is_an_identity_terminator() const { // Return the result of running is a non-special pattern char given parser, - // parser’s token index, and "@". + // parser's token index, and "@". return is_non_special_pattern_char(token_index, '@'); } @@ -9687,7 +9709,7 @@ template constexpr bool constructor_string_parser::is_pathname_start() const { // Return the result of running is a non-special pattern char given parser, - // parser’s token index, and "/". + // parser's token index, and "/". return is_non_special_pattern_char(token_index, '/'); } @@ -9695,7 +9717,7 @@ template constexpr bool constructor_string_parser::is_password_prefix() const { // Return the result of running is a non-special pattern char given parser, - // parser’s token index, and ":". + // parser's token index, and ":". return is_non_special_pattern_char(token_index, ':'); } @@ -9703,7 +9725,7 @@ template constexpr bool constructor_string_parser::is_an_ipv6_open() const { // Return the result of running is a non-special pattern char given parser, - // parser’s token index, and "[". + // parser's token index, and "[". return is_non_special_pattern_char(token_index, '['); } @@ -9711,7 +9733,7 @@ template constexpr bool constructor_string_parser::is_an_ipv6_close() const { // Return the result of running is a non-special pattern char given parser, - // parser’s token index, and "]". + // parser's token index, and "]". return is_non_special_pattern_char(token_index, ']'); } @@ -9719,7 +9741,7 @@ template constexpr bool constructor_string_parser::is_port_prefix() const { // Return the result of running is a non-special pattern char given parser, - // parser’s token index, and ":". + // parser's token index, and ":". return is_non_special_pattern_char(token_index, ':'); } @@ -9773,7 +9795,7 @@ constexpr void Tokenizer::get_next_code_point() { constexpr void Tokenizer::seek_and_get_next_code_point(size_t new_index) { ada_log("Tokenizer::seek_and_get_next_code_point called with new_index=", new_index); - // Set tokenizer’s next index to index. + // Set tokenizer's next index to index. next_index = new_index; // Run get the next code point given tokenizer. get_next_code_point(); @@ -9786,21 +9808,21 @@ inline void Tokenizer::add_token(token_type type, size_t next_position, ADA_ASSERT_TRUE(next_position >= value_position); // Let token be a new token. - // Set token’s type to type. - // Set token’s index to tokenizer’s index. - // Set token’s value to the code point substring from value position with - // length value length within tokenizer’s input. - // Append token to the back of tokenizer’s token list. + // Set token's type to type. + // Set token's index to tokenizer's index. + // Set token's value to the code point substring from value position with + // length value length within tokenizer's input. + // Append token to the back of tokenizer's token list. token_list.emplace_back(type, index, input.substr(value_position, value_length)); - // Set tokenizer’s index to next position. + // Set tokenizer's index to next position. index = next_position; } inline void Tokenizer::add_token_with_default_length(token_type type, size_t next_position, size_t value_position) { - // Let computed length be next position − value position. + // Let computed length be next position - value position. auto computed_length = next_position - value_position; // Run add a token given tokenizer, type, next position, value position, and // computed length. @@ -9810,21 +9832,21 @@ inline void Tokenizer::add_token_with_default_length(token_type type, inline void Tokenizer::add_token_with_defaults(token_type type) { ada_log("Tokenizer::add_token_with_defaults called with type=", to_string(type)); - // Run add a token with default length given tokenizer, type, tokenizer’s next - // index, and tokenizer’s index. + // Run add a token with default length given tokenizer, type, tokenizer's next + // index, and tokenizer's index. add_token_with_default_length(type, next_index, index); } inline ada_warn_unused std::optional Tokenizer::process_tokenizing_error(size_t next_position, size_t value_position) { - // If tokenizer’s policy is "strict", then throw a TypeError. + // If tokenizer's policy is "strict", then throw a TypeError. if (policy == token_policy::strict) { ada_log("process_tokenizing_error failed with next_position=", next_position, " value_position=", value_position); return errors::type_error; } - // Assert: tokenizer’s policy is "lenient". + // Assert: tokenizer's policy is "lenient". ADA_ASSERT_TRUE(policy == token_policy::lenient); // Run add a token with default length given tokenizer, "invalid-char", next // position, and value position. @@ -9865,13 +9887,13 @@ template token* url_pattern_parser::try_consume_token(token_type type) { ada_log("url_pattern_parser::try_consume_token called with type=", to_string(type)); - // Assert: parser’s index is less than parser’s token list size. + // Assert: parser's index is less than parser's token list size. ADA_ASSERT_TRUE(index < tokens.size()); - // Let next token be parser’s token list[parser’s index]. + // Let next token be parser's token list[parser's index]. auto& next_token = tokens[index]; - // If next token’s type is not type return null. + // If next token's type is not type return null. if (next_token.type != type) return nullptr; - // Increase parser’s index by 1. + // Increase parser's index by 1. index++; // Return next token. return &next_token; @@ -9891,7 +9913,7 @@ std::string url_pattern_parser::consume_text() { if (!token) token = try_consume_token(token_type::ESCAPED_CHAR); // If token is null, then break. if (!token) break; - // Append token’s value to the end of result. + // Append token's value to the end of result. result.append(token->value); } // Return result. @@ -9910,23 +9932,23 @@ bool url_pattern_parser::consume_required_token(token_type type) { template std::optional url_pattern_parser::maybe_add_part_from_the_pending_fixed_value() { - // If parser’s pending fixed value is the empty string, then return. + // If parser's pending fixed value is the empty string, then return. if (pending_fixed_value.empty()) { ada_log("pending_fixed_value is empty"); return std::nullopt; } - // Let encoded value be the result of running parser’s encoding callback given - // parser’s pending fixed value. + // Let encoded value be the result of running parser's encoding callback given + // parser's pending fixed value. auto encoded_value = encoding_callback(pending_fixed_value); if (!encoded_value) { ada_log("failed to encode pending_fixed_value: ", pending_fixed_value); return encoded_value.error(); } - // Set parser’s pending fixed value to the empty string. + // Set parser's pending fixed value to the empty string. pending_fixed_value.clear(); // Let part be a new part whose type is "fixed-text", value is encoded value, // and modifier is "none". - // Append part to parser’s part list. + // Append part to parser's part list. parts.emplace_back(url_pattern_part_type::FIXED_TEXT, std::move(*encoded_value), url_pattern_part_modifier::none); @@ -9941,15 +9963,15 @@ std::optional url_pattern_parser::add_part( auto modifier = url_pattern_part_modifier::none; // If modifier token is not null: if (modifier_token) { - // If modifier token’s value is "?" then set modifier to "optional". + // If modifier token's value is "?" then set modifier to "optional". if (modifier_token->value == "?") { modifier = url_pattern_part_modifier::optional; } else if (modifier_token->value == "*") { - // Otherwise if modifier token’s value is "*" then set modifier to + // Otherwise if modifier token's value is "*" then set modifier to // "zero-or-more". modifier = url_pattern_part_modifier::zero_or_more; } else if (modifier_token->value == "+") { - // Otherwise if modifier token’s value is "+" then set modifier to + // Otherwise if modifier token's value is "+" then set modifier to // "one-or-more". modifier = url_pattern_part_modifier::one_or_more; } @@ -9958,7 +9980,7 @@ std::optional url_pattern_parser::add_part( // is "none": if (!name_token && !regexp_or_wildcard_token && modifier == url_pattern_part_modifier::none) { - // Append prefix to the end of parser’s pending fixed value. + // Append prefix to the end of parser's pending fixed value. pending_fixed_value.append(prefix); return std::nullopt; } @@ -9972,7 +9994,7 @@ std::optional url_pattern_parser::add_part( ADA_ASSERT_TRUE(suffix.empty()); // If prefix is the empty string, then return. if (prefix.empty()) return std::nullopt; - // Let encoded value be the result of running parser’s encoding callback + // Let encoded value be the result of running parser's encoding callback // given prefix. auto encoded_value = encoding_callback(prefix); if (!encoded_value) { @@ -9980,28 +10002,28 @@ std::optional url_pattern_parser::add_part( } // Let part be a new part whose type is "fixed-text", value is encoded // value, and modifier is modifier. - // Append part to parser’s part list. + // Append part to parser's part list. parts.emplace_back(url_pattern_part_type::FIXED_TEXT, std::move(*encoded_value), modifier); return std::nullopt; } // Let regexp value be the empty string. std::string regexp_value{}; - // If regexp or wildcard token is null, then set regexp value to parser’s + // If regexp or wildcard token is null, then set regexp value to parser's // segment wildcard regexp. if (!regexp_or_wildcard_token) { regexp_value = segment_wildcard_regexp; } else if (regexp_or_wildcard_token->type == token_type::ASTERISK) { - // Otherwise if regexp or wildcard token’s type is "asterisk", then set + // Otherwise if regexp or wildcard token's type is "asterisk", then set // regexp value to the full wildcard regexp value. regexp_value = ".*"; } else { - // Otherwise set regexp value to regexp or wildcard token’s value. + // Otherwise set regexp value to regexp or wildcard token's value. regexp_value = regexp_or_wildcard_token->value; } // Let type be "regexp". auto type = url_pattern_part_type::REGEXP; - // If regexp value is parser’s segment wildcard regexp: + // If regexp value is parser's segment wildcard regexp: if (regexp_value == segment_wildcard_regexp) { // Set type to "segment-wildcard". type = url_pattern_part_type::SEGMENT_WILDCARD; @@ -10016,14 +10038,14 @@ std::optional url_pattern_parser::add_part( } // Let name be the empty string. std::string name{}; - // If name token is not null, then set name to name token’s value. + // If name token is not null, then set name to name token's value. if (name_token) { name = name_token->value; } else if (regexp_or_wildcard_token != nullptr) { // Otherwise if regexp or wildcard token is not null: - // Set name to parser’s next numeric name, serialized. + // Set name to parser's next numeric name, serialized. name = std::to_string(next_numeric_name); - // Increment parser’s next numeric name by 1. + // Increment parser's next numeric name by 1. next_numeric_name++; } // If the result of running is a duplicate name given parser and name is @@ -10032,18 +10054,18 @@ std::optional url_pattern_parser::add_part( parts, [&name](const auto& part) { return part.name == name; })) { return errors::type_error; } - // Let encoded prefix be the result of running parser’s encoding callback + // Let encoded prefix be the result of running parser's encoding callback // given prefix. auto encoded_prefix = encoding_callback(prefix); if (!encoded_prefix) return encoded_prefix.error(); - // Let encoded suffix be the result of running parser’s encoding callback + // Let encoded suffix be the result of running parser's encoding callback // given suffix. auto encoded_suffix = encoding_callback(suffix); if (!encoded_suffix) return encoded_suffix.error(); // Let part be a new part whose type is type, value is regexp value, // modifier is modifier, name is name, prefix is encoded prefix, and suffix // is encoded suffix. - // Append part to parser’s part list. + // Append part to parser's part list. parts.emplace_back(type, std::move(regexp_value), modifier, std::move(name), std::move(*encoded_prefix), std::move(*encoded_suffix)); return std::nullopt; @@ -10059,7 +10081,7 @@ tl::expected, errors> parse_pattern_string( // segment wildcard regexp given options. auto parser = url_pattern_parser( encoding_callback, generate_segment_wildcard_regexp(options)); - // Set parser’s token list to the result of running tokenize given input and + // Set parser's token list to the result of running tokenize given input and // "strict". auto tokenize_result = tokenize(input, token_policy::strict); if (!tokenize_result) { @@ -10068,7 +10090,7 @@ tl::expected, errors> parse_pattern_string( } parser.tokens = std::move(*tokenize_result); - // While parser’s index is less than parser’s token list's size: + // While parser's index is less than parser's token list's size: while (parser.can_continue()) { // Let char token be the result of running try to consume a token given // parser and "char". @@ -10084,11 +10106,11 @@ tl::expected, errors> parse_pattern_string( if (name_token || regexp_or_wildcard_token) { // Let prefix be the empty string. std::string prefix{}; - // If char token is not null then set prefix to char token’s value. + // If char token is not null then set prefix to char token's value. if (char_token) prefix = char_token->value; - // If prefix is not the empty string and not options’s prefix code point: + // If prefix is not the empty string and not options's prefix code point: if (!prefix.empty() && prefix != options.get_prefix()) { - // Append prefix to the end of parser’s pending fixed value. + // Append prefix to the end of parser's pending fixed value. parser.pending_fixed_value.append(prefix); // Set prefix to the empty string. prefix.clear(); @@ -10121,7 +10143,7 @@ tl::expected, errors> parse_pattern_string( fixed_token = parser.try_consume_token(token_type::ESCAPED_CHAR); // If fixed token is not null: if (fixed_token) { - // Append fixed token’s value to parser’s pending fixed value. + // Append fixed token's value to parser's pending fixed value. parser.pending_fixed_value.append(fixed_token->value); // Continue. continue; @@ -10171,7 +10193,7 @@ tl::expected, errors> parse_pattern_string( } } ada_log("parser.parts size is: ", parser.parts.size()); - // Return parser’s part list. + // Return parser's part list. return parser.parts; } @@ -10207,7 +10229,7 @@ inline std::optional constructor_string_parser< return protocol_component.error(); } // If the result of running protocol component matches a special scheme given - // protocol component is true, then set parser’s protocol matches a special + // protocol component is true, then set parser's protocol matches a special // scheme flag to true. if (protocol_component_matches_special_scheme(*protocol_component)) { protocol_matches_a_special_scheme_flag = true; @@ -10227,14 +10249,14 @@ constructor_string_parser::parse(std::string_view input) { } auto parser = constructor_string_parser(input, std::move(*token_list)); - // While parser’s token index is less than parser’s token list size: + // While parser's token index is less than parser's token list size: while (parser.token_index < parser.token_list.size()) { - // Set parser’s token increment to 1. + // Set parser's token increment to 1. parser.token_increment = 1; - // If parser’s token list[parser’s token index]'s type is "end" then: + // If parser's token list[parser's token index]'s type is "end" then: if (parser.token_list[parser.token_index].type == token_type::END) { - // If parser’s state is "init": + // If parser's state is "init": if (parser.state == State::INIT) { // Run rewind given parser. parser.rewind(); @@ -10250,18 +10272,18 @@ constructor_string_parser::parse(std::string_view input) { // Run change state given parser, "pathname" and 0. parser.change_state(State::PATHNAME, 0); } - // Increment parser’s token index by parser’s token increment. + // Increment parser's token index by parser's token increment. parser.token_index += parser.token_increment; // Continue. continue; } if (parser.state == State::AUTHORITY) { - // If parser’s state is "authority": + // If parser's state is "authority": // Run rewind and set state given parser, and "hostname". parser.rewind(); parser.change_state(State::HOSTNAME, 0); - // Increment parser’s token index by parser’s token increment. + // Increment parser's token index by parser's token increment. parser.token_index += parser.token_increment; // Continue. continue; @@ -10275,26 +10297,26 @@ constructor_string_parser::parse(std::string_view input) { // If the result of running is a group open given parser is true: if (parser.is_group_open()) { - // Increment parser’s group depth by 1. + // Increment parser's group depth by 1. parser.group_depth += 1; - // Increment parser’s token index by parser’s token increment. + // Increment parser's token index by parser's token increment. parser.token_index += parser.token_increment; } - // If parser’s group depth is greater than 0: + // If parser's group depth is greater than 0: if (parser.group_depth > 0) { // If the result of running is a group close given parser is true, then - // decrement parser’s group depth by 1. + // decrement parser's group depth by 1. if (parser.is_group_close()) { parser.group_depth -= 1; } else { - // Increment parser’s token index by parser’s token increment. + // Increment parser's token index by parser's token increment. parser.token_index += parser.token_increment; continue; } } - // Switch on parser’s state and run the associated steps: + // Switch on parser's state and run the associated steps: switch (parser.state) { case State::INIT: { // If the result of running is a protocol suffix given parser is true: @@ -10326,7 +10348,7 @@ constructor_string_parser::parse(std::string_view input) { // Set skip to 3. skip = 3; } else if (parser.protocol_matches_a_special_scheme_flag) { - // Otherwise if parser’s protocol matches a special scheme flag is + // Otherwise if parser's protocol matches a special scheme flag is // true, then set next state to "authority". next_state = State::AUTHORITY; } @@ -10377,17 +10399,17 @@ constructor_string_parser::parse(std::string_view input) { } case State::HOSTNAME: { // If the result of running is an IPv6 open given parser is true, then - // increment parser’s hostname IPv6 bracket depth by 1. + // increment parser's hostname IPv6 bracket depth by 1. if (parser.is_an_ipv6_open()) { parser.hostname_ipv6_bracket_depth += 1; } else if (parser.is_an_ipv6_close()) { // Otherwise if the result of running is an IPv6 close given parser is - // true, then decrement parser’s hostname IPv6 bracket depth by 1. + // true, then decrement parser's hostname IPv6 bracket depth by 1. parser.hostname_ipv6_bracket_depth -= 1; } else if (parser.is_port_prefix() && parser.hostname_ipv6_bracket_depth == 0) { // Otherwise if the result of running is a port prefix given parser is - // true and parser’s hostname IPv6 bracket depth is zero, then run + // true and parser's hostname IPv6 bracket depth is zero, then run // change state given parser, "port", and 1. parser.change_state(State::PORT, 1); } else if (parser.is_pathname_start()) { @@ -10440,6 +10462,7 @@ constructor_string_parser::parse(std::string_view input) { if (parser.is_hash_prefix()) { parser.change_state(State::HASH, 1); } + break; } case State::HASH: { // Do nothing @@ -10451,17 +10474,17 @@ constructor_string_parser::parse(std::string_view input) { } } - // Increment parser’s token index by parser’s token increment. + // Increment parser's token index by parser's token increment. parser.token_index += parser.token_increment; } - // If parser’s result contains "hostname" and not "port", then set parser’s + // If parser's result contains "hostname" and not "port", then set parser's // result["port"] to the empty string. if (parser.result.hostname && !parser.result.port) { parser.result.port = ""; } - // Return parser’s result. + // Return parser's result. return parser.result; } @@ -10469,6 +10492,7 @@ constructor_string_parser::parse(std::string_view input) { #endif /* end file include/ada/url_pattern_helpers-inl.h */ +#endif // ADA_INCLUDE_URL_PATTERN // Public API /* begin file include/ada/ada_version.h */ @@ -10479,14 +10503,14 @@ constructor_string_parser::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.1.3" +#define ADA_VERSION "3.2.1" namespace ada { enum { ADA_VERSION_MAJOR = 3, - ADA_VERSION_MINOR = 1, - ADA_VERSION_REVISION = 3, + ADA_VERSION_MINOR = 2, + ADA_VERSION_REVISION = 1, }; } // namespace ada @@ -10500,20 +10524,25 @@ enum { #ifndef ADA_IMPLEMENTATION_INL_H #define ADA_IMPLEMENTATION_INL_H +#if ADA_INCLUDE_URL_PATTERN +#endif // ADA_INCLUDE_URL_PATTERN + #include #include namespace ada { +#if ADA_INCLUDE_URL_PATTERN template ada_warn_unused tl::expected, errors> -parse_url_pattern(std::variant input, +parse_url_pattern(std::variant&& input, const std::string_view* base_url, const url_pattern_options* options) { return parser::parse_url_pattern_impl(std::move(input), base_url, options); } +#endif // ADA_INCLUDE_URL_PATTERN } // namespace ada diff --git a/tests/files/urltestdata.json b/tests/files/urltestdata.json index 7669217..214ed08 100644 --- a/tests/files/urltestdata.json +++ b/tests/files/urltestdata.json @@ -8507,6 +8507,21 @@ "search": "", "username": "" }, + { + "input": "non-special:cannot-be-a-base-url-!\"$%&'()*+,-.;<=>@[\\]^_`{|}~@/", + "base": null, + "hash": "", + "host": "", + "hostname": "", + "href": "non-special:cannot-be-a-base-url-!\"$%&'()*+,-.;<=>@[\\]^_`{|}~@/", + "origin": "null", + "password": "", + "pathname": "cannot-be-a-base-url-!\"$%&'()*+,-.;<=>@[\\]^_`{|}~@/", + "port": "", + "protocol": "non-special:", + "search": "", + "username": "" + }, { "input": "https://www.example.com/path{\u007Fpath.html?query'\u007F=query#fragment<\u007Ffragment", "base": null, @@ -8634,10 +8649,10 @@ "hash": "", "host": "host", "hostname": "host", - "href": "foo://host/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]^_%60%7B|%7D~", + "href": "foo://host/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]%5E_%60%7B|%7D~", "origin": "null", "password": "", - "pathname": "/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]^_%60%7B|%7D~", + "pathname": "/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]%5E_%60%7B|%7D~", "port":"", "protocol": "foo:", "search": "", @@ -8649,10 +8664,10 @@ "hash": "", "host": "host", "hostname": "host", - "href": "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]^_%60%7B|%7D~", + "href": "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]%5E_%60%7B|%7D~", "origin": "wss://host", "password": "", - "pathname": "/%20!%22$%&'()*+,-./:;%3C=%3E@[/]^_%60%7B|%7D~", + "pathname": "/%20!%22$%&'()*+,-./:;%3C=%3E@[/]%5E_%60%7B|%7D~", "port":"", "protocol": "wss:", "search": "", From e005613189a9f4454d1bb9ba5533764e8e30eddc Mon Sep 17 00:00:00 2001 From: Bo Bayles Date: Tue, 11 Mar 2025 10:35:51 -0500 Subject: [PATCH 6/9] Bump version to 1.21.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6c0f5a8..4ab007f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ada-url" -version = "1.19.0" +version = "1.21.0" authors = [ {name = "Bo Bayles", email = "bo@bbayles.com"}, ] From c4841a6e2cd24dd858e509f228527eb9973a0483 Mon Sep 17 00:00:00 2001 From: Bo Bayles Date: Wed, 12 Mar 2025 11:24:41 -0500 Subject: [PATCH 7/9] Update type hint for idna.encode (#107) --- ada_url/ada_adapter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ada_url/ada_adapter.py b/ada_url/ada_adapter.py index 462e3cd..0139bcc 100644 --- a/ada_url/ada_adapter.py +++ b/ada_url/ada_adapter.py @@ -743,7 +743,7 @@ def decode(s: Union[str, bytes]) -> str: return _get_str(data) @staticmethod - def encode(s: Union[str, bytes]) -> str: + def encode(s: Union[str, bytes]) -> bytes: if isinstance(s, str): s = s.encode() From 3a3c708dc70a11cf7acedb4a8f6469ddc7e47dc7 Mon Sep 17 00:00:00 2001 From: Bo Bayles Date: Tue, 1 Apr 2025 09:07:09 -0500 Subject: [PATCH 8/9] Changes for version 1.22.0 (#108) --- ada_url/ada.cpp | 14 +++- ada_url/ada.h | 7 +- pyproject.toml | 2 +- tests/files/urltestdata.json | 120 +++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 8 deletions(-) diff --git a/ada_url/ada.cpp b/ada_url/ada.cpp index bc87c1e..854def2 100644 --- a/ada_url/ada.cpp +++ b/ada_url/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2025-03-10 13:14:56 -0400. Do not edit! */ +/* auto-generated on 2025-03-30 13:24:42 -0400. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ @@ -13334,10 +13334,18 @@ result_type parse_url_impl(std::string_view user_input, 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. - url.update_base_pathname(unicode::percent_encode( - view, character_sets::C0_CONTROL_PERCENT_ENCODE)); + if (view.ends_with(' ')) { + std::string modified_view = + std::string(view.begin(), view.end() - 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: { diff --git a/ada_url/ada.h b/ada_url/ada.h index da4c919..821066a 100644 --- a/ada_url/ada.h +++ b/ada_url/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2025-03-10 13:14:56 -0400. Do not edit! */ +/* auto-generated on 2025-03-30 13:24:42 -0400. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -5859,7 +5859,6 @@ tl::expected, errors> parse_url_pattern_impl( // TODO: Optimization opportunity. if (scheme::is_special(*processed_init->protocol)) { std::string_view port = processed_init->port.value(); - helpers::trim_c0_whitespace(port); if (std::to_string(scheme::get_special_port(*processed_init->protocol)) == port) { processed_init->port->clear(); @@ -10503,14 +10502,14 @@ constructor_string_parser::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.2.1" +#define ADA_VERSION "3.2.2" namespace ada { enum { ADA_VERSION_MAJOR = 3, ADA_VERSION_MINOR = 2, - ADA_VERSION_REVISION = 1, + ADA_VERSION_REVISION = 2, }; } // namespace ada diff --git a/pyproject.toml b/pyproject.toml index 4ab007f..7e64100 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ada-url" -version = "1.21.0" +version = "1.22.0" authors = [ {name = "Bo Bayles", email = "bo@bbayles.com"}, ] diff --git a/tests/files/urltestdata.json b/tests/files/urltestdata.json index 214ed08..d1a06f6 100644 --- a/tests/files/urltestdata.json +++ b/tests/files/urltestdata.json @@ -3778,6 +3778,126 @@ "search": "", "hash": "" }, + { + "input": "non-special:opaque ", + "base": null, + "href": "non-special:opaque", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "opaque", + "search": "", + "hash": "" + }, + { + "input": "non-special:opaque ?hi", + "base": null, + "href": "non-special:opaque %20?hi", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "opaque %20", + "search": "?hi", + "hash": "" + }, + { + "input": "non-special:opaque #hi", + "base": null, + "href": "non-special:opaque %20#hi", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "opaque %20", + "search": "", + "hash": "#hi" + }, + { + "input": "non-special:opaque x?hi", + "base": null, + "href": "non-special:opaque x?hi", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "opaque x", + "search": "?hi", + "hash": "" + }, + { + "input": "non-special:opaque x#hi", + "base": null, + "href": "non-special:opaque x#hi", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "opaque x", + "search": "", + "hash": "#hi" + }, + { + "input": "non-special:opaque \t\t \t#hi", + "base": null, + "href": "non-special:opaque %20#hi", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "opaque %20", + "search": "", + "hash": "#hi" + }, + { + "input": "non-special:opaque \t\t #hi", + "base": null, + "href": "non-special:opaque %20#hi", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "opaque %20", + "search": "", + "hash": "#hi" + }, + { + "input": "non-special:opaque\t\t \r #hi", + "base": null, + "href": "non-special:opaque %20#hi", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "opaque %20", + "search": "", + "hash": "#hi" + }, "Ideographic full stop (full-width period for Chinese, etc.) should be treated as a dot. U+3002 is mapped to U+002E (dot)", { "input": "http://www.foo。bar.com", From 0097d6319b1e4d17dafe90835bb926274590b65a Mon Sep 17 00:00:00 2001 From: Bo Bayles Date: Mon, 28 Apr 2025 13:43:42 -0500 Subject: [PATCH 9/9] Changes for version 1.23.0 / ada 3.2.4 (#110) --- ada_url/ada.cpp | 80 +++++++++++++++++++++++++------------------- ada_url/ada.h | 36 +++++++++----------- ada_url/ada_build.py | 1 + pyproject.toml | 2 +- 4 files changed, 62 insertions(+), 57 deletions(-) diff --git a/ada_url/ada.cpp b/ada_url/ada.cpp index 854def2..d4f228e 100644 --- a/ada_url/ada.cpp +++ b/ada_url/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2025-03-30 13:24:42 -0400. Do not edit! */ +/* auto-generated on 2025-04-28 12:16:36 -0400. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ @@ -56,8 +56,8 @@ ada_really_inline constexpr bool is_ipv4(std::string_view view) noexcept { } // We have 0x followed by some characters, we need to check that they are // hexadecimals. - return std::all_of(view.begin() + 2, view.end(), - ada::unicode::is_lowercase_hex); + 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 @@ -10421,6 +10421,8 @@ ADA_POP_DISABLE_WARNINGS #include #endif +#include + namespace ada::unicode { constexpr bool is_tabs_or_newline(char c) noexcept { @@ -10461,8 +10463,7 @@ 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::any_of(user_input.begin(), user_input.end(), - is_tabs_or_newline); + return std::ranges::any_of(user_input, is_tabs_or_newline); } // fast path for long strings (expected to be common) size_t i = 0; @@ -10500,8 +10501,7 @@ 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::any_of(user_input.begin(), user_input.end(), - is_tabs_or_newline); + return std::ranges::any_of(user_input, is_tabs_or_newline); } // fast path for long strings (expected to be common) size_t i = 0; @@ -10832,10 +10832,9 @@ 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::find_if(input.begin(), input.end(), [character_set](const char c) { - return character_sets::bit_at(character_set, c); - }); + 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)); @@ -11636,15 +11635,20 @@ ada_really_inline void parse_prepared_path(std::string_view input, // 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 = input.find("/."); - if (slashdot == std::string_view::npos) { // common case - trivial_path = true; - } else { // uncommon - // only three cases matter: /./, /.. or a final / - trivial_path = - !(slashdot + 2 == input.size() || input[slashdot + 2] == '.' || - input[slashdot + 2] == '/'); + 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) { @@ -11845,6 +11849,7 @@ ada_warn_unused std::string to_string(ada::state state) { #include #include +#include #include #include @@ -11852,8 +11857,7 @@ 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.begin(), input.end(), - ada::unicode::is_forbidden_host_code_point)) { + if (std::ranges::any_of(input, ada::unicode::is_forbidden_host_code_point)) { return is_valid = false; } @@ -12720,6 +12724,7 @@ bool url::set_href(const std::string_view input) { /* begin file src/parser.cpp */ #include +#include namespace ada::parser { @@ -13339,7 +13344,7 @@ result_type parse_url_impl(std::string_view user_input, // to optimize it. if (view.ends_with(' ')) { std::string modified_view = - std::string(view.begin(), view.end() - 1) + "%20"; + 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 { @@ -13689,6 +13694,7 @@ namespace ada { /* end file src/url_components.cpp */ /* begin file src/url_aggregator.cpp */ +#include #include #include @@ -13908,7 +13914,7 @@ bool url_aggregator::set_protocol(const std::string_view input) { if (pointer != view.end() && *pointer == ':') { return parse_scheme_with_colon( - std::string_view(view.data(), pointer - view.begin() + 1)); + view.substr(0, pointer - view.begin() + 1)); } return false; } @@ -14170,8 +14176,8 @@ ada_really_inline bool url_aggregator::parse_host(std::string_view input) { ada_log("parse_host to_ascii succeeded ", *host, " [", host->size(), " bytes]"); - if (std::any_of(host.value().begin(), host.value().end(), - ada::unicode::is_forbidden_domain_code_point)) { + if (std::ranges::any_of(host.value(), + ada::unicode::is_forbidden_domain_code_point)) { return is_valid = false; } @@ -14863,8 +14869,7 @@ 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::any_of(input.begin(), input.end(), - ada::unicode::is_forbidden_host_code_point)) { + if (std::ranges::any_of(input, ada::unicode::is_forbidden_host_code_point)) { return is_valid = false; } @@ -15093,15 +15098,20 @@ inline void url_aggregator::consume_prepared_path(std::string_view input) { // 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 = input.find("/."); - if (slashdot == std::string_view::npos) { // common case - trivial_path = true; - } else { // uncommon - // only three cases matter: /./, /.. or a final / - trivial_path = - !(slashdot + 2 == input.size() || input[slashdot + 2] == '.' || - input[slashdot + 2] == '/'); + 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()) { diff --git a/ada_url/ada.h b/ada_url/ada.h index 821066a..d1a6150 100644 --- a/ada_url/ada.h +++ b/ada_url/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2025-03-30 13:24:42 -0400. Do not edit! */ +/* auto-generated on 2025-04-28 12:16:36 -0400. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -4115,7 +4115,6 @@ void swap(expected &lhs, #endif /* end file include/ada/expected.h */ -#if ADA_INCLUDE_URL_PATTERN /* begin file include/ada/url_pattern_regex.h */ /** * @file url_search_params.h @@ -4131,6 +4130,7 @@ void swap(expected &lhs, #include #endif // ADA_USE_UNSAFE_STD_REGEX_PROVIDER +#if ADA_INCLUDE_URL_PATTERN namespace ada::url_pattern_regex { template @@ -4175,7 +4175,7 @@ class std_regex_provider final { #endif // ADA_USE_UNSAFE_STD_REGEX_PROVIDER } // namespace ada::url_pattern_regex - +#endif // ADA_INCLUDE_URL_PATTERN #endif // ADA_URL_PATTERN_REGEX_H /* end file include/ada/url_pattern_regex.h */ /* begin file include/ada/url_pattern_init.h */ @@ -4209,6 +4209,7 @@ enum class errors : uint8_t { type_error }; #include #endif // ADA_TESTING +#if ADA_INCLUDE_URL_PATTERN namespace ada { // Important: C++20 allows us to use concept rather than `using` or `typedef @@ -4312,10 +4313,9 @@ struct url_pattern_init { std::optional base_url{}; }; } // namespace ada - +#endif // ADA_INCLUDE_URL_PATTERN #endif // ADA_URL_PATTERN_INIT_H /* end file include/ada/url_pattern_init.h */ -#endif // ADA_INCLUDE_URL_PATTERN /** * @private @@ -4378,7 +4378,6 @@ tl::expected, errors> parse_url_pattern_impl( #ifndef ADA_PARSER_INL_H #define ADA_PARSER_INL_H -#if ADA_INCLUDE_URL_PATTERN /* begin file include/ada/url_pattern.h */ /** * @file url_pattern.h @@ -5014,9 +5013,6 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u); #endif // ADA_URL_H /* end file include/ada/url.h */ -#if ADA_INCLUDE_URL_PATTERN -#endif // ADA_INCLUDE_URL_PATTERN - namespace ada { template @@ -5088,6 +5084,7 @@ std::string href_from_file(std::string_view path); #include #endif // ADA_TESTING +#if ADA_INCLUDE_URL_PATTERN namespace ada { enum class url_pattern_part_type : uint8_t { @@ -5420,9 +5417,8 @@ class url_pattern { */ bool ignore_case_ = false; }; - } // namespace ada - +#endif // ADA_INCLUDE_URL_PATTERN #endif /* end file include/ada/url_pattern.h */ /* begin file include/ada/url_pattern_helpers.h */ @@ -5438,6 +5434,7 @@ class url_pattern { #include #include +#if ADA_INCLUDE_URL_PATTERN namespace ada { enum class errors : uint8_t; } @@ -5769,10 +5766,9 @@ std::string generate_segment_wildcard_regexp( url_pattern_compile_component_options options); } // namespace ada::url_pattern_helpers - +#endif // ADA_INCLUDE_URL_PATTERN #endif /* end file include/ada/url_pattern_helpers.h */ -#endif // ADA_INCLUDE_URL_PATTERN #include #include @@ -8915,7 +8911,6 @@ url_search_params_entries_iter::next() { #endif // ADA_URL_SEARCH_PARAMS_INL_H /* end file include/ada/url_search_params-inl.h */ -#if ADA_INCLUDE_URL_PATTERN /* begin file include/ada/url_pattern-inl.h */ /** * @file url_pattern-inl.h @@ -8929,6 +8924,7 @@ url_search_params_entries_iter::next() { #include #include +#if ADA_INCLUDE_URL_PATTERN namespace ada { inline bool url_pattern_init::operator==(const url_pattern_init& other) const { @@ -9397,7 +9393,7 @@ result> url_pattern::match( } } // namespace ada - +#endif // ADA_INCLUDE_URL_PATTERN #endif /* end file include/ada/url_pattern-inl.h */ /* begin file include/ada/url_pattern_helpers-inl.h */ @@ -9412,6 +9408,7 @@ result> url_pattern::match( #include +#if ADA_INCLUDE_URL_PATTERN namespace ada::url_pattern_helpers { #ifdef ADA_TESTING inline std::string to_string(token_type type) { @@ -10488,10 +10485,9 @@ constructor_string_parser::parse(std::string_view input) { } } // namespace ada::url_pattern_helpers - +#endif // ADA_INCLUDE_URL_PATTERN #endif /* end file include/ada/url_pattern_helpers-inl.h */ -#endif // ADA_INCLUDE_URL_PATTERN // Public API /* begin file include/ada/ada_version.h */ @@ -10502,14 +10498,14 @@ constructor_string_parser::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.2.2" +#define ADA_VERSION "3.2.4" namespace ada { enum { ADA_VERSION_MAJOR = 3, ADA_VERSION_MINOR = 2, - ADA_VERSION_REVISION = 2, + ADA_VERSION_REVISION = 4, }; } // namespace ada @@ -10523,8 +10519,6 @@ enum { #ifndef ADA_IMPLEMENTATION_INL_H #define ADA_IMPLEMENTATION_INL_H -#if ADA_INCLUDE_URL_PATTERN -#endif // ADA_INCLUDE_URL_PATTERN #include diff --git a/ada_url/ada_build.py b/ada_url/ada_build.py index 35a9f9e..35b5f7d 100644 --- a/ada_url/ada_build.py +++ b/ada_url/ada_build.py @@ -9,6 +9,7 @@ ada_obj = Extension( 'ada', + define_macros=[('ADA_INCLUDE_URL_PATTERN', '0')], language="c++", sources=['ada_url/ada.cpp'], include_dirs=[file_dir], diff --git a/pyproject.toml b/pyproject.toml index 7e64100..a539091 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ada-url" -version = "1.22.0" +version = "1.23.0" authors = [ {name = "Bo Bayles", email = "bo@bbayles.com"}, ]