File indexing completed on 2026-09-12 09:10:03
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef FMT_FORMAT_INL_H_
0009 #define FMT_FORMAT_INL_H_
0010
0011 #ifndef FMT_MODULE
0012 # include <algorithm>
0013 # include <cerrno> // errno
0014 # include <climits>
0015 # include <cmath>
0016 # include <exception>
0017 #endif
0018
0019 #if defined(_WIN32) && !defined(FMT_USE_WRITE_CONSOLE)
0020 # include <io.h> // _isatty
0021 #endif
0022
0023 #include "format.h"
0024
0025 #if FMT_USE_LOCALE
0026 # include <locale>
0027 #endif
0028
0029 #ifndef FMT_FUNC
0030 # define FMT_FUNC
0031 #endif
0032
0033 FMT_BEGIN_NAMESPACE
0034 namespace detail {
0035
0036 FMT_FUNC void assert_fail(const char* file, int line, const char* message) {
0037
0038
0039 fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message);
0040 abort();
0041 }
0042
0043 FMT_FUNC void format_error_code(detail::buffer<char>& out, int error_code,
0044 string_view message) noexcept {
0045
0046
0047
0048 out.try_resize(0);
0049 static const char SEP[] = ": ";
0050 static const char ERROR_STR[] = "error ";
0051
0052 size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2;
0053 auto abs_value = static_cast<uint32_or_64_or_128_t<int>>(error_code);
0054 if (detail::is_negative(error_code)) {
0055 abs_value = 0 - abs_value;
0056 ++error_code_size;
0057 }
0058 error_code_size += detail::to_unsigned(detail::count_digits(abs_value));
0059 auto it = appender(out);
0060 if (message.size() <= inline_buffer_size - error_code_size)
0061 fmt::format_to(it, FMT_STRING("{}{}"), message, SEP);
0062 fmt::format_to(it, FMT_STRING("{}{}"), ERROR_STR, error_code);
0063 FMT_ASSERT(out.size() <= inline_buffer_size, "");
0064 }
0065
0066 FMT_FUNC void do_report_error(format_func func, int error_code,
0067 const char* message) noexcept {
0068 memory_buffer full_message;
0069 func(full_message, error_code, message);
0070
0071 if (std::fwrite(full_message.data(), full_message.size(), 1, stderr) > 0)
0072 std::fputc('\n', stderr);
0073 }
0074
0075
0076 inline void fwrite_all(const void* ptr, size_t count, FILE* stream) {
0077 size_t written = std::fwrite(ptr, 1, count, stream);
0078 if (written < count)
0079 FMT_THROW(system_error(errno, FMT_STRING("cannot write to file")));
0080 }
0081
0082 #if FMT_USE_LOCALE
0083 using std::locale;
0084 using std::numpunct;
0085 using std::use_facet;
0086
0087 template <typename Locale>
0088 locale_ref::locale_ref(const Locale& loc) : locale_(&loc) {
0089 static_assert(std::is_same<Locale, locale>::value, "");
0090 }
0091 #else
0092 struct locale {};
0093 template <typename Char> struct numpunct {
0094 auto grouping() const -> std::string { return "\03"; }
0095 auto thousands_sep() const -> Char { return ','; }
0096 auto decimal_point() const -> Char { return '.'; }
0097 };
0098 template <typename Facet> Facet use_facet(locale) { return {}; }
0099 #endif
0100
0101 template <typename Locale> auto locale_ref::get() const -> Locale {
0102 static_assert(std::is_same<Locale, locale>::value, "");
0103 #if FMT_USE_LOCALE
0104 if (locale_) return *static_cast<const locale*>(locale_);
0105 #endif
0106 return locale();
0107 }
0108
0109 template <typename Char>
0110 FMT_FUNC auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result<Char> {
0111 auto&& facet = use_facet<numpunct<Char>>(loc.get<locale>());
0112 auto grouping = facet.grouping();
0113 auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep();
0114 return {std::move(grouping), thousands_sep};
0115 }
0116 template <typename Char>
0117 FMT_FUNC auto decimal_point_impl(locale_ref loc) -> Char {
0118 return use_facet<numpunct<Char>>(loc.get<locale>()).decimal_point();
0119 }
0120
0121 #if FMT_USE_LOCALE
0122 FMT_FUNC auto write_loc(appender out, loc_value value,
0123 const format_specs& specs, locale_ref loc) -> bool {
0124 auto locale = loc.get<std::locale>();
0125
0126
0127 using facet = format_facet<std::locale>;
0128 if (std::has_facet<facet>(locale))
0129 return use_facet<facet>(locale).put(out, value, specs);
0130 return facet(locale).put(out, value, specs);
0131 }
0132 #endif
0133 }
0134
0135 FMT_FUNC void report_error(const char* message) {
0136 #if FMT_USE_EXCEPTIONS
0137
0138
0139 FMT_THROW(format_error(message));
0140 #else
0141 fputs(message, stderr);
0142 abort();
0143 #endif
0144 }
0145
0146 template <typename Locale> typename Locale::id format_facet<Locale>::id;
0147
0148 template <typename Locale> format_facet<Locale>::format_facet(Locale& loc) {
0149 auto& np = detail::use_facet<detail::numpunct<char>>(loc);
0150 grouping_ = np.grouping();
0151 if (!grouping_.empty()) separator_ = std::string(1, np.thousands_sep());
0152 }
0153
0154 #if FMT_USE_LOCALE
0155 template <>
0156 FMT_API FMT_FUNC auto format_facet<std::locale>::do_put(
0157 appender out, loc_value val, const format_specs& specs) const -> bool {
0158 return val.visit(
0159 detail::loc_writer<>{out, specs, separator_, grouping_, decimal_point_});
0160 }
0161 #endif
0162
0163 FMT_FUNC auto vsystem_error(int error_code, string_view fmt, format_args args)
0164 -> std::system_error {
0165 auto ec = std::error_code(error_code, std::generic_category());
0166 return std::system_error(ec, vformat(fmt, args));
0167 }
0168
0169 namespace detail {
0170
0171 template <typename F>
0172 inline auto operator==(basic_fp<F> x, basic_fp<F> y) -> bool {
0173 return x.f == y.f && x.e == y.e;
0174 }
0175
0176
0177 FMT_CONSTEXPR inline auto rotr(uint32_t n, uint32_t r) noexcept -> uint32_t {
0178 r &= 31;
0179 return (n >> r) | (n << (32 - r));
0180 }
0181 FMT_CONSTEXPR inline auto rotr(uint64_t n, uint32_t r) noexcept -> uint64_t {
0182 r &= 63;
0183 return (n >> r) | (n << (64 - r));
0184 }
0185
0186
0187 namespace dragonbox {
0188
0189
0190 inline auto umul96_upper64(uint32_t x, uint64_t y) noexcept -> uint64_t {
0191 return umul128_upper64(static_cast<uint64_t>(x) << 32, y);
0192 }
0193
0194
0195
0196 inline auto umul192_lower128(uint64_t x, uint128_fallback y) noexcept
0197 -> uint128_fallback {
0198 uint64_t high = x * y.high();
0199 uint128_fallback high_low = umul128(x, y.low());
0200 return {high + high_low.high(), high_low.low()};
0201 }
0202
0203
0204
0205 inline auto umul96_lower64(uint32_t x, uint64_t y) noexcept -> uint64_t {
0206 return x * y;
0207 }
0208
0209
0210 inline auto floor_log10_pow2_minus_log10_4_over_3(int e) noexcept -> int {
0211 FMT_ASSERT(e <= 2936 && e >= -2985, "too large exponent");
0212 return (e * 631305 - 261663) >> 21;
0213 }
0214
0215 FMT_INLINE_VARIABLE constexpr struct div_small_pow10_infos_struct {
0216 uint32_t divisor;
0217 int shift_amount;
0218 } div_small_pow10_infos[] = {{10, 16}, {100, 16}};
0219
0220
0221
0222
0223 template <int N>
0224 auto check_divisibility_and_divide_by_pow10(uint32_t& n) noexcept -> bool {
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236 constexpr auto info = div_small_pow10_infos[N - 1];
0237 FMT_ASSERT(n <= info.divisor * 10, "n is too large");
0238 constexpr uint32_t magic_number =
0239 (1u << info.shift_amount) / info.divisor + 1;
0240 n *= magic_number;
0241 const uint32_t comparison_mask = (1u << info.shift_amount) - 1;
0242 bool result = (n & comparison_mask) < magic_number;
0243 n >>= info.shift_amount;
0244 return result;
0245 }
0246
0247
0248
0249 template <int N> auto small_division_by_pow10(uint32_t n) noexcept -> uint32_t {
0250 constexpr auto info = div_small_pow10_infos[N - 1];
0251 FMT_ASSERT(n <= info.divisor * 10, "n is too large");
0252 constexpr uint32_t magic_number =
0253 (1u << info.shift_amount) / info.divisor + 1;
0254 return (n * magic_number) >> info.shift_amount;
0255 }
0256
0257
0258 inline auto divide_by_10_to_kappa_plus_1(uint32_t n) noexcept -> uint32_t {
0259
0260 return static_cast<uint32_t>((static_cast<uint64_t>(n) * 1374389535) >> 37);
0261 }
0262
0263 inline auto divide_by_10_to_kappa_plus_1(uint64_t n) noexcept -> uint64_t {
0264
0265 return umul128_upper64(n, 2361183241434822607ull) >> 7;
0266 }
0267
0268
0269 template <typename T> struct cache_accessor;
0270
0271 template <> struct cache_accessor<float> {
0272 using carrier_uint = float_info<float>::carrier_uint;
0273 using cache_entry_type = uint64_t;
0274
0275 static auto get_cached_power(int k) noexcept -> uint64_t {
0276 FMT_ASSERT(k >= float_info<float>::min_k && k <= float_info<float>::max_k,
0277 "k is out of range");
0278 static constexpr const uint64_t pow10_significands[] = {
0279 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f,
0280 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb,
0281 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28,
0282 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb,
0283 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a,
0284 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810,
0285 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
0286 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd,
0287 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424,
0288 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b,
0289 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
0290 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
0291 0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
0292 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
0293 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
0294 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
0295 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
0296 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
0297 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
0298 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985,
0299 0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297,
0300 0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7,
0301 0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21,
0302 0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe,
0303 0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a,
0304 0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f};
0305 return pow10_significands[k - float_info<float>::min_k];
0306 }
0307
0308 struct compute_mul_result {
0309 carrier_uint result;
0310 bool is_integer;
0311 };
0312 struct compute_mul_parity_result {
0313 bool parity;
0314 bool is_integer;
0315 };
0316
0317 static auto compute_mul(carrier_uint u,
0318 const cache_entry_type& cache) noexcept
0319 -> compute_mul_result {
0320 auto r = umul96_upper64(u, cache);
0321 return {static_cast<carrier_uint>(r >> 32),
0322 static_cast<carrier_uint>(r) == 0};
0323 }
0324
0325 static auto compute_delta(const cache_entry_type& cache, int beta) noexcept
0326 -> uint32_t {
0327 return static_cast<uint32_t>(cache >> (64 - 1 - beta));
0328 }
0329
0330 static auto compute_mul_parity(carrier_uint two_f,
0331 const cache_entry_type& cache,
0332 int beta) noexcept
0333 -> compute_mul_parity_result {
0334 FMT_ASSERT(beta >= 1, "");
0335 FMT_ASSERT(beta < 64, "");
0336
0337 auto r = umul96_lower64(two_f, cache);
0338 return {((r >> (64 - beta)) & 1) != 0,
0339 static_cast<uint32_t>(r >> (32 - beta)) == 0};
0340 }
0341
0342 static auto compute_left_endpoint_for_shorter_interval_case(
0343 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
0344 return static_cast<carrier_uint>(
0345 (cache - (cache >> (num_significand_bits<float>() + 2))) >>
0346 (64 - num_significand_bits<float>() - 1 - beta));
0347 }
0348
0349 static auto compute_right_endpoint_for_shorter_interval_case(
0350 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
0351 return static_cast<carrier_uint>(
0352 (cache + (cache >> (num_significand_bits<float>() + 1))) >>
0353 (64 - num_significand_bits<float>() - 1 - beta));
0354 }
0355
0356 static auto compute_round_up_for_shorter_interval_case(
0357 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
0358 return (static_cast<carrier_uint>(
0359 cache >> (64 - num_significand_bits<float>() - 2 - beta)) +
0360 1) /
0361 2;
0362 }
0363 };
0364
0365 template <> struct cache_accessor<double> {
0366 using carrier_uint = float_info<double>::carrier_uint;
0367 using cache_entry_type = uint128_fallback;
0368
0369 static auto get_cached_power(int k) noexcept -> uint128_fallback {
0370 FMT_ASSERT(k >= float_info<double>::min_k && k <= float_info<double>::max_k,
0371 "k is out of range");
0372
0373 static constexpr const uint128_fallback pow10_significands[] = {
0374 #if FMT_USE_FULL_CACHE_DRAGONBOX
0375 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
0376 {0x9faacf3df73609b1, 0x77b191618c54e9ad},
0377 {0xc795830d75038c1d, 0xd59df5b9ef6a2418},
0378 {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},
0379 {0x9becce62836ac577, 0x4ee367f9430aec33},
0380 {0xc2e801fb244576d5, 0x229c41f793cda740},
0381 {0xf3a20279ed56d48a, 0x6b43527578c11110},
0382 {0x9845418c345644d6, 0x830a13896b78aaaa},
0383 {0xbe5691ef416bd60c, 0x23cc986bc656d554},
0384 {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},
0385 {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa},
0386 {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},
0387 {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69},
0388 {0x91376c36d99995be, 0x23100809b9c21fa2},
0389 {0xb58547448ffffb2d, 0xabd40a0c2832a78b},
0390 {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},
0391 {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4},
0392 {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},
0393 {0xdd95317f31c7fa1d, 0x40405643d711d584},
0394 {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},
0395 {0xad1c8eab5ee43b66, 0xda3243650005eed0},
0396 {0xd863b256369d4a40, 0x90bed43e40076a83},
0397 {0x873e4f75e2224e68, 0x5a7744a6e804a292},
0398 {0xa90de3535aaae202, 0x711515d0a205cb37},
0399 {0xd3515c2831559a83, 0x0d5a5b44ca873e04},
0400 {0x8412d9991ed58091, 0xe858790afe9486c3},
0401 {0xa5178fff668ae0b6, 0x626e974dbe39a873},
0402 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
0403 {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a},
0404 {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},
0405 {0xc987434744ac874e, 0xa327ffb266b56221},
0406 {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},
0407 {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa},
0408 {0xc4ce17b399107c22, 0xcb550fb4384d21d4},
0409 {0xf6019da07f549b2b, 0x7e2a53a146606a49},
0410 {0x99c102844f94e0fb, 0x2eda7444cbfc426e},
0411 {0xc0314325637a1939, 0xfa911155fefb5309},
0412 {0xf03d93eebc589f88, 0x793555ab7eba27cb},
0413 {0x96267c7535b763b5, 0x4bc1558b2f3458df},
0414 {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},
0415 {0xea9c227723ee8bcb, 0x465e15a979c1cadd},
0416 {0x92a1958a7675175f, 0x0bfacd89ec191eca},
0417 {0xb749faed14125d36, 0xcef980ec671f667c},
0418 {0xe51c79a85916f484, 0x82b7e12780e7401b},
0419 {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811},
0420 {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},
0421 {0xdfbdcece67006ac9, 0x67a791e093e1d49b},
0422 {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},
0423 {0xaecc49914078536d, 0x58fae9f773886e19},
0424 {0xda7f5bf590966848, 0xaf39a475506a899f},
0425 {0x888f99797a5e012d, 0x6d8406c952429604},
0426 {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},
0427 {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65},
0428 {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
0429 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
0430 {0xd0601d8efc57b08b, 0xf13b94daf124da27},
0431 {0x823c12795db6ce57, 0x76c53d08d6b70859},
0432 {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},
0433 {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a},
0434 {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},
0435 {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0},
0436 {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},
0437 {0xf867241c8cc6d4c0, 0xc30163d203c94b63},
0438 {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},
0439 {0xc21094364dfb5636, 0x985915fc12f542e5},
0440 {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},
0441 {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43},
0442 {0xbd8430bd08277231, 0x50c6ff782a838354},
0443 {0xece53cec4a314ebd, 0xa4f8bf5635246429},
0444 {0x940f4613ae5ed136, 0x871b7795e136be9a},
0445 {0xb913179899f68584, 0x28e2557b59846e40},
0446 {0xe757dd7ec07426e5, 0x331aeada2fe589d0},
0447 {0x9096ea6f3848984f, 0x3ff0d2c85def7622},
0448 {0xb4bca50b065abe63, 0x0fed077a756b53aa},
0449 {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895},
0450 {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},
0451 {0xb080392cc4349dec, 0xbd8d794d96aacfb4},
0452 {0xdca04777f541c567, 0xecf0d7a0fc5583a1},
0453 {0x89e42caaf9491b60, 0xf41686c49db57245},
0454 {0xac5d37d5b79b6239, 0x311c2875c522ced6},
0455 {0xd77485cb25823ac7, 0x7d633293366b828c},
0456 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
0457 {0xa8530886b54dbdeb, 0xd9f57f830283fdfd},
0458 {0xd267caa862a12d66, 0xd072df63c324fd7c},
0459 {0x8380dea93da4bc60, 0x4247cb9e59f71e6e},
0460 {0xa46116538d0deb78, 0x52d9be85f074e609},
0461 {0xcd795be870516656, 0x67902e276c921f8c},
0462 {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},
0463 {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5},
0464 {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},
0465 {0xfad2a4b13d1b5d6c, 0x796b805720085f82},
0466 {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},
0467 {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d},
0468 {0xf4f1b4d515acb93b, 0xee92fb5515482d45},
0469 {0x991711052d8bf3c5, 0x751bdd152d4d1c4b},
0470 {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},
0471 {0xef340a98172aace4, 0x86fb897116c87c35},
0472 {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},
0473 {0xbae0a846d2195712, 0x8974836059cca10a},
0474 {0xe998d258869facd7, 0x2bd1a438703fc94c},
0475 {0x91ff83775423cc06, 0x7b6306a34627ddd0},
0476 {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},
0477 {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94},
0478 {0x8e938662882af53e, 0x547eb47b7282ee9d},
0479 {0xb23867fb2a35b28d, 0xe99e619a4f23aa44},
0480 {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},
0481 {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05},
0482 {0xae0b158b4738705e, 0x9624ab50b148d446},
0483 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
0484 {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},
0485 {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d},
0486 {0xd47487cc8470652b, 0x7647c32000696720},
0487 {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074},
0488 {0xa5fb0a17c777cf09, 0xf468107100525891},
0489 {0xcf79cc9db955c2cc, 0x7182148d4066eeb5},
0490 {0x81ac1fe293d599bf, 0xc6f14cd848405531},
0491 {0xa21727db38cb002f, 0xb8ada00e5a506a7d},
0492 {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},
0493 {0xfd442e4688bd304a, 0x908f4a166d1da664},
0494 {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},
0495 {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe},
0496 {0xf7549530e188c128, 0xd12bee59e68ef47d},
0497 {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf},
0498 {0xc13a148e3032d6e7, 0xe36a52363c1faf02},
0499 {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2},
0500 {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},
0501 {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8},
0502 {0xebdf661791d60f56, 0x111b495b3464ad22},
0503 {0x936b9fcebb25c995, 0xcab10dd900beec35},
0504 {0xb84687c269ef3bfb, 0x3d5d514f40eea743},
0505 {0xe65829b3046b0afa, 0x0cb4a5a3112a5113},
0506 {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},
0507 {0xb3f4e093db73a093, 0x59ed216765690f57},
0508 {0xe0f218b8d25088b8, 0x306869c13ec3532d},
0509 {0x8c974f7383725573, 0x1e414218c73a13fc},
0510 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
0511 {0xdbac6c247d62a583, 0xdf45f746b74abf3a},
0512 {0x894bc396ce5da772, 0x6b8bba8c328eb784},
0513 {0xab9eb47c81f5114f, 0x066ea92f3f326565},
0514 {0xd686619ba27255a2, 0xc80a537b0efefebe},
0515 {0x8613fd0145877585, 0xbd06742ce95f5f37},
0516 {0xa798fc4196e952e7, 0x2c48113823b73705},
0517 {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6},
0518 {0x82ef85133de648c4, 0x9a984d73dbe722fc},
0519 {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb},
0520 {0xcc963fee10b7d1b3, 0x318df905079926a9},
0521 {0xffbbcfe994e5c61f, 0xfdf17746497f7053},
0522 {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},
0523 {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1},
0524 {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},
0525 {0x9c1661a651213e2d, 0x06bea10ca65c084f},
0526 {0xc31bfa0fe5698db8, 0x486e494fcff30a63},
0527 {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb},
0528 {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},
0529 {0xbe89523386091465, 0xf6bbb397f1135824},
0530 {0xee2ba6c0678b597f, 0x746aa07ded582e2d},
0531 {0x94db483840b717ef, 0xa8c2a44eb4571cdd},
0532 {0xba121a4650e4ddeb, 0x92f34d62616ce414},
0533 {0xe896a0d7e51e1566, 0x77b020baf9c81d18},
0534 {0x915e2486ef32cd60, 0x0ace1474dc1d122f},
0535 {0xb5b5ada8aaff80b8, 0x0d819992132456bb},
0536 {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
0537 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
0538 {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},
0539 {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf},
0540 {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},
0541 {0xad4ab7112eb3929d, 0x86c16c98d2c953c7},
0542 {0xd89d64d57a607744, 0xe871c7bf077ba8b8},
0543 {0x87625f056c7c4a8b, 0x11471cd764ad4973},
0544 {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},
0545 {0xd389b47879823479, 0x4aff1d108d4ec2c4},
0546 {0x843610cb4bf160cb, 0xcedf722a585139bb},
0547 {0xa54394fe1eedb8fe, 0xc2974eb4ee658829},
0548 {0xce947a3da6a9273e, 0x733d226229feea33},
0549 {0x811ccc668829b887, 0x0806357d5a3f5260},
0550 {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},
0551 {0xc9bcff6034c13052, 0xfc89b393dd02f0b6},
0552 {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},
0553 {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e},
0554 {0xc5029163f384a931, 0x0a9e795e65d4df12},
0555 {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6},
0556 {0x99ea0196163fa42e, 0x504bced1bf8e4e46},
0557 {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7},
0558 {0xf07da27a82c37088, 0x5d767327bb4e5a4d},
0559 {0x964e858c91ba2655, 0x3a6a07f8d510f870},
0560 {0xbbe226efb628afea, 0x890489f70a55368c},
0561 {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f},
0562 {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},
0563 {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},
0564 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
0565 {0x8f57fa54c2a9eab6, 0x9fa946824a12232e},
0566 {0xb32df8e9f3546564, 0x47939822dc96abfa},
0567 {0xdff9772470297ebd, 0x59787e2b93bc56f8},
0568 {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},
0569 {0xaefae51477a06b03, 0xede622920b6b23f2},
0570 {0xdab99e59958885c4, 0xe95fab368e45ecee},
0571 {0x88b402f7fd75539b, 0x11dbcb0218ebb415},
0572 {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},
0573 {0xd59944a37c0752a2, 0x4be76d3346f04960},
0574 {0x857fcae62d8493a5, 0x6f70a4400c562ddc},
0575 {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953},
0576 {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},
0577 {0x825ecc24c873782f, 0x8ed400668c0c28c9},
0578 {0xa2f67f2dfa90563b, 0x728900802f0f32fb},
0579 {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba},
0580 {0xfea126b7d78186bc, 0xe2f610c84987bfa9},
0581 {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca},
0582 {0xc6ede63fa05d3143, 0x91503d1c79720dbc},
0583 {0xf8a95fcf88747d94, 0x75a44c6397ce912b},
0584 {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},
0585 {0xc24452da229b021b, 0xfbe85badce996169},
0586 {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},
0587 {0x97c560ba6b0919a5, 0xdccd879fc967d41b},
0588 {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},
0589 {0xed246723473e3813, 0x290123e9aab23b69},
0590 {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
0591 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
0592 {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},
0593 {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3},
0594 {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},
0595 {0xe2280b6c20dd5232, 0x25c6da63c38de1b1},
0596 {0x8d590723948a535f, 0x579c487e5a38ad0f},
0597 {0xb0af48ec79ace837, 0x2d835a9df0c6d852},
0598 {0xdcdb1b2798182244, 0xf8e431456cf88e66},
0599 {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900},
0600 {0xac8b2d36eed2dac5, 0xe272467e3d222f40},
0601 {0xd7adf884aa879177, 0x5b0ed81dcc6abb10},
0602 {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},
0603 {0xa87fea27a539e9a5, 0x3f2398d747b36225},
0604 {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},
0605 {0x83a3eeeef9153e89, 0x1953cf68300424ad},
0606 {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},
0607 {0xcdb02555653131b6, 0x3792f412cb06794e},
0608 {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},
0609 {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5},
0610 {0xc8de047564d20a8b, 0xf245825a5a445276},
0611 {0xfb158592be068d2e, 0xeed6e2f0f0d56713},
0612 {0x9ced737bb6c4183d, 0x55464dd69685606c},
0613 {0xc428d05aa4751e4c, 0xaa97e14c3c26b887},
0614 {0xf53304714d9265df, 0xd53dd99f4b3066a9},
0615 {0x993fe2c6d07b7fab, 0xe546a8038efe402a},
0616 {0xbf8fdb78849a5f96, 0xde98520472bdd034},
0617 {0xef73d256a5c0f77c, 0x963e66858f6d4441},
0618 {0x95a8637627989aad, 0xdde7001379a44aa9},
0619 {0xbb127c53b17ec159, 0x5560c018580d5d53},
0620 {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},
0621 {0x9226712162ab070d, 0xcab3961304ca70e9},
0622 {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},
0623 {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b},
0624 {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},
0625 {0xb267ed1940f1c61c, 0x55f038b237591ed4},
0626 {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},
0627 {0x8b61313bbabce2c6, 0x2323ac4b3b3da016},
0628 {0xae397d8aa96c1b77, 0xabec975e0a0d081b},
0629 {0xd9c7dced53c72255, 0x96e7bd358c904a22},
0630 {0x881cea14545c7575, 0x7e50d64177da2e55},
0631 {0xaa242499697392d2, 0xdde50bd1d5d0b9ea},
0632 {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},
0633 {0x84ec3c97da624ab4, 0xbd5af13bef0b113f},
0634 {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},
0635 {0xcfb11ead453994ba, 0x67de18eda5814af3},
0636 {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},
0637 {0xa2425ff75e14fc31, 0xa1258379a94d028e},
0638 {0xcad2f7f5359a3b3e, 0x096ee45813a04331},
0639 {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd},
0640 {0x9e74d1b791e07e48, 0x775ea264cf55347e},
0641 {0xc612062576589dda, 0x95364afe032a819e},
0642 {0xf79687aed3eec551, 0x3a83ddbd83f52205},
0643 {0x9abe14cd44753b52, 0xc4926a9672793543},
0644 {0xc16d9a0095928a27, 0x75b7053c0f178294},
0645 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
0646 {0x971da05074da7bee, 0xd3f6fc16ebca5e04},
0647 {0xbce5086492111aea, 0x88f4bb1ca6bcf585},
0648 {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},
0649 {0x9392ee8e921d5d07, 0x3aff322e62439fd0},
0650 {0xb877aa3236a4b449, 0x09befeb9fad487c3},
0651 {0xe69594bec44de15b, 0x4c2ebe687989a9b4},
0652 {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},
0653 {0xb424dc35095cd80f, 0x538484c19ef38c95},
0654 {0xe12e13424bb40e13, 0x2865a5f206b06fba},
0655 {0x8cbccc096f5088cb, 0xf93f87b7442e45d4},
0656 {0xafebff0bcb24aafe, 0xf78f69a51539d749},
0657 {0xdbe6fecebdedd5be, 0xb573440e5a884d1c},
0658 {0x89705f4136b4a597, 0x31680a88f8953031},
0659 {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e},
0660 {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},
0661 {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110},
0662 {0xa7c5ac471b478423, 0x0fcf80dc33721d54},
0663 {0xd1b71758e219652b, 0xd3c36113404ea4a9},
0664 {0x83126e978d4fdf3b, 0x645a1cac083126ea},
0665 {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4},
0666 {0xcccccccccccccccc, 0xcccccccccccccccd},
0667 {0x8000000000000000, 0x0000000000000000},
0668 {0xa000000000000000, 0x0000000000000000},
0669 {0xc800000000000000, 0x0000000000000000},
0670 {0xfa00000000000000, 0x0000000000000000},
0671 {0x9c40000000000000, 0x0000000000000000},
0672 {0xc350000000000000, 0x0000000000000000},
0673 {0xf424000000000000, 0x0000000000000000},
0674 {0x9896800000000000, 0x0000000000000000},
0675 {0xbebc200000000000, 0x0000000000000000},
0676 {0xee6b280000000000, 0x0000000000000000},
0677 {0x9502f90000000000, 0x0000000000000000},
0678 {0xba43b74000000000, 0x0000000000000000},
0679 {0xe8d4a51000000000, 0x0000000000000000},
0680 {0x9184e72a00000000, 0x0000000000000000},
0681 {0xb5e620f480000000, 0x0000000000000000},
0682 {0xe35fa931a0000000, 0x0000000000000000},
0683 {0x8e1bc9bf04000000, 0x0000000000000000},
0684 {0xb1a2bc2ec5000000, 0x0000000000000000},
0685 {0xde0b6b3a76400000, 0x0000000000000000},
0686 {0x8ac7230489e80000, 0x0000000000000000},
0687 {0xad78ebc5ac620000, 0x0000000000000000},
0688 {0xd8d726b7177a8000, 0x0000000000000000},
0689 {0x878678326eac9000, 0x0000000000000000},
0690 {0xa968163f0a57b400, 0x0000000000000000},
0691 {0xd3c21bcecceda100, 0x0000000000000000},
0692 {0x84595161401484a0, 0x0000000000000000},
0693 {0xa56fa5b99019a5c8, 0x0000000000000000},
0694 {0xcecb8f27f4200f3a, 0x0000000000000000},
0695 {0x813f3978f8940984, 0x4000000000000000},
0696 {0xa18f07d736b90be5, 0x5000000000000000},
0697 {0xc9f2c9cd04674ede, 0xa400000000000000},
0698 {0xfc6f7c4045812296, 0x4d00000000000000},
0699 {0x9dc5ada82b70b59d, 0xf020000000000000},
0700 {0xc5371912364ce305, 0x6c28000000000000},
0701 {0xf684df56c3e01bc6, 0xc732000000000000},
0702 {0x9a130b963a6c115c, 0x3c7f400000000000},
0703 {0xc097ce7bc90715b3, 0x4b9f100000000000},
0704 {0xf0bdc21abb48db20, 0x1e86d40000000000},
0705 {0x96769950b50d88f4, 0x1314448000000000},
0706 {0xbc143fa4e250eb31, 0x17d955a000000000},
0707 {0xeb194f8e1ae525fd, 0x5dcfab0800000000},
0708 {0x92efd1b8d0cf37be, 0x5aa1cae500000000},
0709 {0xb7abc627050305ad, 0xf14a3d9e40000000},
0710 {0xe596b7b0c643c719, 0x6d9ccd05d0000000},
0711 {0x8f7e32ce7bea5c6f, 0xe4820023a2000000},
0712 {0xb35dbf821ae4f38b, 0xdda2802c8a800000},
0713 {0xe0352f62a19e306e, 0xd50b2037ad200000},
0714 {0x8c213d9da502de45, 0x4526f422cc340000},
0715 {0xaf298d050e4395d6, 0x9670b12b7f410000},
0716 {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},
0717 {0x88d8762bf324cd0f, 0xa5880a69fb6ac800},
0718 {0xab0e93b6efee0053, 0x8eea0d047a457a00},
0719 {0xd5d238a4abe98068, 0x72a4904598d6d880},
0720 {0x85a36366eb71f041, 0x47a6da2b7f864750},
0721 {0xa70c3c40a64e6c51, 0x999090b65f67d924},
0722 {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},
0723 {0x82818f1281ed449f, 0xbff8f10e7a8921a5},
0724 {0xa321f2d7226895c7, 0xaff72d52192b6a0e},
0725 {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491},
0726 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
0727 {0x9f4f2726179a2245, 0x01d762422c946591},
0728 {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6},
0729 {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3},
0730 {0x9b934c3b330c8577, 0x63cc55f49f88eb30},
0731 {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc},
0732 {0xf316271c7fc3908a, 0x8bef464e3945ef7b},
0733 {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad},
0734 {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318},
0735 {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde},
0736 {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b},
0737 {0xb975d6b6ee39e436, 0xb3e2fd538e122b45},
0738 {0xe7d34c64a9c85d44, 0x60dbbca87196b617},
0739 {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce},
0740 {0xb51d13aea4a488dd, 0x6babab6398bdbe42},
0741 {0xe264589a4dcdab14, 0xc696963c7eed2dd2},
0742 {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3},
0743 {0xb0de65388cc8ada8, 0x3b25a55f43294bcc},
0744 {0xdd15fe86affad912, 0x49ef0eb713f39ebf},
0745 {0x8a2dbf142dfcc7ab, 0x6e3569326c784338},
0746 {0xacb92ed9397bf996, 0x49c2c37f07965405},
0747 {0xd7e77a8f87daf7fb, 0xdc33745ec97be907},
0748 {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4},
0749 {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d},
0750 {0xd2d80db02aabd62b, 0xf50a3fa490c30191},
0751 {0x83c7088e1aab65db, 0x792667c6da79e0fb},
0752 {0xa4b8cab1a1563f52, 0x577001b891185939},
0753 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
0754 {0x80b05e5ac60b6178, 0x544f8158315b05b5},
0755 {0xa0dc75f1778e39d6, 0x696361ae3db1c722},
0756 {0xc913936dd571c84c, 0x03bc3a19cd1e38ea},
0757 {0xfb5878494ace3a5f, 0x04ab48a04065c724},
0758 {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77},
0759 {0xc45d1df942711d9a, 0x3ba5d0bd324f8395},
0760 {0xf5746577930d6500, 0xca8f44ec7ee3647a},
0761 {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc},
0762 {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f},
0763 {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f},
0764 {0x95d04aee3b80ece5, 0xbba1f1d158724a13},
0765 {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98},
0766 {0xea1575143cf97226, 0xf52d09d71a3293be},
0767 {0x924d692ca61be758, 0x593c2626705f9c57},
0768 {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d},
0769 {0xe498f455c38b997a, 0x0b6dfb9c0f956448},
0770 {0x8edf98b59a373fec, 0x4724bd4189bd5ead},
0771 {0xb2977ee300c50fe7, 0x58edec91ec2cb658},
0772 {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee},
0773 {0x8b865b215899f46c, 0xbd79e0d20082ee75},
0774 {0xae67f1e9aec07187, 0xecd8590680a3aa12},
0775 {0xda01ee641a708de9, 0xe80e6f4820cc9496},
0776 {0x884134fe908658b2, 0x3109058d147fdcde},
0777 {0xaa51823e34a7eede, 0xbd4b46f0599fd416},
0778 {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b},
0779 {0x850fadc09923329e, 0x03e2cf6bc604ddb1},
0780 {0xa6539930bf6bff45, 0x84db8346b786151d},
0781 {0xcfe87f7cef46ff16, 0xe612641865679a64},
0782 {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f},
0783 {0xa26da3999aef7749, 0xe3be5e330f38f09e},
0784 {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6},
0785 {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7},
0786 {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb},
0787 {0xc646d63501a1511d, 0xb281e1fd541501b9},
0788 {0xf7d88bc24209a565, 0x1f225a7ca91a4227},
0789 {0x9ae757596946075f, 0x3375788de9b06959},
0790 {0xc1a12d2fc3978937, 0x0052d6b1641c83af},
0791 {0xf209787bb47d6b84, 0xc0678c5dbd23a49b},
0792 {0x9745eb4d50ce6332, 0xf840b7ba963646e1},
0793 {0xbd176620a501fbff, 0xb650e5a93bc3d899},
0794 {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf},
0795 {0x93ba47c980e98cdf, 0xc66f336c36b10138},
0796 {0xb8a8d9bbe123f017, 0xb80b0047445d4185},
0797 {0xe6d3102ad96cec1d, 0xa60dc059157491e6},
0798 {0x9043ea1ac7e41392, 0x87c89837ad68db30},
0799 {0xb454e4a179dd1877, 0x29babe4598c311fc},
0800 {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b},
0801 {0x8ce2529e2734bb1d, 0x1899e4a65f58660d},
0802 {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90},
0803 {0xdc21a1171d42645d, 0x76707543f4fa1f74},
0804 {0x899504ae72497eba, 0x6a06494a791c53a9},
0805 {0xabfa45da0edbde69, 0x0487db9d17636893},
0806 {0xd6f8d7509292d603, 0x45a9d2845d3c42b7},
0807 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
0808 {0xa7f26836f282b732, 0x8e6cac7768d7141f},
0809 {0xd1ef0244af2364ff, 0x3207d795430cd927},
0810 {0x8335616aed761f1f, 0x7f44e6bd49e807b9},
0811 {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7},
0812 {0xcd036837130890a1, 0x36dba887c37a8c10},
0813 {0x802221226be55a64, 0xc2494954da2c978a},
0814 {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d},
0815 {0xc83553c5c8965d3d, 0x6f92829494e5acc8},
0816 {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa},
0817 {0x9c69a97284b578d7, 0xff2a760414536efc},
0818 {0xc38413cf25e2d70d, 0xfef5138519684abb},
0819 {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a},
0820 {0x98bf2f79d5993802, 0xef2f773ffbd97a62},
0821 {0xbeeefb584aff8603, 0xaafb550ffacfd8fb},
0822 {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39},
0823 {0x952ab45cfa97a0b2, 0xdd945a747bf26184},
0824 {0xba756174393d88df, 0x94f971119aeef9e5},
0825 {0xe912b9d1478ceb17, 0x7a37cd5601aab85e},
0826 {0x91abb422ccb812ee, 0xac62e055c10ab33b},
0827 {0xb616a12b7fe617aa, 0x577b986b314d600a},
0828 {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c},
0829 {0x8e41ade9fbebc27d, 0x14588f13be847308},
0830 {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9},
0831 {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc},
0832 {0x8aec23d680043bee, 0x25de7bb9480d5855},
0833 {0xada72ccc20054ae9, 0xaf561aa79a10ae6b},
0834 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
0835 {0x87aa9aff79042286, 0x90fb44d2f05d0843},
0836 {0xa99541bf57452b28, 0x353a1607ac744a54},
0837 {0xd3fa922f2d1675f2, 0x42889b8997915ce9},
0838 {0x847c9b5d7c2e09b7, 0x69956135febada12},
0839 {0xa59bc234db398c25, 0x43fab9837e699096},
0840 {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc},
0841 {0x8161afb94b44f57d, 0x1d1be0eebac278f6},
0842 {0xa1ba1ba79e1632dc, 0x6462d92a69731733},
0843 {0xca28a291859bbf93, 0x7d7b8f7503cfdcff},
0844 {0xfcb2cb35e702af78, 0x5cda735244c3d43f},
0845 {0x9defbf01b061adab, 0x3a0888136afa64a8},
0846 {0xc56baec21c7a1916, 0x088aaa1845b8fdd1},
0847 {0xf6c69a72a3989f5b, 0x8aad549e57273d46},
0848 {0x9a3c2087a63f6399, 0x36ac54e2f678864c},
0849 {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de},
0850 {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6},
0851 {0x969eb7c47859e743, 0x9f644ae5a4b1b326},
0852 {0xbc4665b596706114, 0x873d5d9f0dde1fef},
0853 {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb},
0854 {0x9316ff75dd87cbd8, 0x09a7f12442d588f3},
0855 {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30},
0856 {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb},
0857 {0x8fa475791a569d10, 0xf96e017d694487bd},
0858 {0xb38d92d760ec4455, 0x37c981dcc395a9ad},
0859 {0xe070f78d3927556a, 0x85bbe253f47b1418},
0860 {0x8c469ab843b89562, 0x93956d7478ccec8f},
0861 {0xaf58416654a6babb, 0x387ac8d1970027b3},
0862 {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f},
0863 {0x88fcf317f22241e2, 0x441fece3bdf81f04},
0864 {0xab3c2fddeeaad25a, 0xd527e81cad7626c4},
0865 {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075},
0866 {0x85c7056562757456, 0xf6872d5667844e4a},
0867 {0xa738c6bebb12d16c, 0xb428f8ac016561dc},
0868 {0xd106f86e69d785c7, 0xe13336d701beba53},
0869 {0x82a45b450226b39c, 0xecc0024661173474},
0870 {0xa34d721642b06084, 0x27f002d7f95d0191},
0871 {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5},
0872 {0xff290242c83396ce, 0x7e67047175a15272},
0873 {0x9f79a169bd203e41, 0x0f0062c6e984d387},
0874 {0xc75809c42c684dd1, 0x52c07b78a3e60869},
0875 {0xf92e0c3537826145, 0xa7709a56ccdf8a83},
0876 {0x9bbcc7a142b17ccb, 0x88a66076400bb692},
0877 {0xc2abf989935ddbfe, 0x6acff893d00ea436},
0878 {0xf356f7ebf83552fe, 0x0583f6b8c4124d44},
0879 {0x98165af37b2153de, 0xc3727a337a8b704b},
0880 {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d},
0881 {0xeda2ee1c7064130c, 0x1162def06f79df74},
0882 {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9},
0883 {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693},
0884 {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438},
0885 {0x910ab1d4db9914a0, 0x1d9c9892400a22a3},
0886 {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c},
0887 {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e},
0888 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
0889 {0xb10d8e1456105dad, 0x7425a83e872c5f48},
0890 {0xdd50f1996b947518, 0xd12f124e28f7771a},
0891 {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70},
0892 {0xace73cbfdc0bfb7b, 0x636cc64d1001550c},
0893 {0xd8210befd30efa5a, 0x3c47f7e05401aa4f},
0894 {0x8714a775e3e95c78, 0x65acfaec34810a72},
0895 {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e},
0896 {0xd31045a8341ca07c, 0x1ede48111209a051},
0897 {0x83ea2b892091e44d, 0x934aed0aab460433},
0898 {0xa4e4b66b68b65d60, 0xf81da84d56178540},
0899 {0xce1de40642e3f4b9, 0x36251260ab9d668f},
0900 {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a},
0901 {0xa1075a24e4421730, 0xb24cf65b8612f820},
0902 {0xc94930ae1d529cfc, 0xdee033f26797b628},
0903 {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2},
0904 {0x9d412e0806e88aa5, 0x8e1f289560ee864f},
0905 {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3},
0906 {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc},
0907 {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a},
0908 {0xbff610b0cc6edd3f, 0x17fd090a58d32af4},
0909 {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1},
0910 {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f},
0911 {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2},
0912 {0xea53df5fd18d5513, 0x84c86189216dc5ee},
0913 {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5},
0914 {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2},
0915 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
0916 {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f},
0917 {0xb2c71d5bca9023f8, 0x743e20e9ef511013},
0918 {0xdf78e4b2bd342cf6, 0x914da9246b255417},
0919 {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f},
0920 {0xae9672aba3d0c320, 0xa184ac2473b529b2},
0921 {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f},
0922 {0x8865899617fb1871, 0x7e2fa67c7a658893},
0923 {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8},
0924 {0xd51ea6fa85785631, 0x552a74227f3ea566},
0925 {0x8533285c936b35de, 0xd53a88958f872760},
0926 {0xa67ff273b8460356, 0x8a892abaf368f138},
0927 {0xd01fef10a657842c, 0x2d2b7569b0432d86},
0928 {0x8213f56a67f6b29b, 0x9c3b29620e29fc74},
0929 {0xa298f2c501f45f42, 0x8349f3ba91b47b90},
0930 {0xcb3f2f7642717713, 0x241c70a936219a74},
0931 {0xfe0efb53d30dd4d7, 0xed238cd383aa0111},
0932 {0x9ec95d1463e8a506, 0xf4363804324a40ab},
0933 {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6},
0934 {0xf81aa16fdc1b81da, 0xdd94b7868e94050b},
0935 {0x9b10a4e5e9913128, 0xca7cf2b4191c8327},
0936 {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1},
0937 {0xf24a01a73cf2dccf, 0xbc633b39673c8ced},
0938 {0x976e41088617ca01, 0xd5be0503e085d814},
0939 {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19},
0940 {0xec9c459d51852ba2, 0xddf8e7d60ed1219f},
0941 {0x93e1ab8252f33b45, 0xcabb90e5c942b504},
0942 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
0943 {0xe7109bfba19c0c9d, 0x0cc512670a783ad5},
0944 {0x906a617d450187e2, 0x27fb2b80668b24c6},
0945 {0xb484f9dc9641e9da, 0xb1f9f660802dedf7},
0946 {0xe1a63853bbd26451, 0x5e7873f8a0396974},
0947 {0x8d07e33455637eb2, 0xdb0b487b6423e1e9},
0948 {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63},
0949 {0xdc5c5301c56b75f7, 0x7641a140cc7810fc},
0950 {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e},
0951 {0xac2820d9623bf429, 0x546345fa9fbdcd45},
0952 {0xd732290fbacaf133, 0xa97c177947ad4096},
0953 {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e},
0954 {0xa81f301449ee8c70, 0x5c68f256bfff5a75},
0955 {0xd226fc195c6a2f8c, 0x73832eec6fff3112},
0956 {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac},
0957 {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56},
0958 {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec},
0959 {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4},
0960 {0xa0555e361951c366, 0xd7e105bcc3326220},
0961 {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8},
0962 {0xfa856334878fc150, 0xb14f98f6f0feb952},
0963 {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4},
0964 {0xc3b8358109e84f07, 0x0a862f80ec4700c9},
0965 {0xf4a642e14c6262c8, 0xcd27bb612758c0fb},
0966 {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d},
0967 {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4},
0968 {0xeeea5d5004981478, 0x1858ccfce06cac75},
0969 {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
0970 {0xbaa718e68396cffd, 0xd30560258f54e6bb},
0971 {0xe950df20247c83fd, 0x47c6b82ef32a206a},
0972 {0x91d28b7416cdd27e, 0x4cdc331d57fa5442},
0973 {0xb6472e511c81471d, 0xe0133fe4adf8e953},
0974 {0xe3d8f9e563a198e5, 0x58180fddd97723a7},
0975 {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649},
0976 {0xb201833b35d63f73, 0x2cd2cc6551e513db},
0977 {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2},
0978 {0x8b112e86420f6191, 0xfb04afaf27faf783},
0979 {0xadd57a27d29339f6, 0x79c5db9af1f9b564},
0980 {0xd94ad8b1c7380874, 0x18375281ae7822bd},
0981 {0x87cec76f1c830548, 0x8f2293910d0b15b6},
0982 {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23},
0983 {0xd433179d9c8cb841, 0x5fa60692a46151ec},
0984 {0x849feec281d7f328, 0xdbc7c41ba6bcd334},
0985 {0xa5c7ea73224deff3, 0x12b9b522906c0801},
0986 {0xcf39e50feae16bef, 0xd768226b34870a01},
0987 {0x81842f29f2cce375, 0xe6a1158300d46641},
0988 {0xa1e53af46f801c53, 0x60495ae3c1097fd1},
0989 {0xca5e89b18b602368, 0x385bb19cb14bdfc5},
0990 {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6},
0991 {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2},
0992 {0xc5a05277621be293, 0xc7098b7305241886},
0993 {0xf70867153aa2db38, 0xb8cbee4fc66d1ea8},
0994 {0x9a65406d44a5c903, 0x737f74f1dc043329},
0995 {0xc0fe908895cf3b44, 0x505f522e53053ff3},
0996 {0xf13e34aabb430a15, 0x647726b9e7c68ff0},
0997 {0x96c6e0eab509e64d, 0x5eca783430dc19f6},
0998 {0xbc789925624c5fe0, 0xb67d16413d132073},
0999 {0xeb96bf6ebadf77d8, 0xe41c5bd18c57e890},
1000 {0x933e37a534cbaae7, 0x8e91b962f7b6f15a},
1001 {0xb80dc58e81fe95a1, 0x723627bbb5a4adb1},
1002 {0xe61136f2227e3b09, 0xcec3b1aaa30dd91d},
1003 {0x8fcac257558ee4e6, 0x213a4f0aa5e8a7b2},
1004 {0xb3bd72ed2af29e1f, 0xa988e2cd4f62d19e},
1005 {0xe0accfa875af45a7, 0x93eb1b80a33b8606},
1006 {0x8c6c01c9498d8b88, 0xbc72f130660533c4},
1007 {0xaf87023b9bf0ee6a, 0xeb8fad7c7f8680b5},
1008 {0xdb68c2ca82ed2a05, 0xa67398db9f6820e2},
1009 #else
1010 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
1011 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
1012 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
1013 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
1014 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
1015 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
1016 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
1017 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
1018 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
1019 {0x95a8637627989aad, 0xdde7001379a44aa9},
1020 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
1021 {0xc350000000000000, 0x0000000000000000},
1022 {0x9dc5ada82b70b59d, 0xf020000000000000},
1023 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
1024 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
1025 {0xa6539930bf6bff45, 0x84db8346b786151d},
1026 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
1027 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
1028 {0xaf58416654a6babb, 0x387ac8d1970027b3},
1029 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
1030 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
1031 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
1032 {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
1033 {0xf13e34aabb430a15, 0x647726b9e7c68ff0}
1034 #endif
1035 };
1036
1037 #if FMT_USE_FULL_CACHE_DRAGONBOX
1038 return pow10_significands[k - float_info<double>::min_k];
1039 #else
1040 static constexpr const uint64_t powers_of_5_64[] = {
1041 0x0000000000000001, 0x0000000000000005, 0x0000000000000019,
1042 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35,
1043 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1,
1044 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd,
1045 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9,
1046 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5,
1047 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631,
1048 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed,
1049 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9};
1050
1051 static const int compression_ratio = 27;
1052
1053
1054 int cache_index = (k - float_info<double>::min_k) / compression_ratio;
1055 int kb = cache_index * compression_ratio + float_info<double>::min_k;
1056 int offset = k - kb;
1057
1058
1059 uint128_fallback base_cache = pow10_significands[cache_index];
1060 if (offset == 0) return base_cache;
1061
1062
1063 int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset;
1064 FMT_ASSERT(alpha > 0 && alpha < 64, "shifting error detected");
1065
1066
1067 uint64_t pow5 = powers_of_5_64[offset];
1068 uint128_fallback recovered_cache = umul128(base_cache.high(), pow5);
1069 uint128_fallback middle_low = umul128(base_cache.low(), pow5);
1070
1071 recovered_cache += middle_low.high();
1072
1073 uint64_t high_to_middle = recovered_cache.high() << (64 - alpha);
1074 uint64_t middle_to_low = recovered_cache.low() << (64 - alpha);
1075
1076 recovered_cache =
1077 uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle,
1078 ((middle_low.low() >> alpha) | middle_to_low)};
1079 FMT_ASSERT(recovered_cache.low() + 1 != 0, "");
1080 return {recovered_cache.high(), recovered_cache.low() + 1};
1081 #endif
1082 }
1083
1084 struct compute_mul_result {
1085 carrier_uint result;
1086 bool is_integer;
1087 };
1088 struct compute_mul_parity_result {
1089 bool parity;
1090 bool is_integer;
1091 };
1092
1093 static auto compute_mul(carrier_uint u,
1094 const cache_entry_type& cache) noexcept
1095 -> compute_mul_result {
1096 auto r = umul192_upper128(u, cache);
1097 return {r.high(), r.low() == 0};
1098 }
1099
1100 static auto compute_delta(const cache_entry_type& cache, int beta) noexcept
1101 -> uint32_t {
1102 return static_cast<uint32_t>(cache.high() >> (64 - 1 - beta));
1103 }
1104
1105 static auto compute_mul_parity(carrier_uint two_f,
1106 const cache_entry_type& cache,
1107 int beta) noexcept
1108 -> compute_mul_parity_result {
1109 FMT_ASSERT(beta >= 1, "");
1110 FMT_ASSERT(beta < 64, "");
1111
1112 auto r = umul192_lower128(two_f, cache);
1113 return {((r.high() >> (64 - beta)) & 1) != 0,
1114 ((r.high() << beta) | (r.low() >> (64 - beta))) == 0};
1115 }
1116
1117 static auto compute_left_endpoint_for_shorter_interval_case(
1118 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
1119 return (cache.high() -
1120 (cache.high() >> (num_significand_bits<double>() + 2))) >>
1121 (64 - num_significand_bits<double>() - 1 - beta);
1122 }
1123
1124 static auto compute_right_endpoint_for_shorter_interval_case(
1125 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
1126 return (cache.high() +
1127 (cache.high() >> (num_significand_bits<double>() + 1))) >>
1128 (64 - num_significand_bits<double>() - 1 - beta);
1129 }
1130
1131 static auto compute_round_up_for_shorter_interval_case(
1132 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
1133 return ((cache.high() >> (64 - num_significand_bits<double>() - 2 - beta)) +
1134 1) /
1135 2;
1136 }
1137 };
1138
1139 FMT_FUNC auto get_cached_power(int k) noexcept -> uint128_fallback {
1140 return cache_accessor<double>::get_cached_power(k);
1141 }
1142
1143
1144 template <typename T>
1145 auto is_left_endpoint_integer_shorter_interval(int exponent) noexcept -> bool {
1146 const int case_shorter_interval_left_endpoint_lower_threshold = 2;
1147 const int case_shorter_interval_left_endpoint_upper_threshold = 3;
1148 return exponent >= case_shorter_interval_left_endpoint_lower_threshold &&
1149 exponent <= case_shorter_interval_left_endpoint_upper_threshold;
1150 }
1151
1152
1153 FMT_INLINE int remove_trailing_zeros(uint32_t& n, int s = 0) noexcept {
1154 FMT_ASSERT(n != 0, "");
1155
1156 constexpr uint32_t mod_inv_5 = 0xcccccccd;
1157 constexpr uint32_t mod_inv_25 = 0xc28f5c29;
1158
1159 while (true) {
1160 auto q = rotr(n * mod_inv_25, 2);
1161 if (q > max_value<uint32_t>() / 100) break;
1162 n = q;
1163 s += 2;
1164 }
1165 auto q = rotr(n * mod_inv_5, 1);
1166 if (q <= max_value<uint32_t>() / 10) {
1167 n = q;
1168 s |= 1;
1169 }
1170 return s;
1171 }
1172
1173
1174 FMT_INLINE int remove_trailing_zeros(uint64_t& n) noexcept {
1175 FMT_ASSERT(n != 0, "");
1176
1177
1178 constexpr uint64_t magic_number = 12379400392853802749ull;
1179 auto nm = umul128(n, magic_number);
1180
1181
1182 if ((nm.high() & ((1ull << (90 - 64)) - 1)) == 0 && nm.low() < magic_number) {
1183
1184 auto n32 = static_cast<uint32_t>(nm.high() >> (90 - 64));
1185
1186 int s = remove_trailing_zeros(n32, 8);
1187 n = n32;
1188 return s;
1189 }
1190
1191
1192 constexpr uint64_t mod_inv_5 = 0xcccccccccccccccd;
1193 constexpr uint64_t mod_inv_25 = 0x8f5c28f5c28f5c29;
1194
1195 int s = 0;
1196 while (true) {
1197 auto q = rotr(n * mod_inv_25, 2);
1198 if (q > max_value<uint64_t>() / 100) break;
1199 n = q;
1200 s += 2;
1201 }
1202 auto q = rotr(n * mod_inv_5, 1);
1203 if (q <= max_value<uint64_t>() / 10) {
1204 n = q;
1205 s |= 1;
1206 }
1207
1208 return s;
1209 }
1210
1211
1212 template <typename T>
1213 FMT_INLINE decimal_fp<T> shorter_interval_case(int exponent) noexcept {
1214 decimal_fp<T> ret_value;
1215
1216 const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent);
1217 const int beta = exponent + floor_log2_pow10(-minus_k);
1218
1219
1220 using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1221 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1222
1223 auto xi = cache_accessor<T>::compute_left_endpoint_for_shorter_interval_case(
1224 cache, beta);
1225 auto zi = cache_accessor<T>::compute_right_endpoint_for_shorter_interval_case(
1226 cache, beta);
1227
1228
1229 if (!is_left_endpoint_integer_shorter_interval<T>(exponent)) ++xi;
1230
1231
1232 ret_value.significand = zi / 10;
1233
1234
1235 if (ret_value.significand * 10 >= xi) {
1236 ret_value.exponent = minus_k + 1;
1237 ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1238 return ret_value;
1239 }
1240
1241
1242 ret_value.significand =
1243 cache_accessor<T>::compute_round_up_for_shorter_interval_case(cache,
1244 beta);
1245 ret_value.exponent = minus_k;
1246
1247
1248 if (exponent >= float_info<T>::shorter_interval_tie_lower_threshold &&
1249 exponent <= float_info<T>::shorter_interval_tie_upper_threshold) {
1250 ret_value.significand = ret_value.significand % 2 == 0
1251 ? ret_value.significand
1252 : ret_value.significand - 1;
1253 } else if (ret_value.significand < xi) {
1254 ++ret_value.significand;
1255 }
1256 return ret_value;
1257 }
1258
1259 template <typename T> auto to_decimal(T x) noexcept -> decimal_fp<T> {
1260
1261
1262 using carrier_uint = typename float_info<T>::carrier_uint;
1263 using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1264 auto br = bit_cast<carrier_uint>(x);
1265
1266
1267 const carrier_uint significand_mask =
1268 (static_cast<carrier_uint>(1) << num_significand_bits<T>()) - 1;
1269 carrier_uint significand = (br & significand_mask);
1270 int exponent =
1271 static_cast<int>((br & exponent_mask<T>()) >> num_significand_bits<T>());
1272
1273 if (exponent != 0) {
1274 exponent -= exponent_bias<T>() + num_significand_bits<T>();
1275
1276
1277
1278
1279 if (significand == 0) return shorter_interval_case<T>(exponent);
1280
1281 significand |= (static_cast<carrier_uint>(1) << num_significand_bits<T>());
1282 } else {
1283
1284 if (significand == 0) return {0, 0};
1285 exponent =
1286 std::numeric_limits<T>::min_exponent - num_significand_bits<T>() - 1;
1287 }
1288
1289 const bool include_left_endpoint = (significand % 2 == 0);
1290 const bool include_right_endpoint = include_left_endpoint;
1291
1292
1293 const int minus_k = floor_log10_pow2(exponent) - float_info<T>::kappa;
1294 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1295 const int beta = exponent + floor_log2_pow10(-minus_k);
1296
1297
1298
1299 const uint32_t deltai = cache_accessor<T>::compute_delta(cache, beta);
1300 const carrier_uint two_fc = significand << 1;
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312 const typename cache_accessor<T>::compute_mul_result z_mul =
1313 cache_accessor<T>::compute_mul((two_fc | 1) << beta, cache);
1314
1315
1316
1317
1318
1319 decimal_fp<T> ret_value;
1320 ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result);
1321 uint32_t r = static_cast<uint32_t>(z_mul.result - float_info<T>::big_divisor *
1322 ret_value.significand);
1323
1324 if (r < deltai) {
1325
1326 if (r == 0 && (z_mul.is_integer & !include_right_endpoint)) {
1327 --ret_value.significand;
1328 r = float_info<T>::big_divisor;
1329 goto small_divisor_case_label;
1330 }
1331 } else if (r > deltai) {
1332 goto small_divisor_case_label;
1333 } else {
1334
1335 const typename cache_accessor<T>::compute_mul_parity_result x_mul =
1336 cache_accessor<T>::compute_mul_parity(two_fc - 1, cache, beta);
1337
1338 if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint)))
1339 goto small_divisor_case_label;
1340 }
1341 ret_value.exponent = minus_k + float_info<T>::kappa + 1;
1342
1343
1344 ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1345 return ret_value;
1346
1347
1348
1349 small_divisor_case_label:
1350 ret_value.significand *= 10;
1351 ret_value.exponent = minus_k + float_info<T>::kappa;
1352
1353 uint32_t dist = r - (deltai / 2) + (float_info<T>::small_divisor / 2);
1354 const bool approx_y_parity =
1355 ((dist ^ (float_info<T>::small_divisor / 2)) & 1) != 0;
1356
1357
1358 const bool divisible_by_small_divisor =
1359 check_divisibility_and_divide_by_pow10<float_info<T>::kappa>(dist);
1360
1361
1362 ret_value.significand += dist;
1363
1364 if (!divisible_by_small_divisor) return ret_value;
1365
1366
1367
1368
1369
1370
1371
1372 const auto y_mul = cache_accessor<T>::compute_mul_parity(two_fc, cache, beta);
1373
1374
1375
1376 if (y_mul.parity != approx_y_parity)
1377 --ret_value.significand;
1378 else if (y_mul.is_integer & (ret_value.significand % 2 != 0))
1379 --ret_value.significand;
1380 return ret_value;
1381 }
1382 }
1383 }
1384
1385 template <> struct formatter<detail::bigint> {
1386 FMT_CONSTEXPR auto parse(format_parse_context& ctx)
1387 -> format_parse_context::iterator {
1388 return ctx.begin();
1389 }
1390
1391 auto format(const detail::bigint& n, format_context& ctx) const
1392 -> format_context::iterator {
1393 auto out = ctx.out();
1394 bool first = true;
1395 for (auto i = n.bigits_.size(); i > 0; --i) {
1396 auto value = n.bigits_[i - 1u];
1397 if (first) {
1398 out = fmt::format_to(out, FMT_STRING("{:x}"), value);
1399 first = false;
1400 continue;
1401 }
1402 out = fmt::format_to(out, FMT_STRING("{:08x}"), value);
1403 }
1404 if (n.exp_ > 0)
1405 out = fmt::format_to(out, FMT_STRING("p{}"),
1406 n.exp_ * detail::bigint::bigit_bits);
1407 return out;
1408 }
1409 };
1410
1411 FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) {
1412 for_each_codepoint(s, [this](uint32_t cp, string_view) {
1413 if (cp == invalid_code_point) FMT_THROW(std::runtime_error("invalid utf8"));
1414 if (cp <= 0xFFFF) {
1415 buffer_.push_back(static_cast<wchar_t>(cp));
1416 } else {
1417 cp -= 0x10000;
1418 buffer_.push_back(static_cast<wchar_t>(0xD800 + (cp >> 10)));
1419 buffer_.push_back(static_cast<wchar_t>(0xDC00 + (cp & 0x3FF)));
1420 }
1421 return true;
1422 });
1423 buffer_.push_back(0);
1424 }
1425
1426 FMT_FUNC void format_system_error(detail::buffer<char>& out, int error_code,
1427 const char* message) noexcept {
1428 FMT_TRY {
1429 auto ec = std::error_code(error_code, std::generic_category());
1430 detail::write(appender(out), std::system_error(ec, message).what());
1431 return;
1432 }
1433 FMT_CATCH(...) {}
1434 format_error_code(out, error_code, message);
1435 }
1436
1437 FMT_FUNC void report_system_error(int error_code,
1438 const char* message) noexcept {
1439 do_report_error(format_system_error, error_code, message);
1440 }
1441
1442 FMT_FUNC auto vformat(string_view fmt, format_args args) -> std::string {
1443
1444
1445 auto buffer = memory_buffer();
1446 detail::vformat_to(buffer, fmt, args);
1447 return to_string(buffer);
1448 }
1449
1450 namespace detail {
1451
1452 FMT_FUNC void vformat_to(buffer<char>& buf, string_view fmt, format_args args,
1453 locale_ref loc) {
1454 auto out = appender(buf);
1455 if (fmt.size() == 2 && equal2(fmt.data(), "{}"))
1456 return args.get(0).visit(default_arg_formatter<char>{out});
1457 parse_format_string(
1458 fmt, format_handler<char>{parse_context<char>(fmt), {out, args, loc}});
1459 }
1460
1461 template <typename T> struct span {
1462 T* data;
1463 size_t size;
1464 };
1465
1466 template <typename F> auto flockfile(F* f) -> decltype(_lock_file(f)) {
1467 _lock_file(f);
1468 }
1469 template <typename F> auto funlockfile(F* f) -> decltype(_unlock_file(f)) {
1470 _unlock_file(f);
1471 }
1472
1473 #ifndef getc_unlocked
1474 template <typename F> auto getc_unlocked(F* f) -> decltype(_fgetc_nolock(f)) {
1475 return _fgetc_nolock(f);
1476 }
1477 #endif
1478
1479 template <typename F = FILE, typename Enable = void>
1480 struct has_flockfile : std::false_type {};
1481
1482 template <typename F>
1483 struct has_flockfile<F, void_t<decltype(flockfile(&std::declval<F&>()))>>
1484 : std::true_type {};
1485
1486
1487
1488 template <typename F> class file_base {
1489 public:
1490 F* file_;
1491
1492 public:
1493 file_base(F* file) : file_(file) {}
1494 operator F*() const { return file_; }
1495
1496
1497 auto get() -> int {
1498 int result = getc_unlocked(file_);
1499 if (result == EOF && ferror(file_) != 0)
1500 FMT_THROW(system_error(errno, FMT_STRING("getc failed")));
1501 return result;
1502 }
1503
1504
1505 void unget(char c) {
1506 if (ungetc(c, file_) == EOF)
1507 FMT_THROW(system_error(errno, FMT_STRING("ungetc failed")));
1508 }
1509
1510 void flush() { fflush(this->file_); }
1511 };
1512
1513
1514 template <typename F> class glibc_file : public file_base<F> {
1515 private:
1516 enum {
1517 line_buffered = 0x200,
1518 unbuffered = 2
1519 };
1520
1521 public:
1522 using file_base<F>::file_base;
1523
1524 auto is_buffered() const -> bool {
1525 return (this->file_->_flags & unbuffered) == 0;
1526 }
1527
1528 void init_buffer() {
1529 if (this->file_->_IO_write_ptr < this->file_->_IO_write_end) return;
1530
1531 putc_unlocked(0, this->file_);
1532 --this->file_->_IO_write_ptr;
1533 }
1534
1535
1536 auto get_read_buffer() const -> span<const char> {
1537 auto ptr = this->file_->_IO_read_ptr;
1538 return {ptr, to_unsigned(this->file_->_IO_read_end - ptr)};
1539 }
1540
1541
1542 auto get_write_buffer() const -> span<char> {
1543 auto ptr = this->file_->_IO_write_ptr;
1544 return {ptr, to_unsigned(this->file_->_IO_buf_end - ptr)};
1545 }
1546
1547 void advance_write_buffer(size_t size) { this->file_->_IO_write_ptr += size; }
1548
1549 bool needs_flush() const {
1550 if ((this->file_->_flags & line_buffered) == 0) return false;
1551 char* end = this->file_->_IO_write_end;
1552 return memchr(end, '\n', to_unsigned(this->file_->_IO_write_ptr - end));
1553 }
1554
1555 void flush() { fflush_unlocked(this->file_); }
1556 };
1557
1558
1559 template <typename F> class apple_file : public file_base<F> {
1560 private:
1561 enum {
1562 line_buffered = 1,
1563 unbuffered = 2
1564 };
1565
1566 public:
1567 using file_base<F>::file_base;
1568
1569 auto is_buffered() const -> bool {
1570 return (this->file_->_flags & unbuffered) == 0;
1571 }
1572
1573 void init_buffer() {
1574 if (this->file_->_p) return;
1575
1576 putc_unlocked(0, this->file_);
1577 --this->file_->_p;
1578 ++this->file_->_w;
1579 }
1580
1581 auto get_read_buffer() const -> span<const char> {
1582 return {reinterpret_cast<char*>(this->file_->_p),
1583 to_unsigned(this->file_->_r)};
1584 }
1585
1586 auto get_write_buffer() const -> span<char> {
1587 return {reinterpret_cast<char*>(this->file_->_p),
1588 to_unsigned(this->file_->_bf._base + this->file_->_bf._size -
1589 this->file_->_p)};
1590 }
1591
1592 void advance_write_buffer(size_t size) {
1593 this->file_->_p += size;
1594 this->file_->_w -= size;
1595 }
1596
1597 bool needs_flush() const {
1598 if ((this->file_->_flags & line_buffered) == 0) return false;
1599 return memchr(this->file_->_p + this->file_->_w, '\n',
1600 to_unsigned(-this->file_->_w));
1601 }
1602 };
1603
1604
1605 template <typename F> class fallback_file : public file_base<F> {
1606 private:
1607 char next_;
1608 bool has_next_ = false;
1609
1610 public:
1611 using file_base<F>::file_base;
1612
1613 auto is_buffered() const -> bool { return false; }
1614 auto needs_flush() const -> bool { return false; }
1615 void init_buffer() {}
1616
1617 auto get_read_buffer() const -> span<const char> {
1618 return {&next_, has_next_ ? 1u : 0u};
1619 }
1620
1621 auto get_write_buffer() const -> span<char> { return {nullptr, 0}; }
1622
1623 void advance_write_buffer(size_t) {}
1624
1625 auto get() -> int {
1626 has_next_ = false;
1627 return file_base<F>::get();
1628 }
1629
1630 void unget(char c) {
1631 file_base<F>::unget(c);
1632 next_ = c;
1633 has_next_ = true;
1634 }
1635 };
1636
1637 #ifndef FMT_USE_FALLBACK_FILE
1638 # define FMT_USE_FALLBACK_FILE 0
1639 #endif
1640
1641 template <typename F,
1642 FMT_ENABLE_IF(sizeof(F::_p) != 0 && !FMT_USE_FALLBACK_FILE)>
1643 auto get_file(F* f, int) -> apple_file<F> {
1644 return f;
1645 }
1646 template <typename F,
1647 FMT_ENABLE_IF(sizeof(F::_IO_read_ptr) != 0 && !FMT_USE_FALLBACK_FILE)>
1648 inline auto get_file(F* f, int) -> glibc_file<F> {
1649 return f;
1650 }
1651
1652 inline auto get_file(FILE* f, ...) -> fallback_file<FILE> { return f; }
1653
1654 using file_ref = decltype(get_file(static_cast<FILE*>(nullptr), 0));
1655
1656 template <typename F = FILE, typename Enable = void>
1657 class file_print_buffer : public buffer<char> {
1658 public:
1659 explicit file_print_buffer(F*) : buffer(nullptr, size_t()) {}
1660 };
1661
1662 template <typename F>
1663 class file_print_buffer<F, enable_if_t<has_flockfile<F>::value>>
1664 : public buffer<char> {
1665 private:
1666 file_ref file_;
1667
1668 static void grow(buffer<char>& base, size_t) {
1669 auto& self = static_cast<file_print_buffer&>(base);
1670 self.file_.advance_write_buffer(self.size());
1671 if (self.file_.get_write_buffer().size == 0) self.file_.flush();
1672 auto buf = self.file_.get_write_buffer();
1673 FMT_ASSERT(buf.size > 0, "");
1674 self.set(buf.data, buf.size);
1675 self.clear();
1676 }
1677
1678 public:
1679 explicit file_print_buffer(F* f) : buffer(grow, size_t()), file_(f) {
1680 flockfile(f);
1681 file_.init_buffer();
1682 auto buf = file_.get_write_buffer();
1683 set(buf.data, buf.size);
1684 }
1685 ~file_print_buffer() {
1686 file_.advance_write_buffer(size());
1687 bool flush = file_.needs_flush();
1688 F* f = file_;
1689 funlockfile(f);
1690 if (flush) fflush(file_);
1691 }
1692 };
1693
1694 #if !defined(_WIN32) || defined(FMT_USE_WRITE_CONSOLE)
1695 FMT_FUNC auto write_console(int, string_view) -> bool { return false; }
1696 #else
1697 using dword = conditional_t<sizeof(long) == 4, unsigned long, unsigned>;
1698 extern "C" __declspec(dllimport) int __stdcall WriteConsoleW(
1699 void*, const void*, dword, dword*, void*);
1700
1701 FMT_FUNC bool write_console(int fd, string_view text) {
1702 auto u16 = utf8_to_utf16(text);
1703 return WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fd)), u16.c_str(),
1704 static_cast<dword>(u16.size()), nullptr, nullptr) != 0;
1705 }
1706 #endif
1707
1708 #ifdef _WIN32
1709
1710 FMT_FUNC void vprint_mojibake(std::FILE* f, string_view fmt, format_args args,
1711 bool newline) {
1712 auto buffer = memory_buffer();
1713 detail::vformat_to(buffer, fmt, args);
1714 if (newline) buffer.push_back('\n');
1715 fwrite_all(buffer.data(), buffer.size(), f);
1716 }
1717 #endif
1718
1719 FMT_FUNC void print(std::FILE* f, string_view text) {
1720 #if defined(_WIN32) && !defined(FMT_USE_WRITE_CONSOLE)
1721 int fd = _fileno(f);
1722 if (_isatty(fd)) {
1723 std::fflush(f);
1724 if (write_console(fd, text)) return;
1725 }
1726 #endif
1727 fwrite_all(text.data(), text.size(), f);
1728 }
1729 }
1730
1731 FMT_FUNC void vprint_buffered(std::FILE* f, string_view fmt, format_args args) {
1732 auto buffer = memory_buffer();
1733 detail::vformat_to(buffer, fmt, args);
1734 detail::print(f, {buffer.data(), buffer.size()});
1735 }
1736
1737 FMT_FUNC void vprint(std::FILE* f, string_view fmt, format_args args) {
1738 if (!detail::file_ref(f).is_buffered() || !detail::has_flockfile<>())
1739 return vprint_buffered(f, fmt, args);
1740 auto&& buffer = detail::file_print_buffer<>(f);
1741 return detail::vformat_to(buffer, fmt, args);
1742 }
1743
1744 FMT_FUNC void vprintln(std::FILE* f, string_view fmt, format_args args) {
1745 auto buffer = memory_buffer();
1746 detail::vformat_to(buffer, fmt, args);
1747 buffer.push_back('\n');
1748 detail::print(f, {buffer.data(), buffer.size()});
1749 }
1750
1751 FMT_FUNC void vprint(string_view fmt, format_args args) {
1752 vprint(stdout, fmt, args);
1753 }
1754
1755 namespace detail {
1756
1757 struct singleton {
1758 unsigned char upper;
1759 unsigned char lower_count;
1760 };
1761
1762 inline auto is_printable(uint16_t x, const singleton* singletons,
1763 size_t singletons_size,
1764 const unsigned char* singleton_lowers,
1765 const unsigned char* normal, size_t normal_size)
1766 -> bool {
1767 auto upper = x >> 8;
1768 auto lower_start = 0;
1769 for (size_t i = 0; i < singletons_size; ++i) {
1770 auto s = singletons[i];
1771 auto lower_end = lower_start + s.lower_count;
1772 if (upper < s.upper) break;
1773 if (upper == s.upper) {
1774 for (auto j = lower_start; j < lower_end; ++j) {
1775 if (singleton_lowers[j] == (x & 0xff)) return false;
1776 }
1777 }
1778 lower_start = lower_end;
1779 }
1780
1781 auto xsigned = static_cast<int>(x);
1782 auto current = true;
1783 for (size_t i = 0; i < normal_size; ++i) {
1784 auto v = static_cast<int>(normal[i]);
1785 auto len = (v & 0x80) != 0 ? (v & 0x7f) << 8 | normal[++i] : v;
1786 xsigned -= len;
1787 if (xsigned < 0) break;
1788 current = !current;
1789 }
1790 return current;
1791 }
1792
1793
1794 FMT_FUNC auto is_printable(uint32_t cp) -> bool {
1795 static constexpr singleton singletons0[] = {
1796 {0x00, 1}, {0x03, 5}, {0x05, 6}, {0x06, 3}, {0x07, 6}, {0x08, 8},
1797 {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13},
1798 {0x0f, 4}, {0x10, 3}, {0x12, 18}, {0x13, 9}, {0x16, 1}, {0x17, 5},
1799 {0x18, 2}, {0x19, 3}, {0x1a, 7}, {0x1c, 2}, {0x1d, 1}, {0x1f, 22},
1800 {0x20, 3}, {0x2b, 3}, {0x2c, 2}, {0x2d, 11}, {0x2e, 1}, {0x30, 3},
1801 {0x31, 2}, {0x32, 1}, {0xa7, 2}, {0xa9, 2}, {0xaa, 4}, {0xab, 8},
1802 {0xfa, 2}, {0xfb, 5}, {0xfd, 4}, {0xfe, 3}, {0xff, 9},
1803 };
1804 static constexpr unsigned char singletons0_lower[] = {
1805 0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90,
1806 0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f,
1807 0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1,
1808 0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04,
1809 0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d,
1810 0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf,
1811 0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1812 0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d,
1813 0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d,
1814 0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d,
1815 0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5,
1816 0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7,
1817 0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49,
1818 0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7,
1819 0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7,
1820 0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e,
1821 0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16,
1822 0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e,
1823 0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f,
1824 0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf,
1825 0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0,
1826 0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27,
1827 0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91,
1828 0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7,
1829 0xfe, 0xff,
1830 };
1831 static constexpr singleton singletons1[] = {
1832 {0x00, 6}, {0x01, 1}, {0x03, 1}, {0x04, 2}, {0x08, 8}, {0x09, 2},
1833 {0x0a, 5}, {0x0b, 2}, {0x0e, 4}, {0x10, 1}, {0x11, 2}, {0x12, 5},
1834 {0x13, 17}, {0x14, 1}, {0x15, 2}, {0x17, 2}, {0x19, 13}, {0x1c, 5},
1835 {0x1d, 8}, {0x24, 1}, {0x6a, 3}, {0x6b, 2}, {0xbc, 2}, {0xd1, 2},
1836 {0xd4, 12}, {0xd5, 9}, {0xd6, 2}, {0xd7, 2}, {0xda, 1}, {0xe0, 5},
1837 {0xe1, 2}, {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2}, {0xf9, 2},
1838 {0xfa, 2}, {0xfb, 1},
1839 };
1840 static constexpr unsigned char singletons1_lower[] = {
1841 0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07,
1842 0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36,
1843 0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87,
1844 0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1845 0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b,
1846 0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9,
1847 0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66,
1848 0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27,
1849 0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc,
1850 0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7,
1851 0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6,
1852 0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c,
1853 0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66,
1854 0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0,
1855 0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93,
1856 };
1857 static constexpr unsigned char normal0[] = {
1858 0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04,
1859 0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0,
1860 0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01,
1861 0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03,
1862 0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03,
1863 0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a,
1864 0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15,
1865 0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f,
1866 0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80,
1867 0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07,
1868 0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06,
1869 0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04,
1870 0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac,
1871 0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c,
1872 0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11,
1873 0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c,
1874 0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b,
1875 0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6,
1876 0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03,
1877 0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80,
1878 0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06,
1879 0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c,
1880 0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17,
1881 0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80,
1882 0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80,
1883 0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d,
1884 };
1885 static constexpr unsigned char normal1[] = {
1886 0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f,
1887 0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e,
1888 0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04,
1889 0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09,
1890 0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16,
1891 0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f,
1892 0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36,
1893 0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33,
1894 0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08,
1895 0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e,
1896 0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41,
1897 0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03,
1898 0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22,
1899 0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04,
1900 0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45,
1901 0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03,
1902 0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81,
1903 0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75,
1904 0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1,
1905 0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a,
1906 0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11,
1907 0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09,
1908 0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89,
1909 0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6,
1910 0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09,
1911 0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50,
1912 0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05,
1913 0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83,
1914 0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05,
1915 0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80,
1916 0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80,
1917 0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07,
1918 0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e,
1919 0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07,
1920 0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06,
1921 };
1922 auto lower = static_cast<uint16_t>(cp);
1923 if (cp < 0x10000) {
1924 return is_printable(lower, singletons0,
1925 sizeof(singletons0) / sizeof(*singletons0),
1926 singletons0_lower, normal0, sizeof(normal0));
1927 }
1928 if (cp < 0x20000) {
1929 return is_printable(lower, singletons1,
1930 sizeof(singletons1) / sizeof(*singletons1),
1931 singletons1_lower, normal1, sizeof(normal1));
1932 }
1933 if (0x2a6de <= cp && cp < 0x2a700) return false;
1934 if (0x2b735 <= cp && cp < 0x2b740) return false;
1935 if (0x2b81e <= cp && cp < 0x2b820) return false;
1936 if (0x2cea2 <= cp && cp < 0x2ceb0) return false;
1937 if (0x2ebe1 <= cp && cp < 0x2f800) return false;
1938 if (0x2fa1e <= cp && cp < 0x30000) return false;
1939 if (0x3134b <= cp && cp < 0xe0100) return false;
1940 if (0xe01f0 <= cp && cp < 0x110000) return false;
1941 return cp < 0x110000;
1942 }
1943
1944 }
1945
1946 FMT_END_NAMESPACE
1947
1948 #endif